Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.dongbat.invasion.util; import com.artemis.Entity; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.Body; import com.dongbat.invasion.component.EnemyMovement; import com.dongbat.invasion.component.Physics; /** * * @author password */ public class MovementUtil { public static void moveTo(Entity entity, Vector2 destination) { Physics physicsComponent = EntityUtil.getComponent(entity, Physics.class); Body body = physicsComponent.getBody(); float mass = body.getMass(); Vector2 currentVelocity = body.getLinearVelocity(); Vector2 position = body.getPosition(); Vector2 desiredVelocity = destination.cpy().sub(position).nor().scl(physicsComponent.getMaxSpeed()); Vector2 impulse = desiredVelocity.sub(currentVelocity).scl(mass); PhysicsUtil.applyImpulse(entity, impulse); } public static void moveEnemyTo(Entity entity, Vector2 destination) { if (!EntityUtil.isEnemy(entity)) { return; } Body body = EntityUtil.getComponent(entity, Physics.class).getBody(); destination.y = body.getPosition().y; moveTo(entity, destination); } public static void chase(Entity chaser, Entity target) { chase(chaser, target, false); } public static void chase(Entity chaser, Entity target, boolean isHorizontal) { Body targetBody = EntityUtil.getComponent(target, Physics.class).getBody(); if (isHorizontal) { moveEnemyTo(chaser, targetBody.getPosition()); } else { moveTo(chaser, targetBody.getPosition()); } } public static void evade(Entity evader, Entity threat, boolean isHorizontal) { // TODO } public static void evade(Entity evader, Vector2 position, boolean isHorizontal) { // TODO } public static void setTarget(Entity enemy, Vector2 target) { EnemyMovement movement = EntityUtil.getComponent(enemy, EnemyMovement.class); if (movement != null) { movement.setIntent(target); } } public static void drag(Entity enemy, Vector2 target, float force, int duration) { EnemyMovement movement = EntityUtil.getComponent(enemy, EnemyMovement.class); if (movement != null) { movement.setDraggedTo(target); movement.setDragForce(force); movement.setDragDuration(duration); movement.setStartDrag(TimeUtil.getGameTime()); movement.setDraggedFrom(PhysicsUtil.getPosition(enemy)); } } public static boolean hasArrived(Entity entity) { EnemyMovement enemyMovement = EntityUtil.getComponent(entity, EnemyMovement.class); Vector2 intent = enemyMovement.getIntent().cpy(); Vector2 position = PhysicsUtil.getPosition(entity); intent.y = position.y; return position.epsilonEquals(intent, Constants.GAME.EPSILON); } }