Implemented fast dijkstra-map pathfinding
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user