More optimization / Flying avoidance

This commit is contained in:
Anuken
2019-03-30 12:54:29 -04:00
parent 83bde8a781
commit e9eb981782
3 changed files with 26 additions and 14 deletions

View File

@ -6,6 +6,7 @@ import io.anuke.arc.function.Predicate;
import io.anuke.arc.graphics.Camera; import io.anuke.arc.graphics.Camera;
import io.anuke.arc.math.geom.Rectangle; import io.anuke.arc.math.geom.Rectangle;
import io.anuke.mindustry.entities.traits.DrawTrait; import io.anuke.mindustry.entities.traits.DrawTrait;
import io.anuke.mindustry.entities.traits.Entity;
public class EntityDraw{ public class EntityDraw{
private static final Rectangle viewport = new Rectangle(); private static final Rectangle viewport = new Rectangle();
@ -42,15 +43,12 @@ public class EntityDraw{
viewport.set(cam.position.x - cam.width / 2, cam.position.y - cam.height / 2, cam.width, cam.height); viewport.set(cam.position.x - cam.width / 2, cam.position.y - cam.height / 2, cam.width, cam.height);
} }
group.forEach(e -> { for(Entity e : group.all()){
if(!(e instanceof DrawTrait)) return; if(!(e instanceof DrawTrait) || !toDraw.test((T)e) || !e.isAdded()) continue;
T t = (T) e;
if(!toDraw.test(t) || !e.isAdded()) return;
if(!clip || rect.setSize(((DrawTrait) e).drawSize()).setCenter(e.getX(), e.getY()).overlaps(viewport)){ if(!clip || rect.setSize(((DrawTrait) e).drawSize()).setCenter(e.getX(), e.getY()).overlaps(viewport)){
cons.accept(t); cons.accept((T)e);
}
} }
});
} }
} }

View File

@ -50,6 +50,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
private static final Vector2 moveVector = new Vector2(); private static final Vector2 moveVector = new Vector2();
private int lastWeightTile = Pos.invalid, lastWeightDelta; private int lastWeightTile = Pos.invalid, lastWeightDelta;
private boolean wasFlying = false;
public float rotation; public float rotation;
@ -228,13 +229,19 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
} }
public void avoidOthers(float scaling){ public void avoidOthers(float scaling){
if(isFlying()) return; boolean flying = isFlying();
if(lastWeightTile != Pos.invalid){ if(lastWeightTile != Pos.invalid){
Tile tile = world.tile(lastWeightTile); Tile tile = world.tile(lastWeightTile);
if(tile != null){ if(tile != null){
tile.weight -= Math.min(lastWeightDelta, tile.weight); int dec = Math.min(lastWeightDelta, wasFlying ? tile.airWeight : tile.weight);
if(!wasFlying){
tile.weight -= dec;
}else{
tile.airWeight -= dec;
}
} }
} }
@ -245,25 +252,32 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
for(int cy = -rad; cy <= rad; cy++){ for(int cy = -rad; cy <= rad; cy++){
Tile tile = world.tileWorld(x + cx*tilesize, y + cy*tilesize); Tile tile = world.tileWorld(x + cx*tilesize, y + cy*tilesize);
if(tile == null) continue; if(tile == null) continue;
int weight = flying ? tile.airWeight : tile.weight;
float scl = (rad - Mathf.dst(tile.worldx(), tile.worldy(), x, y)/(8f * 1.2f * Mathf.sqrt2)) * 0.1f; float scl = (rad - Mathf.dst(tile.worldx(), tile.worldy(), x, y)/(8f * 1.2f * Mathf.sqrt2)) * 0.1f;
moveVector.add(Mathf.sign(x - tile.worldx()) * scaling * tile.weight * scl, Mathf.sign(y - tile.worldy()) * scaling * tile.weight * scl); moveVector.add(Mathf.sign(x - tile.worldx()) * scaling * weight * scl, Mathf.sign(y - tile.worldy()) * scaling * weight * scl);
} }
} }
moveVector.limit(0.2f); moveVector.limit(flying ? 0.1f : 0.2f);
applyImpulse(moveVector.x, moveVector.y); applyImpulse(moveVector.x, moveVector.y);
Tile tile = world.tileWorld(x, y); Tile tile = world.tileWorld(x, y);
if(tile != null){ if(tile != null){
lastWeightDelta = Math.min((int)(mass()), 127 - tile.weight); int tw = flying ? tile.airWeight : tile.weight;
lastWeightDelta = Math.min((int)(mass()), 127 - tw);
lastWeightTile = tile.pos(); lastWeightTile = tile.pos();
if(!flying){
tile.weight += lastWeightDelta; tile.weight += lastWeightDelta;
}else{
tile.airWeight += lastWeightDelta;
}
}else{ }else{
lastWeightTile = Pos.invalid; lastWeightTile = Pos.invalid;
} }
wasFlying = flying;
} }
public TileEntity getClosestCore(){ public TileEntity getClosestCore(){

View File

@ -32,7 +32,7 @@ public class Tile implements Position, TargetTrait{
/** Tile traversal cost. */ /** Tile traversal cost. */
public byte cost = 1; public byte cost = 1;
/** Weight of [ground] units on this tile.*/ /** Weight of [ground] units on this tile.*/
public byte weight = 0; public byte weight, airWeight = 0;
/** Tile entity, usually null. */ /** Tile entity, usually null. */
public TileEntity entity; public TileEntity entity;
public short x, y; public short x, y;