Added AI system + a basic AI.

This commit is contained in:
Jeasonfire 2015-05-11 23:18:38 +03:00
parent 7a04b439ac
commit 3ce2452964
7 changed files with 185 additions and 7 deletions

View File

@ -8,6 +8,7 @@ import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input; import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import com.saltosion.gladiator.components.CAI;
import com.saltosion.gladiator.components.CCombat; import com.saltosion.gladiator.components.CCombat;
import com.saltosion.gladiator.components.CPhysics; import com.saltosion.gladiator.components.CPhysics;
import com.saltosion.gladiator.components.CRenderedObject; import com.saltosion.gladiator.components.CRenderedObject;
@ -15,6 +16,8 @@ import com.saltosion.gladiator.gui.ButtonNode;
import com.saltosion.gladiator.gui.GUIManager; import com.saltosion.gladiator.gui.GUIManager;
import com.saltosion.gladiator.input.InputHandler; import com.saltosion.gladiator.input.InputHandler;
import com.saltosion.gladiator.listeners.CombatListener; import com.saltosion.gladiator.listeners.CombatListener;
import com.saltosion.gladiator.listeners.ai.DummyAI;
import com.saltosion.gladiator.systems.AISystem;
import com.saltosion.gladiator.systems.CombatSystem; import com.saltosion.gladiator.systems.CombatSystem;
import com.saltosion.gladiator.systems.MiscManagerSystem; import com.saltosion.gladiator.systems.MiscManagerSystem;
import com.saltosion.gladiator.systems.PhysicsSystem; import com.saltosion.gladiator.systems.PhysicsSystem;
@ -45,6 +48,7 @@ public class GladiatorBrawler extends ApplicationAdapter {
engine.addSystem(new RenderingSystem()); engine.addSystem(new RenderingSystem());
engine.addSystem(new CombatSystem()); engine.addSystem(new CombatSystem());
engine.addSystem(new MiscManagerSystem()); engine.addSystem(new MiscManagerSystem());
engine.addSystem(new AISystem());
engine.addEntityListener(new EntityListener() { engine.addEntityListener(new EntityListener() {
@Override @Override
public void entityAdded(Entity entity) { public void entityAdded(Entity entity) {
@ -56,6 +60,8 @@ public class GladiatorBrawler extends ApplicationAdapter {
cs.updateEntities(engine); cs.updateEntities(engine);
MiscManagerSystem mms = engine.getSystem(MiscManagerSystem.class); MiscManagerSystem mms = engine.getSystem(MiscManagerSystem.class);
mms.updateEntities(engine); mms.updateEntities(engine);
AISystem ais = engine.getSystem(AISystem.class);
ais.updateEntities(engine);
} }
@Override @Override
@ -68,6 +74,8 @@ public class GladiatorBrawler extends ApplicationAdapter {
cs.updateEntities(engine); cs.updateEntities(engine);
MiscManagerSystem mms = engine.getSystem(MiscManagerSystem.class); MiscManagerSystem mms = engine.getSystem(MiscManagerSystem.class);
mms.updateEntities(engine); mms.updateEntities(engine);
AISystem ais = engine.getSystem(AISystem.class);
ais.updateEntities(engine);
} }
}); });
@ -130,7 +138,8 @@ public class GladiatorBrawler extends ApplicationAdapter {
System.out.println(String.format("I took %d damage! Damnit!", damageTaken)); System.out.println(String.format("I took %d damage! Damnit!", damageTaken));
} }
})); }));
dummy.add(new CAI().setReactDistance(5).setAIListener(new DummyAI()));
engine.addEntity(dummy); engine.addEntity(dummy);
dummy.getComponent(CCombat.class).inputs.put(Direction.UP, true); dummy.getComponent(CCombat.class).inputs.put(Direction.UP, true);
} }

View File

@ -0,0 +1,33 @@
package com.saltosion.gladiator.components;
import com.badlogic.ashley.core.Component;
import com.saltosion.gladiator.listeners.AIListener;
/**
*
* @author Jens "Jeasonfire" Pitkänen <jeasonfire@gmail.com>
*/
public class CAI extends Component {
private AIListener listener;
private float reactDistance = 1;
public CAI setReactDistance(float reactDistance) {
this.reactDistance = reactDistance;
return this;
}
public float getReactDistance() {
return reactDistance;
}
public CAI setAIListener(AIListener listener) {
this.listener = listener;
return this;
}
public AIListener getAIListener() {
return listener;
}
}

View File

@ -80,6 +80,16 @@ public class CPhysics extends Component {
return this; return this;
} }
public CPhysics setVelocity(float x, float y) {
this.velocity.set(x, y);
return this;
}
public CPhysics setVelocity(Vector2 pos) {
this.velocity.set(pos);
return this;
}
public CPhysics setMoveSpeed(float movespeed) { public CPhysics setMoveSpeed(float movespeed) {
this.movespeed = movespeed; this.movespeed = movespeed;
return this; return this;

View File

@ -0,0 +1,19 @@
package com.saltosion.gladiator.listeners;
import com.badlogic.ashley.core.Entity;
import java.util.ArrayList;
/**
*
* @author Jens "Jeasonfire" Pitkänen <jeasonfire@gmail.com>
*/
public interface AIListener {
/**
* @param closeEntities A list of entities that are close to the host entity
* than the host entity's reactDistance.
* @param host The host entity of this listener
*/
public void react(ArrayList<Entity> closeEntities, Entity host);
}

View File

@ -0,0 +1,43 @@
package com.saltosion.gladiator.listeners.ai;
import com.badlogic.ashley.core.ComponentMapper;
import com.badlogic.ashley.core.Entity;
import com.saltosion.gladiator.components.CCombat;
import com.saltosion.gladiator.components.CPhysics;
import com.saltosion.gladiator.listeners.AIListener;
import com.saltosion.gladiator.util.Direction;
import java.util.ArrayList;
/**
*
* @author Jens "Jeasonfire" Pitkänen <jeasonfire@gmail.com>
*/
public class DummyAI implements AIListener {
private static final ComponentMapper<CPhysics> pm = ComponentMapper.getFor(CPhysics.class);
private static final ComponentMapper<CCombat> cm = ComponentMapper.getFor(CCombat.class);
@Override
public void react(ArrayList<Entity> closeEntities, Entity host) {
CPhysics p0 = pm.get(host);
CCombat c0 = cm.get(host);
c0.inputs.put(Direction.UP, false);
c0.inputs.put(Direction.DOWN, false);
c0.inputs.put(Direction.LEFT, false);
c0.inputs.put(Direction.RIGHT, false);
for (Entity other : closeEntities) {
CPhysics p1 = pm.get(other);
if (p0.getPosition().x + p0.getSize().x / 3 < p1.getPosition().x - p1.getSize().x / 3) {
c0.inputs.put(Direction.RIGHT, true);
} else if (p0.getPosition().x - p0.getSize().x / 3 > p1.getPosition().x + p1.getSize().x / 3) {
c0.inputs.put(Direction.LEFT, true);
} else if (p0.getPosition().y + p0.getSize().y / 3 < p1.getPosition().y - p1.getSize().y / 3) {
c0.inputs.put(Direction.UP, true);
} else if (p0.getPosition().y - p0.getSize().y / 3 > p1.getPosition().y + p1.getSize().y / 3) {
c0.inputs.put(Direction.DOWN, true);
}
}
}
}

View File

@ -0,0 +1,63 @@
package com.saltosion.gladiator.systems;
import com.badlogic.ashley.core.ComponentMapper;
import com.badlogic.ashley.core.Engine;
import com.badlogic.ashley.core.Entity;
import com.badlogic.ashley.core.EntitySystem;
import com.badlogic.ashley.core.Family;
import com.badlogic.ashley.utils.ImmutableArray;
import com.saltosion.gladiator.components.CAI;
import com.saltosion.gladiator.components.CCombat;
import com.saltosion.gladiator.components.CPhysics;
import java.util.ArrayList;
/**
*
* @author Jens "Jeasonfire" Pitkänen <jeasonfire@gmail.com>
*/
public class AISystem extends EntitySystem {
private static final ComponentMapper<CPhysics> pm = ComponentMapper.getFor(CPhysics.class);
private static final ComponentMapper<CAI> aim = ComponentMapper.getFor(CAI.class);
private ImmutableArray<Entity> entities;
@Override
public void addedToEngine(Engine engine) {
updateEntities(engine);
}
@Override
public void update(float deltaTime) {
// Loop through all entities that have CCombat
for (int i = 0; i < entities.size(); i++) {
// If current entity doesn't have CAI, skip current entity
if (aim.get(entities.get(i)) == null) {
continue;
}
CPhysics cp0 = pm.get(entities.get(i));
CAI cai = aim.get(entities.get(i));
// React
ArrayList<Entity> reactEntities = new ArrayList<Entity>();
// Loop through all entities with CCombat
for (int j = 0; j < entities.size(); j++) {
if (i == j) {
continue;
}
CPhysics cp1 = pm.get(entities.get(j));
float x = cp1.getPosition().x - cp0.getPosition().x;
float y = cp1.getPosition().y - cp0.getPosition().y;
float len = (float) Math.sqrt(x * x + y * y);
if (len <= cai.getReactDistance()) {
reactEntities.add(entities.get(j));
}
}
cai.getAIListener().react(reactEntities, entities.get(i));
}
}
public void updateEntities(Engine engine) {
entities = engine.getEntitiesFor(Family.getFor(CCombat.class));
}
}

View File

@ -17,8 +17,9 @@ import com.saltosion.gladiator.util.Direction;
public class PhysicsSystem extends EntitySystem { public class PhysicsSystem extends EntitySystem {
private static final float MAX_VEL = 0.5f; private static final float MAX_VEL = 0.5f;
private ComponentMapper<CPhysics> pm = ComponentMapper.getFor(CPhysics.class);
private ComponentMapper<CCombat> cm = ComponentMapper.getFor(CCombat.class); private static final ComponentMapper<CPhysics> pm = ComponentMapper.getFor(CPhysics.class);
private static final ComponentMapper<CCombat> cm = ComponentMapper.getFor(CCombat.class);
private ImmutableArray<Entity> entities; private ImmutableArray<Entity> entities;
@Override @Override