package org.castelodelego.spacedebris.battlesystems; import java.util.ArrayList; import org.castelodelego.spacedebris.battlecomponents.ComponentCollBox; import org.castelodelego.spacedebris.battlecomponents.ComponentDirection; import org.castelodelego.spacedebris.battlecomponents.ComponentInterface; import org.castelodelego.spacedebris.battlecomponents.ComponentPosition; import org.castelodelego.spacedebris.battlecomponents.ComponentType; import org.castelodelego.spacedebris.battleentities.Entity; import org.castelodelego.spacedebris.battleentities.EntityManager; import com.badlogic.gdx.utils.Array; /** * Simple system that updates the position of all entities that have a position and a direction components. * * @author caranha * */ public class MoveSystem { static ComponentType[] filter = {ComponentType.COMP_POS, ComponentType.COMP_DIR}; public MoveSystem() { } public void update(float dt, EntityManager m) { ArrayList<Entity> list = m.queryEntities(filter); Array<ComponentInterface> clist; ComponentPosition pos; ComponentDirection dir; ComponentCollBox rect; for (int i = 0; i < list.size(); i++) { pos = (ComponentPosition) list.get(i).getComponentByType(ComponentType.COMP_POS).get(0); // one position clist = list.get(i).getComponentByType(ComponentType.COMP_DIR); // possibly multiple direction vectors -- add them all! for (int j = 0; j < clist.size; j++) { dir = (ComponentDirection) clist.get(j); pos.pos.x += dir.dir.x*dt; pos.pos.y += dir.dir.y*dt; } // special cases for collision box entities clist = list.get(i).getComponentByType(ComponentType.COMP_COLLBOX); if (clist != null && clist.size > 0) { rect = (ComponentCollBox) clist.get(0); // assumes only one collision box exists rect.box.setCenter(pos.pos); } // TODO: special case for composite entities } } }