Implemented fast dijkstra-map pathfinding

This commit is contained in:
Anuken
2018-05-01 21:34:30 -04:00
parent 036f233946
commit 3dd07d2f4a
21 changed files with 211 additions and 96 deletions
@@ -166,5 +166,21 @@ public class Units {
});
}
/**Iterates over all units.*/
public static void getAllUnits(Consumer<Unit> cons){
for(Team team : Team.values()){
EntityGroup<BaseUnit> group = unitGroups[team.ordinal()];
for(Unit unit : group.all()){
cons.accept(unit);
}
}
//now check all enemy players
for(Unit unit : playerGroup.all()){
cons.accept(unit);
}
}
}
@@ -1,14 +1,12 @@
package io.anuke.mindustry.entities.units;
import io.anuke.mindustry.ai.OptimizedPathFinder;
import io.anuke.mindustry.ai.SmoothGraphPath;
import io.anuke.mindustry.entities.Bullet;
import io.anuke.mindustry.entities.BulletType;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.flags.BlockFlag;
import io.anuke.mindustry.world.BlockFlag;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.entities.Entity;
@@ -30,10 +28,6 @@ public class BaseUnit extends Unit{
public StateMachine state = new StateMachine();
public Entity target;
protected OptimizedPathFinder finder;
protected SmoothGraphPath path;
protected int node = -2;
public BaseUnit(UnitType type, Team team){
this.type = type;
this.team = team;
@@ -143,11 +137,6 @@ public class BaseUnit extends Unit{
hitboxTile.setSize(type.hitsizeTile);
state.set(this, type.getStartState());
if(!isFlying()){
finder = new OptimizedPathFinder();
path = new SmoothGraphPath();
}
heal();
}
@@ -6,7 +6,7 @@ import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.resource.AmmoType;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.flags.BlockFlag;
import io.anuke.mindustry.world.BlockFlag;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Angles;
@@ -3,6 +3,7 @@ package io.anuke.mindustry.entities.units;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.ObjectSet;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.game.TeamInfo.TeamData;
@@ -18,9 +19,6 @@ import static io.anuke.mindustry.Vars.state;
import static io.anuke.mindustry.Vars.world;
public abstract class GroundUnitType extends UnitType{
private static final int nodeStateNone = -2;
private static final int nodeStateCalculating = -1;
//only use for drawing!
protected Translator tr1 = new Translator();
//only use for updating!
@@ -33,6 +31,7 @@ public abstract class GroundUnitType extends UnitType{
maxVelocity = 1.1f;
speed = 0.1f;
drag = 0.4f;
range = 40f;
}
@Override
@@ -106,32 +105,20 @@ public abstract class GroundUnitType extends UnitType{
@Override
public void behavior(BaseUnit unit) {
//TODO actually pathfind
if(unit.node == nodeStateNone){
world.pathfinder().findPath(world.tileWorld(unit.x, unit.y), world.tileWorld(unit.target.x, unit.target.y), unit.path, unit.finder, () -> {
unit.node = 0;
});
unit.node = nodeStateCalculating;
if(unit.target instanceof TileEntity && unit.distanceTo(unit.target) < range) {
if(unit.timer.get(timerReload, reload)){
//shoot(unit, BulletType.shot, tr2.angle(), 4f);
}
}else{
Tile targetTile = world.pathfinder().getTargetTile(unit.team, world.tileWorld(unit.x, unit.y));
tr2.trns(unit.baseRotation, speed);
unit.baseRotation = Mathf.slerpDelta(unit.baseRotation, unit.angleTo(targetTile), 0.05f);
unit.walkTime += Timers.delta();
unit.velocity.add(tr2);
}
if(!(unit.node >= 0 && unit.node < unit.path.nodes.size)) return;
Tile nodeTarget = unit.path.get(unit.node);
tr2.set(nodeTarget.worldx(), nodeTarget.worldy()).sub(unit.x, unit.y);
if(tr2.len() < jumpDistance){
unit.node ++;
}
tr2.limit(speed);
unit.walkTime += Timers.delta();
unit.velocity.add(tr2);
if(unit.timer.get(timerReload, reload)){
//shoot(unit, BulletType.shot, tr2.angle(), 4f);
}
}
}
@@ -6,7 +6,7 @@ import io.anuke.mindustry.entities.units.BaseUnit;
import io.anuke.mindustry.entities.units.FlyingUnitType;
import io.anuke.mindustry.entities.units.UnitState;
import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.world.flags.BlockFlag;
import io.anuke.mindustry.world.BlockFlag;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Angles;
@@ -7,7 +7,7 @@ import io.anuke.mindustry.entities.units.BaseUnit;
import io.anuke.mindustry.entities.units.FlyingUnitType;
import io.anuke.mindustry.entities.units.UnitState;
import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.world.flags.BlockFlag;
import io.anuke.mindustry.world.BlockFlag;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Angles;