summaryrefslogtreecommitdiff
path: root/core/src/main/java/coffee/liz/dyl
diff options
context:
space:
mode:
authorElizabeth Alexander Hunt <me@liz.coffee>2026-02-28 17:23:42 -0800
committerElizabeth Alexander Hunt <me@liz.coffee>2026-02-28 17:23:42 -0800
commitc491b5cb08972ffc041fa0b968810373b9ed79a3 (patch)
tree962a41f50fab58a026ab7c2c3e034fcda0733dfd /core/src/main/java/coffee/liz/dyl
parent2bc1cb77dfe8edf29ccb4064be23078cdd06038b (diff)
downloaddyl-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')
-rw-r--r--core/src/main/java/coffee/liz/dyl/FrameState.java16
-rw-r--r--core/src/main/java/coffee/liz/dyl/components/BoundingBox.java21
-rw-r--r--core/src/main/java/coffee/liz/dyl/components/Velocity.java17
-rw-r--r--core/src/main/java/coffee/liz/dyl/components/graphic/Graphic.java4
-rw-r--r--core/src/main/java/coffee/liz/dyl/components/graphic/TextureGraphic.java6
-rw-r--r--core/src/main/java/coffee/liz/dyl/config/KeyBinds.java21
-rw-r--r--core/src/main/java/coffee/liz/dyl/config/PhysicsConstants.java12
-rw-r--r--core/src/main/java/coffee/liz/dyl/entities/PlayerFactory.java26
-rw-r--r--core/src/main/java/coffee/liz/dyl/screen/GameScreen.java9
-rw-r--r--core/src/main/java/coffee/liz/dyl/systems/InputSystem.java69
-rw-r--r--core/src/main/java/coffee/liz/dyl/systems/IntegrationSystem.java32
-rw-r--r--core/src/main/java/coffee/liz/dyl/systems/RenderSystem.java14
-rw-r--r--core/src/main/java/coffee/liz/dyl/world/DylGameWorld.java25
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());
}
}