Added AI system + a basic AI.
This commit is contained in:
parent
7a04b439ac
commit
3ce2452964
@ -8,6 +8,7 @@ import com.badlogic.gdx.Gdx;
|
||||
import com.badlogic.gdx.Input;
|
||||
import com.badlogic.gdx.graphics.g2d.Sprite;
|
||||
import com.badlogic.gdx.math.Vector2;
|
||||
import com.saltosion.gladiator.components.CAI;
|
||||
import com.saltosion.gladiator.components.CCombat;
|
||||
import com.saltosion.gladiator.components.CPhysics;
|
||||
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.input.InputHandler;
|
||||
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.MiscManagerSystem;
|
||||
import com.saltosion.gladiator.systems.PhysicsSystem;
|
||||
@ -45,6 +48,7 @@ public class GladiatorBrawler extends ApplicationAdapter {
|
||||
engine.addSystem(new RenderingSystem());
|
||||
engine.addSystem(new CombatSystem());
|
||||
engine.addSystem(new MiscManagerSystem());
|
||||
engine.addSystem(new AISystem());
|
||||
engine.addEntityListener(new EntityListener() {
|
||||
@Override
|
||||
public void entityAdded(Entity entity) {
|
||||
@ -56,6 +60,8 @@ public class GladiatorBrawler extends ApplicationAdapter {
|
||||
cs.updateEntities(engine);
|
||||
MiscManagerSystem mms = engine.getSystem(MiscManagerSystem.class);
|
||||
mms.updateEntities(engine);
|
||||
AISystem ais = engine.getSystem(AISystem.class);
|
||||
ais.updateEntities(engine);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -68,6 +74,8 @@ public class GladiatorBrawler extends ApplicationAdapter {
|
||||
cs.updateEntities(engine);
|
||||
MiscManagerSystem mms = engine.getSystem(MiscManagerSystem.class);
|
||||
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));
|
||||
}
|
||||
|
||||
}));
|
||||
}));
|
||||
dummy.add(new CAI().setReactDistance(5).setAIListener(new DummyAI()));
|
||||
engine.addEntity(dummy);
|
||||
dummy.getComponent(CCombat.class).inputs.put(Direction.UP, true);
|
||||
}
|
||||
|
33
core/src/com/saltosion/gladiator/components/CAI.java
Normal file
33
core/src/com/saltosion/gladiator/components/CAI.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
@ -80,6 +80,16 @@ public class CPhysics extends Component {
|
||||
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) {
|
||||
this.movespeed = movespeed;
|
||||
return this;
|
||||
|
19
core/src/com/saltosion/gladiator/listeners/AIListener.java
Normal file
19
core/src/com/saltosion/gladiator/listeners/AIListener.java
Normal 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);
|
||||
|
||||
}
|
43
core/src/com/saltosion/gladiator/listeners/ai/DummyAI.java
Normal file
43
core/src/com/saltosion/gladiator/listeners/ai/DummyAI.java
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
63
core/src/com/saltosion/gladiator/systems/AISystem.java
Normal file
63
core/src/com/saltosion/gladiator/systems/AISystem.java
Normal 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));
|
||||
}
|
||||
}
|
@ -17,8 +17,9 @@ import com.saltosion.gladiator.util.Direction;
|
||||
public class PhysicsSystem extends EntitySystem {
|
||||
|
||||
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;
|
||||
|
||||
@Override
|
||||
|
Loading…
Reference in New Issue
Block a user