diff options
| author | Elizabeth Alexander Hunt <me@liz.coffee> | 2026-02-28 17:23:42 -0800 |
|---|---|---|
| committer | Elizabeth Alexander Hunt <me@liz.coffee> | 2026-02-28 17:23:42 -0800 |
| commit | c491b5cb08972ffc041fa0b968810373b9ed79a3 (patch) | |
| tree | 962a41f50fab58a026ab7c2c3e034fcda0733dfd /core/src/main/java/coffee/liz/dyl | |
| parent | 2bc1cb77dfe8edf29ccb4064be23078cdd06038b (diff) | |
| download | dyl-c491b5cb08972ffc041fa0b968810373b9ed79a3.tar.gz dyl-c491b5cb08972ffc041fa0b968810373b9ed79a3.zip | |
Removing parameterization from World since it was getting complicated.
Diffstat (limited to 'core/src/main/java/coffee/liz/dyl')
13 files changed, 117 insertions, 155 deletions
diff --git a/core/src/main/java/coffee/liz/dyl/FrameState.java b/core/src/main/java/coffee/liz/dyl/FrameState.java deleted file mode 100644 index 7d70cde..0000000 --- a/core/src/main/java/coffee/liz/dyl/FrameState.java +++ /dev/null @@ -1,16 +0,0 @@ -package coffee.liz.dyl; - -import coffee.liz.dyl.config.Settings; -import lombok.Builder; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import java.util.function.Predicate; - -@Builder -@Getter -@RequiredArgsConstructor -public class FrameState { - private final Settings settings; - private final Predicate<Integer> isKeyPressed; -} diff --git a/core/src/main/java/coffee/liz/dyl/components/BoundingBox.java b/core/src/main/java/coffee/liz/dyl/components/BoundingBox.java deleted file mode 100644 index 481e91e..0000000 --- a/core/src/main/java/coffee/liz/dyl/components/BoundingBox.java +++ /dev/null @@ -1,21 +0,0 @@ -package coffee.liz.dyl.components; - -import coffee.liz.ecs.math.Vec2; -import coffee.liz.ecs.model.Component; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; - -@AllArgsConstructor -@Getter -@Setter -public class BoundingBox implements Component, Comparable<BoundingBox> { - private Vec2<Float> position; - private Vec2<Integer> dimensions; - private int z; - - @Override - public int compareTo(final BoundingBox other) { - return Integer.compare(z, other.getZ()); - } -} diff --git a/core/src/main/java/coffee/liz/dyl/components/Velocity.java b/core/src/main/java/coffee/liz/dyl/components/Velocity.java deleted file mode 100644 index f31e861..0000000 --- a/core/src/main/java/coffee/liz/dyl/components/Velocity.java +++ /dev/null @@ -1,17 +0,0 @@ -package coffee.liz.dyl.components; - -import coffee.liz.ecs.math.Vec2; -import coffee.liz.ecs.math.Vec2f; -import coffee.liz.ecs.model.Component; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -public class Velocity implements Component { - private Vec2<Float> velocity = Vec2f.ZERO; -} diff --git a/core/src/main/java/coffee/liz/dyl/components/graphic/Graphic.java b/core/src/main/java/coffee/liz/dyl/components/graphic/Graphic.java index c70b382..7075755 100644 --- a/core/src/main/java/coffee/liz/dyl/components/graphic/Graphic.java +++ b/core/src/main/java/coffee/liz/dyl/components/graphic/Graphic.java @@ -1,6 +1,6 @@ package coffee.liz.dyl.components.graphic; -import coffee.liz.dyl.components.BoundingBox; +import coffee.liz.ecs.common.components.physics.BoundingBox; import coffee.liz.ecs.model.Component; import com.badlogic.gdx.graphics.g2d.Batch; @@ -9,5 +9,7 @@ public interface Graphic extends Component { return Graphic.class; } + int getZ(); + void draw(final Batch batch, final BoundingBox boundingBox); } diff --git a/core/src/main/java/coffee/liz/dyl/components/graphic/TextureGraphic.java b/core/src/main/java/coffee/liz/dyl/components/graphic/TextureGraphic.java index 6f29759..c2718b5 100644 --- a/core/src/main/java/coffee/liz/dyl/components/graphic/TextureGraphic.java +++ b/core/src/main/java/coffee/liz/dyl/components/graphic/TextureGraphic.java @@ -1,6 +1,6 @@ package coffee.liz.dyl.components.graphic; -import coffee.liz.dyl.components.BoundingBox; +import coffee.liz.ecs.common.components.physics.BoundingBox; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Batch; @@ -10,6 +10,7 @@ import lombok.Getter; @Getter @AllArgsConstructor public class TextureGraphic implements Graphic { + private int z; private Color color; private Texture texture; @@ -18,8 +19,7 @@ public class TextureGraphic implements Graphic { batch.setColor(color); batch.draw(texture, boundingBox.getPosition().getX(), boundingBox.getPosition().getY(), - 0, 0, - boundingBox.getDimensions().getX(), boundingBox.getDimensions().getY() + boundingBox.getSize().getX(), boundingBox.getSize().getY() ); } } diff --git a/core/src/main/java/coffee/liz/dyl/config/KeyBinds.java b/core/src/main/java/coffee/liz/dyl/config/KeyBinds.java index 762dc48..0b33b26 100644 --- a/core/src/main/java/coffee/liz/dyl/config/KeyBinds.java +++ b/core/src/main/java/coffee/liz/dyl/config/KeyBinds.java @@ -1,4 +1,5 @@ package coffee.liz.dyl.config; + import com.badlogic.gdx.Input; import lombok.AllArgsConstructor; import lombok.Builder; @@ -16,26 +17,24 @@ import java.util.function.Predicate; @Getter public class KeyBinds { @Builder.Default - private Set<Integer> moveUpKeys = Set.of(Input.Keys.K, Input.Keys.UP, Input.Keys.W); - @Builder.Default - private Set<Integer> moveDownKeys = Set.of(Input.Keys.J, Input.Keys.DOWN, Input.Keys.S); - @Builder.Default private Set<Integer> moveLeftKeys = Set.of(Input.Keys.H, Input.Keys.LEFT, Input.Keys.A); @Builder.Default private Set<Integer> moveRightKeys = Set.of(Input.Keys.L, Input.Keys.RIGHT, Input.Keys.D); + @Builder.Default + private Set<Integer> jumpKeys = Set.of(Input.Keys.W, Input.Keys.UP, Input.Keys.SPACE); public Set<Action> filterActiveActions(final Predicate<Integer> isDown) { final Set<Action> actions = new HashSet<>(); - Map.of(moveUpKeys, Action.MOVE_UP, moveDownKeys, Action.MOVE_DOWN, moveRightKeys, Action.MOVE_RIGHT, - moveLeftKeys, Action.MOVE_LEFT).forEach((keys, action) -> { - if (keys.stream().anyMatch(isDown)) { - actions.add(action); - } - }); + Map.of(moveLeftKeys, Action.MOVE_LEFT, moveRightKeys, Action.MOVE_RIGHT, jumpKeys, Action.JUMP) + .forEach((keys, action) -> { + if (keys.stream().anyMatch(isDown)) { + actions.add(action); + } + }); return actions; } public enum Action { - MOVE_UP, MOVE_LEFT, MOVE_DOWN, MOVE_RIGHT; + MOVE_LEFT, MOVE_RIGHT, JUMP; } } diff --git a/core/src/main/java/coffee/liz/dyl/config/PhysicsConstants.java b/core/src/main/java/coffee/liz/dyl/config/PhysicsConstants.java new file mode 100644 index 0000000..b0b1a31 --- /dev/null +++ b/core/src/main/java/coffee/liz/dyl/config/PhysicsConstants.java @@ -0,0 +1,12 @@ +package coffee.liz.dyl.config; + +public final class PhysicsConstants { + public static final float GRAVITY = 9.8f; + public static final float MOVE_SPEED = 5.0f; + public static final float JUMP_INITIAL_VEL = 8.0f; + public static final float JUMP_ACC = 15.0f; + public static final long MAX_JUMP_MS = 150L; + + private PhysicsConstants() { + } +} diff --git a/core/src/main/java/coffee/liz/dyl/entities/PlayerFactory.java b/core/src/main/java/coffee/liz/dyl/entities/PlayerFactory.java index 54c5df7..a982bb9 100644 --- a/core/src/main/java/coffee/liz/dyl/entities/PlayerFactory.java +++ b/core/src/main/java/coffee/liz/dyl/entities/PlayerFactory.java @@ -1,8 +1,15 @@ package coffee.liz.dyl.entities; import coffee.liz.dyl.components.Controllable; -import coffee.liz.dyl.components.Velocity; import coffee.liz.dyl.components.graphic.TextureGraphic; +import coffee.liz.ecs.common.components.physics.BoundingBox; +import coffee.liz.ecs.common.components.physics.Collidable; +import coffee.liz.ecs.common.components.physics.Forces; +import coffee.liz.ecs.common.components.physics.Gravity; +import coffee.liz.ecs.common.components.physics.Jump; +import coffee.liz.ecs.common.components.physics.Mass; +import coffee.liz.ecs.common.components.physics.Velocity; +import coffee.liz.ecs.math.Vec2f; import coffee.liz.ecs.model.Entity; import coffee.liz.ecs.model.World; import com.badlogic.gdx.Gdx; @@ -15,16 +22,23 @@ public class PlayerFactory { private static final int PENGUIN_FRAMES_Y = 4; private static final int PENGUIN_FRAMES_X = 8; private static final FileHandle FILE = Gdx.files.internal("player.png"); - private static Texture texture = new Texture(FILE);; + private static Texture texture = new Texture(FILE); - public static Entity addTo(final World<?> world) { + public static Entity addTo(final World world) { final TextureRegion[][] tmp = TextureRegion.split(texture, texture.getWidth() / PENGUIN_FRAMES_X, texture.getHeight() / PENGUIN_FRAMES_Y); return world.createEntity() - .add(new TextureGraphic(Color.PINK, tmp[0][0].getTexture())) + .add(new TextureGraphic(0, Color.PINK, tmp[0][0].getTexture())) .add(new Controllable()) - .add(new Velocity()); + .add(new BoundingBox(new Vec2f(2f, 2f), new Vec2f(1f, 1f))) + .add(new Velocity(Vec2f.ZERO)) + .add(new Mass(1f)) + .add(new Forces()) + .add(new Gravity(20f)) + .add(new Jump(false, 0L)) + .add(new Collidable()); } - private PlayerFactory() { } + private PlayerFactory() { + } } diff --git a/core/src/main/java/coffee/liz/dyl/screen/GameScreen.java b/core/src/main/java/coffee/liz/dyl/screen/GameScreen.java index 39017c5..0797e3e 100644 --- a/core/src/main/java/coffee/liz/dyl/screen/GameScreen.java +++ b/core/src/main/java/coffee/liz/dyl/screen/GameScreen.java @@ -1,9 +1,7 @@ package coffee.liz.dyl.screen; import coffee.liz.dyl.DylGame; -import coffee.liz.dyl.FrameState; import coffee.liz.dyl.world.DylGameWorld; -import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Screen; import lombok.RequiredArgsConstructor; @@ -13,20 +11,15 @@ public class GameScreen implements Screen { private final DylGame game; private DylGameWorld dylGameWorld; - private FrameState frameState; @Override public void show() { dylGameWorld = new DylGameWorld(game); - frameState = FrameState.builder() - .settings(game.getSettings()) - .isKeyPressed(Gdx.input::isKeyPressed) - .build(); } @Override public void render(final float delta) { - dylGameWorld.update(frameState, Math.min(delta, MAX_DELTA_SECONDS)); + dylGameWorld.update(Math.min(delta, MAX_DELTA_SECONDS)); } @Override diff --git a/core/src/main/java/coffee/liz/dyl/systems/InputSystem.java b/core/src/main/java/coffee/liz/dyl/systems/InputSystem.java index 1519b3e..d5acbaf 100644 --- a/core/src/main/java/coffee/liz/dyl/systems/InputSystem.java +++ b/core/src/main/java/coffee/liz/dyl/systems/InputSystem.java @@ -1,42 +1,65 @@ package coffee.liz.dyl.systems; -import coffee.liz.dyl.FrameState; -import coffee.liz.dyl.components.BoundingBox; -import coffee.liz.dyl.components.Velocity; +import coffee.liz.dyl.components.Controllable; import coffee.liz.dyl.config.KeyBinds; -import coffee.liz.ecs.math.Vec2; +import coffee.liz.ecs.common.components.physics.Force; +import coffee.liz.ecs.common.components.physics.Forces; +import coffee.liz.ecs.common.components.physics.Jump; +import coffee.liz.ecs.common.components.physics.Mass; +import coffee.liz.ecs.common.components.physics.Velocity; import coffee.liz.ecs.math.Vec2f; -import coffee.liz.ecs.math.Vec2i; import coffee.liz.ecs.model.System; import coffee.liz.ecs.model.World; +import lombok.RequiredArgsConstructor; +import java.time.Instant; import java.util.Collection; -import java.util.Map; import java.util.Set; +import java.util.function.Supplier; + +import static coffee.liz.dyl.config.PhysicsConstants.JUMP_ACC; +import static coffee.liz.dyl.config.PhysicsConstants.JUMP_INITIAL_VEL; +import static coffee.liz.dyl.config.PhysicsConstants.MAX_JUMP_MS; +import static coffee.liz.dyl.config.PhysicsConstants.MOVE_SPEED; + +@RequiredArgsConstructor +public class InputSystem implements System { + private final Supplier<Set<KeyBinds.Action>> activeActions; -public class InputSystem implements System<FrameState> { @Override - public Collection<Class<? extends System<FrameState>>> getDependencies() { + public Collection<Class<? extends System>> getDependencies() { return Set.of(); } @Override - public void update(final World<FrameState> world, final FrameState state, final float deltaSeconds) { - final Set<KeyBinds.Action> currentlyActive = state.getSettings().getKeyBinds() - .filterActiveActions(state.getIsKeyPressed()); + public void update(final World world, final float deltaSeconds) { + final Set<KeyBinds.Action> actions = activeActions.get(); - final Vec2<Float> momentum = currentlyActive.stream().map(movementVectors::get) - .reduce(Vec2::plus) - .orElse(Vec2f.ZERO); + world.queryable().allOf(Controllable.class, Velocity.class).forEach(entity -> { + final Velocity velocity = entity.get(Velocity.class); - world.queryable().allOf(Velocity.class, BoundingBox.class) - .forEach(e -> e.get(Velocity.class).setVelocity(momentum)); - } + float dx = 0f; + if (actions.contains(KeyBinds.Action.MOVE_LEFT)) dx = -MOVE_SPEED; + if (actions.contains(KeyBinds.Action.MOVE_RIGHT)) dx = MOVE_SPEED; + + float newDy = velocity.getVelocity().getY(); - private static Map<KeyBinds.Action, Vec2<Float>> movementVectors = Map.of( - KeyBinds.Action.MOVE_UP, Vec2i.NORTH.floatValue(), - KeyBinds.Action.MOVE_DOWN, Vec2i.SOUTH.floatValue(), - KeyBinds.Action.MOVE_LEFT, Vec2i.WEST.floatValue(), - KeyBinds.Action.MOVE_RIGHT, Vec2i.EAST.floatValue() - ); + if (entity.has(Jump.class) && entity.has(Mass.class) && entity.has(Forces.class)) { + final Jump jump = entity.get(Jump.class); + final Mass mass = entity.get(Mass.class); + + if (actions.contains(KeyBinds.Action.JUMP)) { + if (jump.isCanJump()) { + newDy = JUMP_INITIAL_VEL; + jump.setCanJump(false); + jump.setJumpStartMs(Instant.now().toEpochMilli()); + } else if (Instant.now().toEpochMilli() - jump.getJumpStartMs() < MAX_JUMP_MS) { + entity.get(Forces.class).add(new Force(new Vec2f(0f, mass.getMass() * JUMP_ACC))); + } + } + } + + velocity.setVelocity(new Vec2f(dx, newDy)); + }); + } } diff --git a/core/src/main/java/coffee/liz/dyl/systems/IntegrationSystem.java b/core/src/main/java/coffee/liz/dyl/systems/IntegrationSystem.java deleted file mode 100644 index cd7d7b1..0000000 --- a/core/src/main/java/coffee/liz/dyl/systems/IntegrationSystem.java +++ /dev/null @@ -1,32 +0,0 @@ -package coffee.liz.dyl.systems; - -import coffee.liz.dyl.FrameState; -import coffee.liz.dyl.components.BoundingBox; -import coffee.liz.dyl.components.Velocity; -import coffee.liz.ecs.math.Vec2; -import coffee.liz.ecs.model.System; -import coffee.liz.ecs.model.World; -import lombok.extern.log4j.Log4j2; - -import java.util.Collection; -import java.util.List; - -@Log4j2 -public class IntegrationSystem implements System<FrameState> { - @Override - public Collection<Class<? extends System<FrameState>>> getDependencies() { - return List.of(InputSystem.class); - } - - @Override - public void update(final World<FrameState> world, final FrameState state, final float deltaSeconds) { - world.queryable().allOf(Velocity.class, BoundingBox.class) - .forEach(e -> { - final Vec2<Float> velocity = e.get(Velocity.class).getVelocity(); - final BoundingBox box = e.get(BoundingBox.class); - final Vec2<Float> position = box.getPosition() - .plus(velocity.scale(deltaSeconds, deltaSeconds)); - box.setPosition(position); - }); - } -} diff --git a/core/src/main/java/coffee/liz/dyl/systems/RenderSystem.java b/core/src/main/java/coffee/liz/dyl/systems/RenderSystem.java index 86c18fd..15e1f30 100644 --- a/core/src/main/java/coffee/liz/dyl/systems/RenderSystem.java +++ b/core/src/main/java/coffee/liz/dyl/systems/RenderSystem.java @@ -1,8 +1,8 @@ package coffee.liz.dyl.systems; -import coffee.liz.dyl.FrameState; import coffee.liz.dyl.components.graphic.Graphic; -import coffee.liz.dyl.components.BoundingBox; +import coffee.liz.ecs.common.components.physics.BoundingBox; +import coffee.liz.ecs.common.systems.physics.CollisionSystem; import coffee.liz.ecs.model.System; import coffee.liz.ecs.model.World; import com.badlogic.gdx.graphics.Color; @@ -14,7 +14,7 @@ import java.util.Collection; import java.util.Comparator; import java.util.Set; -public class RenderSystem implements System<FrameState> { +public class RenderSystem implements System { private final Batch batch; private final OrthographicCamera camera; private final Viewport viewport; @@ -26,12 +26,12 @@ public class RenderSystem implements System<FrameState> { } @Override - public Collection<Class<? extends System<FrameState>>> getDependencies() { - return Set.of(IntegrationSystem.class); + public Collection<Class<? extends System>> getDependencies() { + return Set.of(CollisionSystem.class); } @Override - public void update(final World<FrameState> world, final FrameState state, final float deltaSeconds) { + public void update(final World world, final float deltaSeconds) { viewport.apply(); camera.update(); @@ -40,7 +40,7 @@ public class RenderSystem implements System<FrameState> { batch.setColor(Color.WHITE); world.queryable().allOf(BoundingBox.class, Graphic.class).stream() - .sorted(Comparator.comparing(e -> e.get(BoundingBox.class))) + .sorted(Comparator.comparingDouble(e -> e.get(Graphic.class).getZ())) .forEach(e -> { final BoundingBox boundingBox = e.get(BoundingBox.class); final Graphic graphic = e.get(Graphic.class); diff --git a/core/src/main/java/coffee/liz/dyl/world/DylGameWorld.java b/core/src/main/java/coffee/liz/dyl/world/DylGameWorld.java index a52ea0f..7f1cb62 100644 --- a/core/src/main/java/coffee/liz/dyl/world/DylGameWorld.java +++ b/core/src/main/java/coffee/liz/dyl/world/DylGameWorld.java @@ -1,26 +1,31 @@ package coffee.liz.dyl.world; import coffee.liz.dyl.DylGame; -import coffee.liz.dyl.FrameState; -import coffee.liz.dyl.components.BoundingBox; +import coffee.liz.dyl.config.PhysicsConstants; import coffee.liz.dyl.entities.PlayerFactory; import coffee.liz.dyl.systems.InputSystem; -import coffee.liz.dyl.systems.IntegrationSystem; import coffee.liz.dyl.systems.RenderSystem; import coffee.liz.ecs.DAGWorld; +import coffee.liz.ecs.common.components.physics.BoundingBox; +import coffee.liz.ecs.common.components.physics.TopCollidable; +import coffee.liz.ecs.common.systems.physics.CollisionSystem; +import coffee.liz.ecs.common.systems.physics.ForceReductionSystem; +import coffee.liz.ecs.common.systems.physics.IntegrationSystem; import coffee.liz.ecs.math.Vec2f; -import coffee.liz.ecs.math.Vec2i; +import com.badlogic.gdx.Gdx; -public class DylGameWorld extends DAGWorld<FrameState> { +public class DylGameWorld extends DAGWorld { public DylGameWorld(final DylGame game) { super( - new InputSystem(), + new InputSystem(() -> game.getSettings().getKeyBinds().filterActiveActions(Gdx.input::isKeyPressed)), + new ForceReductionSystem(PhysicsConstants.GRAVITY), new IntegrationSystem(), + new CollisionSystem(PhysicsConstants.GRAVITY), new RenderSystem(game.getBatch(), game.getViewport()) ); - for (int i = 0; i < 2_000; i++) { - PlayerFactory.addTo(this) - .add(new BoundingBox(new Vec2f(i / 200f, i/ 200f), new Vec2i(1, 1), 1)); - } + PlayerFactory.addTo(this); + createEntity() + .add(new BoundingBox(new Vec2f(-50f, -1f), new Vec2f(200f, 1f))) + .add(new TopCollidable()); } } |
