diff --git a/core/src/com/me/asteroids/EntityFactory.java b/core/src/com/me/asteroids/EntityFactory.java index 32860a9..a11e1fe 100644 --- a/core/src/com/me/asteroids/EntityFactory.java +++ b/core/src/com/me/asteroids/EntityFactory.java @@ -3,6 +3,7 @@ package com.me.asteroids; import com.badlogic.gdx.math.Polygon; import com.badlogic.gdx.math.Vector2; import com.me.asteroids.components.AccelerationComponent; +import com.me.asteroids.components.BulletComponent; import com.me.asteroids.components.ModelComponent; import com.me.asteroids.components.PlayerComponent; import com.me.asteroids.components.PositionComponent; @@ -67,6 +68,7 @@ public class EntityFactory { bullet.addComponent(position); bullet.addComponent(velocity); bullet.addComponent(model); + bullet.addComponent(new BulletComponent()); return bullet; } diff --git a/core/src/com/me/asteroids/components/BulletComponent.java b/core/src/com/me/asteroids/components/BulletComponent.java new file mode 100644 index 0000000..b00e70f --- /dev/null +++ b/core/src/com/me/asteroids/components/BulletComponent.java @@ -0,0 +1,6 @@ +package com.me.asteroids.components; + +import com.me.common.ecs.Component; + +public class BulletComponent implements Component { +} diff --git a/core/src/com/me/asteroids/events/ScreenWrapEvent.java b/core/src/com/me/asteroids/events/ScreenWrapEvent.java new file mode 100644 index 0000000..e27ca00 --- /dev/null +++ b/core/src/com/me/asteroids/events/ScreenWrapEvent.java @@ -0,0 +1,18 @@ +package com.me.asteroids.events; + +import com.me.common.ecs.Entity; +import com.me.common.ecs.event.Event; + +/** + * Called when an entity is about to wrap around the screen. + * If cancelled, don't perform the wrapping. + */ +public class ScreenWrapEvent extends Event { + + public Entity entity; + + public ScreenWrapEvent(Entity entity) { + this.entity = entity; + } + +} diff --git a/core/src/com/me/asteroids/screens/GameScreen.java b/core/src/com/me/asteroids/screens/GameScreen.java index c37f50d..0e06fb7 100644 --- a/core/src/com/me/asteroids/screens/GameScreen.java +++ b/core/src/com/me/asteroids/screens/GameScreen.java @@ -8,10 +8,12 @@ import com.me.asteroids.Constants; import com.me.asteroids.EntityFactory; import com.me.asteroids.Graphics; import com.me.asteroids.components.AccelerationComponent; +import com.me.asteroids.components.BulletComponent; import com.me.asteroids.components.ModelComponent; import com.me.asteroids.components.PlayerComponent; import com.me.asteroids.components.PositionComponent; import com.me.asteroids.components.VelocityComponent; +import com.me.asteroids.events.ScreenWrapEvent; import com.me.asteroids.systems.CollisionSystem; import com.me.asteroids.systems.ModelRenderSystem; import com.me.asteroids.systems.MovementSystem; @@ -20,8 +22,10 @@ import com.me.asteroids.systems.ScreenWrapSystem; import com.me.common.Screen; import com.me.common.ecs.Engine; import com.me.common.ecs.Entity; +import com.me.common.ecs.event.EventHandler; +import com.me.common.ecs.event.Listener; -public class GameScreen extends Screen { +public class GameScreen extends Screen implements Listener { Engine engine; @@ -43,6 +47,7 @@ public class GameScreen extends Screen { engine = new Engine(); engine.registerComponentClass(PlayerComponent.class); + engine.registerComponentClass(BulletComponent.class); engine.registerComponentClass(PositionComponent.class); engine.registerComponentClass(VelocityComponent.class); engine.registerComponentClass(AccelerationComponent.class); @@ -54,6 +59,8 @@ public class GameScreen extends Screen { engine.registerSystem(new ScreenWrapSystem(engine)); engine.registerSystem(new ModelRenderSystem(engine, graphics)); + engine.registerListener(this); + engine.ready(); Entity player = EntityFactory.createPlayer(engine); @@ -77,4 +84,14 @@ public class GameScreen extends Screen { } + @EventHandler + public void onScreenWrap(ScreenWrapEvent event) { + if (event.entity.hasComponent(BulletComponent.class)) { + // Remove bullets when they leave the screen + event.setCancelled(true); + event.entity.remove(); + } + } + + } diff --git a/core/src/com/me/asteroids/systems/ScreenWrapSystem.java b/core/src/com/me/asteroids/systems/ScreenWrapSystem.java index 859999c..bf5b079 100644 --- a/core/src/com/me/asteroids/systems/ScreenWrapSystem.java +++ b/core/src/com/me/asteroids/systems/ScreenWrapSystem.java @@ -5,6 +5,7 @@ import com.badlogic.gdx.math.Vector2; import com.me.asteroids.Constants; import com.me.asteroids.components.ModelComponent; import com.me.asteroids.components.PositionComponent; +import com.me.asteroids.events.ScreenWrapEvent; import com.me.common.ecs.ComponentMapper; import com.me.common.ecs.Engine; import com.me.common.ecs.Entity; @@ -21,6 +22,15 @@ public class ScreenWrapSystem extends EntitySystem { modelMapper = engine.getComponentMapper(ModelComponent.class); } + private void updatePosition(Entity entity, Vector2 position, float newX, float newY) { + ScreenWrapEvent event = new ScreenWrapEvent(entity); + engine.callEvent(event); + if (!event.isCancelled()) { + position.set(newX, newY); + } + } + + @Override public void processEntity(Entity entity, float dt) { PositionComponent positionComponent = positionMapper.get(entity); @@ -33,10 +43,10 @@ public class ScreenWrapSystem extends EntitySystem { float minY = aabb.y; float maxY = minY + aabb.height; if (minY > Constants.HEIGHT) { - position.y = (position.y - maxY) + (minY - Constants.HEIGHT); + updatePosition(entity, position, position.x, (position.y - maxY) + (minY - Constants.HEIGHT)); return; } else if (maxY < 0) { - position.y = Constants.HEIGHT + (position.y - minY) + maxY; + updatePosition(entity, position, position.x, Constants.HEIGHT + (position.y - minY) + maxY); return; } @@ -44,9 +54,9 @@ public class ScreenWrapSystem extends EntitySystem { float minX = aabb.x; float maxX = minX + aabb.width; if (maxX < 0) { - position.x = Constants.WIDTH + (position.x - minX) + maxX; + updatePosition(entity, position, Constants.WIDTH + (position.x - minX) + maxX, position.y); } else if (minX > Constants.WIDTH) { - position.x = (position.x - maxX) + (minX - Constants.WIDTH); + updatePosition(entity, position, (position.x - maxX) + (minX - Constants.WIDTH), position.y); } }