From 0823e1b0924382410665552e6381806bd9835ce2 Mon Sep 17 00:00:00 2001 From: Dmitri Morozov Date: Mon, 5 Feb 2024 19:12:40 +0100 Subject: Add mass, damping and max velocity attributes to a body --- .../snoopdesigns/endless/physics/PhysicalBody.java | 17 +++++++++- .../endless/renderer/DebugRenderer.java | 12 +++---- .../endless/world/ObjectsRenderer.java | 7 ++-- .../endless/world/player/PlayerShip.java | 39 +++++++++++++++------- .../endless/world/ship/SteerableEnemyShip.java | 16 ++++++++- 5 files changed, 67 insertions(+), 24 deletions(-) (limited to 'core/src/org/snoopdesigns') diff --git a/core/src/org/snoopdesigns/endless/physics/PhysicalBody.java b/core/src/org/snoopdesigns/endless/physics/PhysicalBody.java index 23ede8d..31204a9 100644 --- a/core/src/org/snoopdesigns/endless/physics/PhysicalBody.java +++ b/core/src/org/snoopdesigns/endless/physics/PhysicalBody.java @@ -5,6 +5,7 @@ import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.BodyDef; import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; import com.badlogic.gdx.physics.box2d.FixtureDef; +import com.badlogic.gdx.physics.box2d.MassData; import org.snoopdesigns.endless.context.Context; public abstract class PhysicalBody { @@ -13,7 +14,9 @@ public abstract class PhysicalBody { public abstract BodyType getBodyType(); public abstract FixtureDef getFixture(); - + public abstract float getMass(); + public abstract float getLinearDamping(); + public abstract float getMaxVelocity(); public Vector2 getInitialPosition() { return new Vector2(0, 0); } @@ -24,6 +27,18 @@ public abstract class PhysicalBody { bodyDef.position.set(getInitialPosition()); body = Context.getInstance().getWorldContext().getWorld().createBody(bodyDef); body.createFixture(getFixture()); + + final MassData massData = new MassData(); + massData.mass = getMass(); + getBody().setMassData(massData); + + getBody().setLinearDamping(getLinearDamping()); + } + + public void limitVelocity() { + if (getBody().getLinearVelocity().len() > getMaxVelocity()) { + getBody().setLinearVelocity(getBody().getLinearVelocity().limit(getMaxVelocity())); + } } public Body getBody() { diff --git a/core/src/org/snoopdesigns/endless/renderer/DebugRenderer.java b/core/src/org/snoopdesigns/endless/renderer/DebugRenderer.java index f31336b..cbf8a07 100644 --- a/core/src/org/snoopdesigns/endless/renderer/DebugRenderer.java +++ b/core/src/org/snoopdesigns/endless/renderer/DebugRenderer.java @@ -24,12 +24,12 @@ public class DebugRenderer implements Renderer { batch.begin(); final String debugText = String.format(""" window size %d x %d - viewport %f %f - zoom %f - position %f %f - angle %f - speed %f - velocity %f %f + viewport %.1f %.1f + zoom %.1f + position %.1f %.1f + angle %.1f + speed %.1f m/s + velocity %.1f %.1f """, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), diff --git a/core/src/org/snoopdesigns/endless/world/ObjectsRenderer.java b/core/src/org/snoopdesigns/endless/world/ObjectsRenderer.java index f97f05c..628b63a 100644 --- a/core/src/org/snoopdesigns/endless/world/ObjectsRenderer.java +++ b/core/src/org/snoopdesigns/endless/world/ObjectsRenderer.java @@ -6,7 +6,6 @@ import java.util.List; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import org.snoopdesigns.endless.context.Context; import org.snoopdesigns.endless.renderer.Renderer; -import org.snoopdesigns.endless.world.ship.SteerableEnemyShip; public class ObjectsRenderer implements Renderer { @@ -18,9 +17,9 @@ public class ObjectsRenderer implements Renderer { public void create() { batch = new SpriteBatch(); renderables.add(Context.getInstance().getPlayerShip()); - renderables.add(new SteerableEnemyShip()); - renderables.add(new SteerableEnemyShip()); - renderables.add(new SteerableEnemyShip()); + //renderables.add(new SteerableEnemyShip()); + //renderables.add(new SteerableEnemyShip()); + //renderables.add(new SteerableEnemyShip()); renderables.forEach(Renderable::create); } diff --git a/core/src/org/snoopdesigns/endless/world/player/PlayerShip.java b/core/src/org/snoopdesigns/endless/world/player/PlayerShip.java index 3670d6f..1393d02 100644 --- a/core/src/org/snoopdesigns/endless/world/player/PlayerShip.java +++ b/core/src/org/snoopdesigns/endless/world/player/PlayerShip.java @@ -32,26 +32,47 @@ public final class PlayerShip extends PhysicalBody implements Controllable, Rend @Override public FixtureDef getFixture() { final CircleShape circle = new CircleShape(); - circle.setRadius(7f); + circle.setRadius(5f); final FixtureDef fixtureDef = new FixtureDef(); fixtureDef.shape = circle; - fixtureDef.density = 1f; // weight of body return fixtureDef; } + @Override + public float getMass() { + return 10000; // 10 tons + } + + @Override + public float getLinearDamping() { + return 1.5f; + } + + @Override + public float getMaxVelocity() { + return 100f; // meters per second + } + @Override public void create() { initBody(); final Texture texture = new Texture(Gdx.files.internal("ship.png")); sprite = new Sprite(texture); - sprite.setScale(0.1f); + + final float expectedSizeInMeters = 15f; + final Vector2 scale = new Vector2( + expectedSizeInMeters / sprite.getHeight(), + expectedSizeInMeters / sprite.getWidth()); + + sprite.setScale(scale.x, scale.y); } @Override public void render(SpriteBatch batch) { handleInput(); handleMousePosition(); + final float x = getBody().getPosition().x; final float y = getBody().getPosition().y; Context.getInstance().getCameraContext().getPosition().set(x, y); @@ -73,6 +94,8 @@ public final class PlayerShip extends PhysicalBody implements Controllable, Rend sprite.draw(batch); effects.forEach(effect -> effect.draw(batch, Gdx.graphics.getDeltaTime())); + + limitVelocity(); } @Override @@ -104,22 +127,14 @@ public final class PlayerShip extends PhysicalBody implements Controllable, Rend } private void speedUp() { - final float force = 100000.0f; + final float force = getBody().getMass() * 200; // force 200x times more than self mass final Vector2 impulse = new Vector2(force, 0).rotateRad(getBody().getAngle()); getBody().applyForceToCenter(impulse, true); } - private void slowDown() { - getBody().setLinearVelocity( - getBody().getLinearVelocity().x * 0.98f, - getBody().getLinearVelocity().y * 0.98f); - } - private void handleInput() { if (Gdx.input.isKeyPressed(Keys.SPACE)) { speedUp(); - } else { - slowDown(); } } diff --git a/core/src/org/snoopdesigns/endless/world/ship/SteerableEnemyShip.java b/core/src/org/snoopdesigns/endless/world/ship/SteerableEnemyShip.java index 4c24408..40db5d4 100644 --- a/core/src/org/snoopdesigns/endless/world/ship/SteerableEnemyShip.java +++ b/core/src/org/snoopdesigns/endless/world/ship/SteerableEnemyShip.java @@ -41,10 +41,24 @@ public class SteerableEnemyShip extends SteerablePhysicalBody implements Rendera circle.setRadius(7f); final FixtureDef fixtureDef = new FixtureDef(); fixtureDef.shape = circle; - fixtureDef.density = 1f; return fixtureDef; } + @Override + public float getMass() { + return 10000; + } + + @Override + public float getLinearDamping() { + return 1.5f; + } + + @Override + public float getMaxVelocity() { + return 50; + } + @Override public Vector2 getInitialPosition() { return new Vector2(MathUtils.random(50), MathUtils.random(50)); -- cgit v1.2.3