Initial implementation
This commit is contained in:
@@ -7,7 +7,6 @@ import io.anuke.arc.graphics.g2d.Draw;
|
||||
import io.anuke.arc.graphics.g2d.TextureRegion;
|
||||
import io.anuke.arc.math.Mathf;
|
||||
import io.anuke.arc.math.geom.Geometry;
|
||||
import io.anuke.arc.math.geom.Rectangle;
|
||||
import io.anuke.arc.math.geom.Vector2;
|
||||
import io.anuke.arc.util.Time;
|
||||
import io.anuke.arc.util.Tmp;
|
||||
@@ -15,7 +14,6 @@ import io.anuke.mindustry.content.Blocks;
|
||||
import io.anuke.mindustry.content.Fx;
|
||||
import io.anuke.mindustry.entities.Damage;
|
||||
import io.anuke.mindustry.entities.Effects;
|
||||
import io.anuke.mindustry.entities.Units;
|
||||
import io.anuke.mindustry.entities.effect.ScorchDecal;
|
||||
import io.anuke.mindustry.entities.impl.DestructibleEntity;
|
||||
import io.anuke.mindustry.entities.traits.*;
|
||||
@@ -49,9 +47,10 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
|
||||
public static final float maxAbsVelocity = 127f / velocityPercision;
|
||||
public static final int noSpawner = Pos.get(-1, 1);
|
||||
|
||||
private static final Rectangle queryRect = new Rectangle();
|
||||
private static final Vector2 moveVector = new Vector2();
|
||||
|
||||
private int lastWeightTile = Pos.invalid, lastWeightDelta;
|
||||
|
||||
public float rotation;
|
||||
|
||||
protected final Interpolator interpolator = new Interpolator();
|
||||
@@ -140,6 +139,15 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removed(){
|
||||
Tile tile = world.tile(lastWeightTile);
|
||||
|
||||
if(tile != null){
|
||||
tile.weight -= Math.max(lastWeightDelta, tile.weight);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValid(){
|
||||
return !isDead() && isAdded();
|
||||
@@ -190,8 +198,8 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
|
||||
}
|
||||
|
||||
protected void clampPosition(){
|
||||
x = Mathf.clamp(x, tilesize, world.width() * tilesize - tilesize);
|
||||
y = Mathf.clamp(y, tilesize, world.height() * tilesize - tilesize);
|
||||
x = Mathf.clamp(x, 0, world.width() * tilesize - tilesize);
|
||||
y = Mathf.clamp(y, 0, world.height() * tilesize - tilesize);
|
||||
}
|
||||
|
||||
public void kill(){
|
||||
@@ -219,17 +227,41 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
|
||||
return status.hasEffect(effect);
|
||||
}
|
||||
|
||||
//TODO optimize
|
||||
public void avoidOthers(float scaling){
|
||||
hitbox(queryRect);
|
||||
queryRect.setSize(queryRect.getWidth() * scaling);
|
||||
if(isFlying()) return;
|
||||
|
||||
Units.getNearby(queryRect, t -> {
|
||||
if(t == this || t.isFlying() != isFlying()) return;
|
||||
float dst = dst(t);
|
||||
moveVector.set(x, y).sub(t.getX(), t.getY()).setLength(1f * (1f - (dst / queryRect.getWidth())));
|
||||
applyImpulse(moveVector.x, moveVector.y);
|
||||
});
|
||||
if(lastWeightTile != Pos.invalid){
|
||||
Tile tile = world.tile(lastWeightTile);
|
||||
|
||||
if(tile != null){
|
||||
tile.weight -= Math.min(lastWeightDelta, tile.weight);
|
||||
}
|
||||
}
|
||||
|
||||
final int rad = 1;
|
||||
|
||||
moveVector.setZero();
|
||||
for(int cx = -rad; cx <= rad; cx++){
|
||||
for(int cy = -rad; cy <= rad; cy++){
|
||||
Tile tile = world.tileWorld(x + cx*tilesize, y + cy*tilesize);
|
||||
if(tile == null) continue;
|
||||
float scl = (Math.abs(cx) + Math.abs(cy) > 1 ? 1f / Mathf.sqrt2 : Math.abs(cx) + Math.abs(cy) == 1 ? 0.8f : 1f) * 0.2f;
|
||||
|
||||
moveVector.add(-cx * scaling * tile.weight * scl, -cy*scaling * tile.weight * scl);
|
||||
}
|
||||
}
|
||||
|
||||
applyImpulse(moveVector.x, moveVector.y);
|
||||
|
||||
Tile tile = world.tileWorld(x, y);
|
||||
|
||||
if(tile != null){
|
||||
lastWeightDelta = Math.min((int)(mass()), 127 - tile.weight);
|
||||
lastWeightTile = tile.pos();
|
||||
tile.weight += lastWeightDelta;
|
||||
}else{
|
||||
lastWeightTile = Pos.invalid;
|
||||
}
|
||||
}
|
||||
|
||||
public TileEntity getClosestCore(){
|
||||
|
||||
@@ -31,6 +31,8 @@ public class Tile implements Position, TargetTrait{
|
||||
public byte link = 0;
|
||||
/** Tile traversal cost. */
|
||||
public byte cost = 1;
|
||||
/** Weight of [ground] units on this tile.*/
|
||||
public byte weight = 0;
|
||||
/** Tile entity, usually null. */
|
||||
public TileEntity entity;
|
||||
public short x, y;
|
||||
|
||||
Reference in New Issue
Block a user