diff options
| author | Elizabeth Alexander Hunt <me@liz.coffee> | 2026-03-01 12:54:31 -0800 |
|---|---|---|
| committer | Elizabeth Alexander Hunt <me@liz.coffee> | 2026-03-01 12:54:47 -0800 |
| commit | 242b32050feff1d7f047e52d46daadd3ec682c14 (patch) | |
| tree | 6207a3f350946ae3b1c2764b2bb9321473f6bfaa /core/src/main/java/coffee/liz/ecs | |
| parent | c491b5cb08972ffc041fa0b968810373b9ed79a3 (diff) | |
| download | dyl-242b32050feff1d7f047e52d46daadd3ec682c14.tar.gz dyl-242b32050feff1d7f047e52d46daadd3ec682c14.zip | |
Adding animations n stuff.
Diffstat (limited to 'core/src/main/java/coffee/liz/ecs')
14 files changed, 13 insertions, 380 deletions
diff --git a/core/src/main/java/coffee/liz/ecs/common/components/physics/BoundingBox.java b/core/src/main/java/coffee/liz/ecs/common/components/physics/BoundingBox.java deleted file mode 100644 index 7a31cae..0000000 --- a/core/src/main/java/coffee/liz/ecs/common/components/physics/BoundingBox.java +++ /dev/null @@ -1,34 +0,0 @@ -package coffee.liz.ecs.common.components.physics; - -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 { - private Vec2<Float> position; - private Vec2<Float> size; - - public float getTop() { - return position.getY() + size.getY(); - } - - public float getRight() { - return position.getX() + size.getX(); - } - - public boolean isCollidingWith(final BoundingBox other) { - return getRight() > other.getPosition().getX() - && position.getX() < other.getRight() - && getTop() > other.getPosition().getY() - && position.getY() < other.getTop(); - } - - public boolean isAbove(final BoundingBox other) { - return position.getY() >= other.getTop(); - } -} diff --git a/core/src/main/java/coffee/liz/ecs/common/components/physics/Collidable.java b/core/src/main/java/coffee/liz/ecs/common/components/physics/Collidable.java deleted file mode 100644 index 166428a..0000000 --- a/core/src/main/java/coffee/liz/ecs/common/components/physics/Collidable.java +++ /dev/null @@ -1,6 +0,0 @@ -package coffee.liz.ecs.common.components.physics; - -import coffee.liz.ecs.model.Component; - -public class Collidable implements Component { -} diff --git a/core/src/main/java/coffee/liz/ecs/common/components/physics/Force.java b/core/src/main/java/coffee/liz/ecs/common/components/physics/Force.java deleted file mode 100644 index 7d5dab1..0000000 --- a/core/src/main/java/coffee/liz/ecs/common/components/physics/Force.java +++ /dev/null @@ -1,12 +0,0 @@ -package coffee.liz.ecs.common.components.physics; - -import coffee.liz.ecs.math.Vec2; -import coffee.liz.ecs.model.Component; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@Getter -public class Force implements Component { - private final Vec2<Float> force; -} diff --git a/core/src/main/java/coffee/liz/ecs/common/components/physics/Forces.java b/core/src/main/java/coffee/liz/ecs/common/components/physics/Forces.java deleted file mode 100644 index f6c9ee8..0000000 --- a/core/src/main/java/coffee/liz/ecs/common/components/physics/Forces.java +++ /dev/null @@ -1,20 +0,0 @@ -package coffee.liz.ecs.common.components.physics; - -import coffee.liz.ecs.model.Component; -import lombok.Getter; - -import java.util.ArrayList; -import java.util.List; - -@Getter -public class Forces implements Component { - private final List<Force> forces = new ArrayList<>(); - - public void add(final Force force) { - forces.add(force); - } - - public void clear() { - forces.clear(); - } -} diff --git a/core/src/main/java/coffee/liz/ecs/common/components/physics/Gravity.java b/core/src/main/java/coffee/liz/ecs/common/components/physics/Gravity.java deleted file mode 100644 index 44d5caf..0000000 --- a/core/src/main/java/coffee/liz/ecs/common/components/physics/Gravity.java +++ /dev/null @@ -1,11 +0,0 @@ -package coffee.liz.ecs.common.components.physics; - -import coffee.liz.ecs.model.Component; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@Getter -public class Gravity implements Component { - private final float terminalVelocity; -} diff --git a/core/src/main/java/coffee/liz/ecs/common/components/physics/Jump.java b/core/src/main/java/coffee/liz/ecs/common/components/physics/Jump.java deleted file mode 100644 index 5224b32..0000000 --- a/core/src/main/java/coffee/liz/ecs/common/components/physics/Jump.java +++ /dev/null @@ -1,14 +0,0 @@ -package coffee.liz.ecs.common.components.physics; - -import coffee.liz.ecs.model.Component; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; - -@AllArgsConstructor -@Getter -@Setter -public class Jump implements Component { - private boolean canJump; - private long jumpStartMs; -} diff --git a/core/src/main/java/coffee/liz/ecs/common/components/physics/Mass.java b/core/src/main/java/coffee/liz/ecs/common/components/physics/Mass.java deleted file mode 100644 index f38ccc0..0000000 --- a/core/src/main/java/coffee/liz/ecs/common/components/physics/Mass.java +++ /dev/null @@ -1,11 +0,0 @@ -package coffee.liz.ecs.common.components.physics; - -import coffee.liz.ecs.model.Component; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@Getter -public class Mass implements Component { - private final float mass; -} diff --git a/core/src/main/java/coffee/liz/ecs/common/components/physics/TopCollidable.java b/core/src/main/java/coffee/liz/ecs/common/components/physics/TopCollidable.java deleted file mode 100644 index 76185bd..0000000 --- a/core/src/main/java/coffee/liz/ecs/common/components/physics/TopCollidable.java +++ /dev/null @@ -1,6 +0,0 @@ -package coffee.liz.ecs.common.components.physics; - -import coffee.liz.ecs.model.Component; - -public class TopCollidable implements Component { -} diff --git a/core/src/main/java/coffee/liz/ecs/common/components/physics/Velocity.java b/core/src/main/java/coffee/liz/ecs/common/components/physics/Velocity.java deleted file mode 100644 index 9b6a36b..0000000 --- a/core/src/main/java/coffee/liz/ecs/common/components/physics/Velocity.java +++ /dev/null @@ -1,14 +0,0 @@ -package coffee.liz.ecs.common.components.physics; - -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 Velocity implements Component { - private Vec2<Float> velocity; -} diff --git a/core/src/main/java/coffee/liz/ecs/common/systems/physics/CollisionGrid.java b/core/src/main/java/coffee/liz/ecs/common/systems/physics/CollisionGrid.java deleted file mode 100644 index 94202b4..0000000 --- a/core/src/main/java/coffee/liz/ecs/common/systems/physics/CollisionGrid.java +++ /dev/null @@ -1,65 +0,0 @@ -package coffee.liz.ecs.common.systems.physics; - -import coffee.liz.ecs.common.components.physics.BoundingBox; -import coffee.liz.ecs.math.Vec2; -import coffee.liz.ecs.math.Vec2i; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -public class CollisionGrid { - private final Map<Vec2i, Set<Integer>> cells = new HashMap<>(); - private Vec2<Float> origin; - private Vec2<Float> cellSize; - - public void setOrigin(final Vec2<Float> origin) { - this.origin = origin; - } - - public void setCellSize(final Vec2<Float> cellSize) { - this.cellSize = cellSize; - } - - public void clear() { - cells.clear(); - } - - public void insert(final int entityId, final BoundingBox bb) { - final int minCx = cellX(bb.getPosition().getX()); - final int minCy = cellY(bb.getPosition().getY()); - final int maxCx = cellX(bb.getRight()); - final int maxCy = cellY(bb.getTop()); - for (int cx = minCx; cx <= maxCx; cx++) { - for (int cy = minCy; cy <= maxCy; cy++) { - cells.computeIfAbsent(new Vec2i(cx, cy), _ -> new HashSet<>()).add(entityId); - } - } - } - - public Set<Integer> getNeighborIds(final BoundingBox bb) { - final Set<Integer> neighbors = new HashSet<>(); - final int minCx = cellX(bb.getPosition().getX()); - final int minCy = cellY(bb.getPosition().getY()); - final int maxCx = cellX(bb.getRight()); - final int maxCy = cellY(bb.getTop()); - for (int cx = minCx; cx <= maxCx; cx++) { - for (int cy = minCy; cy <= maxCy; cy++) { - final Set<Integer> cell = cells.get(new Vec2i(cx, cy)); - if (cell != null) { - neighbors.addAll(cell); - } - } - } - return neighbors; - } - - private int cellX(final float x) { - return (int) Math.floor((x - origin.getX()) / cellSize.getX()); - } - - private int cellY(final float y) { - return (int) Math.floor((y - origin.getY()) / cellSize.getY()); - } -} diff --git a/core/src/main/java/coffee/liz/ecs/common/systems/physics/CollisionSystem.java b/core/src/main/java/coffee/liz/ecs/common/systems/physics/CollisionSystem.java deleted file mode 100644 index 14f0a2b..0000000 --- a/core/src/main/java/coffee/liz/ecs/common/systems/physics/CollisionSystem.java +++ /dev/null @@ -1,107 +0,0 @@ -package coffee.liz.ecs.common.systems.physics; - -import coffee.liz.ecs.common.components.physics.BoundingBox; -import coffee.liz.ecs.common.components.physics.Collidable; -import coffee.liz.ecs.common.components.physics.Force; -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.TopCollidable; -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.Entity; -import coffee.liz.ecs.model.System; -import coffee.liz.ecs.model.World; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.RequiredArgsConstructor; - -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -@RequiredArgsConstructor -@AllArgsConstructor -public class CollisionSystem implements System { - private final float gravity; - private float cellSize = 64f; - private final CollisionGrid grid = new CollisionGrid(); - - @Override - public Collection<Class<? extends System>> getDependencies() { - return Set.of(IntegrationSystem.class); - } - - @Override - public void update(final World world, final float deltaSeconds) { - final Set<Entity> collidableEntities = world.queryable().allOf(BoundingBox.class, Collidable.class); - final Set<Entity> surfaceEntities = world.queryable().allOf(BoundingBox.class, TopCollidable.class); - - if (collidableEntities.isEmpty() || surfaceEntities.isEmpty()) { - return; - } - - final Map<Integer, Entity> entityMap = new HashMap<>(); - collidableEntities.forEach(e -> entityMap.put(e.getId(), e)); - surfaceEntities.forEach(e -> entityMap.put(e.getId(), e)); - - float minX = Float.MAX_VALUE, minY = Float.MAX_VALUE; - for (final Entity e : entityMap.values()) { - final BoundingBox bb = e.get(BoundingBox.class); - minX = Math.min(minX, bb.getPosition().getX()); - minY = Math.min(minY, bb.getPosition().getY()); - } - - grid.clear(); - grid.setOrigin(new Vec2f(minX, minY)); - grid.setCellSize(new Vec2f(cellSize, cellSize)); - entityMap.forEach((id, e) -> grid.insert(id, e.get(BoundingBox.class))); - - final Set<Vec2i> checkedPairs = new HashSet<>(); - - for (final Entity entityA : collidableEntities) { - if (!entityA.has(Velocity.class)) { - continue; - } - final BoundingBox bbA = entityA.get(BoundingBox.class); - final Velocity velocity = entityA.get(Velocity.class); - - for (final int idB : grid.getNeighborIds(bbA)) { - final int idA = entityA.getId(); - if (idB == idA) { - continue; - } - if (!checkedPairs.add(new Vec2i(Math.min(idA, idB), Math.max(idA, idB)))) { - continue; - } - - final Entity entityB = entityMap.get(idB); - if (entityB == null || !entityB.has(TopCollidable.class)) { - continue; - } - - final BoundingBox bbB = entityB.get(BoundingBox.class); - if (!bbA.isCollidingWith(bbB)) { - continue; - } - if (velocity.getVelocity().getY() > 0 || bbA.isAbove(bbB)) { - continue; - } - - bbA.setPosition(new Vec2f(bbA.getPosition().getX(), bbB.getTop())); - velocity.setVelocity(new Vec2f(velocity.getVelocity().getX(), 0f)); - - if (entityA.has(Jump.class)) { - entityA.get(Jump.class).setCanJump(true); - } - if (entityA.has(Gravity.class) && entityA.has(Forces.class) && entityA.has(Mass.class)) { - entityA.get(Forces.class).add(new Force(new Vec2f(0f, entityA.get(Mass.class).getMass() * gravity))); - } - } - } - } -} diff --git a/core/src/main/java/coffee/liz/ecs/common/systems/physics/ForceReductionSystem.java b/core/src/main/java/coffee/liz/ecs/common/systems/physics/ForceReductionSystem.java deleted file mode 100644 index 4a51ba8..0000000 --- a/core/src/main/java/coffee/liz/ecs/common/systems/physics/ForceReductionSystem.java +++ /dev/null @@ -1,55 +0,0 @@ -package coffee.liz.ecs.common.systems.physics; - -import coffee.liz.ecs.common.components.physics.Force; -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.Vec2; -import coffee.liz.ecs.math.Vec2f; -import coffee.liz.ecs.model.System; -import coffee.liz.ecs.model.World; -import lombok.RequiredArgsConstructor; - -import java.util.Collection; -import java.util.Set; - -@RequiredArgsConstructor -public class ForceReductionSystem implements System { - private final float gravity; - - @Override - public Collection<Class<? extends System>> getDependencies() { - return Set.of(); - } - - @Override - public void update(final World world, final float deltaSeconds) { - world.queryable().allOf(Forces.class, Mass.class, Velocity.class).forEach(entity -> { - final Forces forces = entity.get(Forces.class); - final Mass mass = entity.get(Mass.class); - final Velocity velocity = entity.get(Velocity.class); - - if (entity.has(Gravity.class)) { - final Gravity gravityComponent = entity.get(Gravity.class); - if (velocity.getVelocity().getY() > -gravityComponent.getTerminalVelocity()) { - forces.add(new Force(new Vec2f(0f, -mass.getMass() * gravity))); - } - } - - Vec2<Float> netForce = Vec2f.ZERO; - for (final Force f : forces.getForces()) { - netForce = netForce.plus(f.getForce()); - } - forces.clear(); - - final Vec2<Float> acceleration = netForce.scale(1f / mass.getMass(), 1f / mass.getMass()); - velocity.setVelocity(velocity.getVelocity().plus(acceleration.scale(deltaSeconds, deltaSeconds))); - - if (entity.has(Jump.class) && acceleration.getY() < 0) { - entity.get(Jump.class).setCanJump(false); - } - }); - } -} diff --git a/core/src/main/java/coffee/liz/ecs/common/systems/physics/IntegrationSystem.java b/core/src/main/java/coffee/liz/ecs/common/systems/physics/IntegrationSystem.java deleted file mode 100644 index ba38b70..0000000 --- a/core/src/main/java/coffee/liz/ecs/common/systems/physics/IntegrationSystem.java +++ /dev/null @@ -1,25 +0,0 @@ -package coffee.liz.ecs.common.systems.physics; - -import coffee.liz.ecs.common.components.physics.BoundingBox; -import coffee.liz.ecs.common.components.physics.Velocity; -import coffee.liz.ecs.model.System; -import coffee.liz.ecs.model.World; - -import java.util.Collection; -import java.util.Set; - -public class IntegrationSystem implements System { - @Override - public Collection<Class<? extends System>> getDependencies() { - return Set.of(ForceReductionSystem.class); - } - - @Override - public void update(final World world, final float deltaSeconds) { - world.queryable().allOf(Velocity.class, BoundingBox.class).forEach(entity -> { - final BoundingBox bb = entity.get(BoundingBox.class); - final Velocity velocity = entity.get(Velocity.class); - bb.setPosition(bb.getPosition().plus(velocity.getVelocity().scale(deltaSeconds, deltaSeconds))); - }); - } -} diff --git a/core/src/main/java/coffee/liz/ecs/model/Entity.java b/core/src/main/java/coffee/liz/ecs/model/Entity.java index bbd417e..16aa37b 100644 --- a/core/src/main/java/coffee/liz/ecs/model/Entity.java +++ b/core/src/main/java/coffee/liz/ecs/model/Entity.java @@ -108,4 +108,17 @@ public class Entity extends EventBus<EntityEvent> { public Set<Class<? extends Component>> componentTypes() { return componentMap.keySet(); } + + @Override + public boolean equals(final Object other) { + if (other instanceof Entity) { + return ((Entity) other).getId() == getId(); + } + return false; + } + + @Override + public int hashCode() { + return Integer.hashCode(getId()); + } } |
