summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitri Morozov <snoopdesigns@gmail.com>2024-02-05 19:12:40 +0100
committerue86388 <dmitrii.morozov@sbb.ch>2024-02-05 19:12:40 +0100
commit0823e1b0924382410665552e6381806bd9835ce2 (patch)
treed2ae6e4e85f801ccdf9bc290f3449e2a6199d60a
parent684552e8cebfa0d80b9ceb014d6094327c6ad0a6 (diff)
Add mass, damping and max velocity attributes to a body
-rw-r--r--core/src/org/snoopdesigns/endless/physics/PhysicalBody.java17
-rw-r--r--core/src/org/snoopdesigns/endless/renderer/DebugRenderer.java12
-rw-r--r--core/src/org/snoopdesigns/endless/world/ObjectsRenderer.java7
-rw-r--r--core/src/org/snoopdesigns/endless/world/player/PlayerShip.java39
-rw-r--r--core/src/org/snoopdesigns/endless/world/ship/SteerableEnemyShip.java16
5 files changed, 67 insertions, 24 deletions
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,11 +41,25 @@ 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));
}