@Override protected void process(int entityId) { try { Position p = posMapper.get(entityId); Rotation r = rotMapper.get(entityId); Velocity v = velMapper.get(entityId); if (physMapper.has(entityId)) { Body body = world.getSystem(PhysicsSystem.class).getBody(entityId); if (inputMapper.has(entityId)) { // control physics body by input processPhysicsMovement(body, inputMapper.get(entityId), p, v, r, entityId); } else { // keep image with body for when physics is acting upon it p.position.set(body.getPosition()); r.angle = MathUtils.radiansToDegrees * body.getAngle(); v.velocity.set(body.getLinearVelocity()); } } else { // move image directly since there is no physics body float d = world.getDelta(); p.position.add(v.velocity.x * d, v.velocity.y * d); } // Keep equipment with entity if (equipMapper.has(entityId)) { EquipmentList equipmentList = equipMapper.get(entityId); equipmentList.moveEquipment(boundsMapper, posMapper); equipmentList.rechargeEquipment(); // TODO: move this to EnergySystem } } catch (NullPointerException ex) { logger.error("MoveSys error; killing offending entity #" + entityId, ex); world.getEntity(entityId).getComponent(Lifecycle.class).kill(); } }
private void processPhysicsMovement( Body body, InputComponent ic, Position pc, Velocity vc, Rotation rc, int id) { if (body == null) { logger.error("ERR: cannot process movement for ent#" + id + "; body == null"); lifeCycleMapper.get(id).kill(); return; } body.setLinearVelocity(0, 0); // accelerate Vector2 force = ic.direction.cpy().nor().scl(ic.speed); body.applyLinearImpulse(force, body.getWorldCenter(), true); // update entity pc.position.set(body.getPosition()); vc.velocity.set(body.getLinearVelocity()); rc.angle = MathUtils.radiansToDegrees * body.getAngle(); }