package se.danielj.skuttandenyancat.systems; import se.danielj.skuttandenyancat.EntityFactory; import se.danielj.skuttandenyancat.components.Player; import se.danielj.skuttandenyancat.components.Position; import se.danielj.skuttandenyancat.components.Size; import se.danielj.skuttandenyancat.components.Velocity; import se.danielj.skuttandenyancat.misc.Constants; import se.danielj.skuttandenyancat.misc.Energy; import se.danielj.skuttandenyancat.misc.Score; import se.danielj.skuttandenyancat.misc.SoundEffectsManager; import se.danielj.skuttandenyancat.misc.State; import com.artemis.Aspect; import com.artemis.ComponentMapper; import com.artemis.Entity; import com.artemis.EntitySystem; import com.artemis.annotations.Mapper; import com.artemis.managers.GroupManager; import com.artemis.utils.Bag; import com.artemis.utils.ImmutableBag; /** * * @author Daniel Jonsson * @license GNU GPLv3 * */ public class CollisionSystem extends EntitySystem { @Mapper ComponentMapper<Position> pm; @Mapper ComponentMapper<Size> sm; @Mapper ComponentMapper<Velocity> vm; private Bag<CollisionPair> collisionPairs; private Entity cat; private Position catPos; @SuppressWarnings("unchecked") public CollisionSystem() { super(Aspect.getAspectForAll(Position.class, Size.class, Player.class)); } @Override public void initialize() { ImmutableBag<Entity> e = world.getManager(GroupManager.class) .getEntities(Constants.Groups.CAT); if (!e.isEmpty()) { cat = e.get(0); cat = world.getManager(GroupManager.class) .getEntities(Constants.Groups.CAT).get(0); catPos = pm.get(cat); } collisionPairs = new Bag<CollisionPair>(); collisionPairs.add(new CollisionPair(Constants.Groups.STAR, new CollisionHandler() { @Override public void handleCollision(Entity cat, Entity star) { Position pp = pm.get(star); world.deleteEntity(star); EntityFactory .createEffect2(world, pp.getX(), pp.getY()) .addToWorld(); Energy.addEnergy(40); SoundEffectsManager.star(); } })); collisionPairs.add(new CollisionPair(Constants.Groups.POLE, new CollisionHandler() { @Override public void handleCollision(Entity cat, Entity pole) { // Cat Position pc = pm.get(cat); Size sc = sm.get(cat); Velocity vc = vm.get(cat); // Pole Position pp = pm.get(pole); Size sp = sm.get(pole); if (prevY - sc.getHeight() / 2 < pp.getY() + sp.getHeight() / 2) { return; } vc.setY(0); pc.setY(sc.getHeight() / 2 + pp.getY() + sp.getHeight() / 2); if (!State.isRunning()) { EntityFactory.createEffect(world, pc.getX(), pc.getY() - sc.getHeight() / 2) .addToWorld(); State.setRunning(true); SoundEffectsManager.landingSound(); } running = true; Score.addScore(1000 * world.getDelta()); } })); } private boolean running; // private float prevX = 0; private float prevY = 0; @Override protected void processEntities(ImmutableBag<Entity> entities) { running = false; for (int i = 0; collisionPairs.size() > i; i++) { collisionPairs.get(i).checkForCollisions(); } if (!running) { State.setRunning(false); Score.addScoreToTotal(); } // prevX = catPos.getX(); prevY = catPos.getY(); } @Override protected boolean checkProcessing() { return true; } @Override protected void inserted(Entity e) { cat = e; catPos = pm.get(cat); } private class CollisionPair { private ImmutableBag<Entity> groupEntities; private CollisionHandler handler; public CollisionPair(String group, CollisionHandler handler) { groupEntities = world.getManager(GroupManager.class).getEntities( group); this.handler = handler; } public void checkForCollisions() { for (int a = 0; groupEntities.size() > a; a++) { Entity entity = groupEntities.get(a); if (collisionExists(cat, entity)) { handler.handleCollision(cat, entity); } } } private boolean collisionExists(Entity e1, Entity e2) { Position p1 = pm.get(e1); Position p2 = pm.get(e2); Size s1 = sm.get(e1); Size s2 = sm.get(e2); if (p1.getX() + s1.getWidth() / 2 < p2.getX() - s2.getWidth() / 2) { return false; } if (p1.getX() - s1.getWidth() / 2 > p2.getX() + s2.getWidth() / 2) { return false; } if (p1.getY() + s1.getHeight() / 2 < p2.getY() - s2.getHeight() / 2) { return false; } if (p1.getY() - s1.getHeight() / 2 > p2.getY() + s2.getHeight() / 2) { return false; } return true; } } private interface CollisionHandler { void handleCollision(Entity a, Entity b); } }