Add CollisionSystem

This commit is contained in:
Matt Low 2020-01-25 17:26:44 +04:00
parent 74ba61ee53
commit b9148c028d
3 changed files with 60 additions and 0 deletions

View File

@ -0,0 +1,16 @@
package com.me.asteroids.events;
import com.me.common.ecs.Entity;
import com.me.common.ecs.event.Event;
public class CollisionEvent extends Event {
public Entity entityA;
public Entity entityB;
public CollisionEvent(Entity entityA, Entity entityB) {
this.entityA = entityA;
this.entityB = entityB;
}
}

View File

@ -12,6 +12,7 @@ import com.me.asteroids.components.ModelComponent;
import com.me.asteroids.components.PlayerComponent; import com.me.asteroids.components.PlayerComponent;
import com.me.asteroids.components.PositionComponent; import com.me.asteroids.components.PositionComponent;
import com.me.asteroids.components.VelocityComponent; import com.me.asteroids.components.VelocityComponent;
import com.me.asteroids.systems.CollisionSystem;
import com.me.asteroids.systems.ModelRenderSystem; import com.me.asteroids.systems.ModelRenderSystem;
import com.me.asteroids.systems.MovementSystem; import com.me.asteroids.systems.MovementSystem;
import com.me.asteroids.systems.PlayerInputSystem; import com.me.asteroids.systems.PlayerInputSystem;
@ -49,6 +50,7 @@ public class GameScreen extends Screen {
engine.registerSystem(new PlayerInputSystem(engine)); engine.registerSystem(new PlayerInputSystem(engine));
engine.registerSystem(new MovementSystem(engine)); engine.registerSystem(new MovementSystem(engine));
engine.registerSystem(new CollisionSystem(engine));
engine.registerSystem(new ScreenWrapSystem(engine)); engine.registerSystem(new ScreenWrapSystem(engine));
engine.registerSystem(new ModelRenderSystem(engine, graphics)); engine.registerSystem(new ModelRenderSystem(engine, graphics));

View File

@ -0,0 +1,42 @@
package com.me.asteroids.systems;
import com.badlogic.gdx.math.Rectangle;
import com.me.asteroids.components.ModelComponent;
import com.me.asteroids.events.CollisionEvent;
import com.me.common.ecs.ComponentMapper;
import com.me.common.ecs.Engine;
import com.me.common.ecs.Entity;
import com.me.common.ecs.EntitySystem;
public class CollisionSystem extends EntitySystem {
private ComponentMapper<ModelComponent> modelMapper;
public CollisionSystem(Engine engine) {
super(engine, ModelComponent.class);
modelMapper = engine.getComponentMapper(ModelComponent.class);
}
@Override
public void processEntities(float dt) {
Entity[] entities = getEntities().items;
for (int i = 0, n = getEntities().size; i < n-1; i++) {
Entity entityA = entities[i];
Rectangle aabbA = modelMapper.get(entityA).aabb;
for (int j = i + 1; j < n; j++) {
Entity entityB = entities[j];
Rectangle aabbB = modelMapper.get(entityB).aabb;
if (aabbA.overlaps(aabbB)) {
CollisionEvent event = new CollisionEvent(entityA, entityB);
engine.callEvent(event);
}
}
}
}
@Override
public void processEntity(Entity entity, float dt) {}
}