59 lines
1.5 KiB
Java
59 lines
1.5 KiB
Java
package mindustry.entities.comp;
|
|
|
|
import arc.math.geom.*;
|
|
import arc.util.*;
|
|
import mindustry.annotations.Annotations.*;
|
|
import mindustry.entities.EntityCollisions.*;
|
|
import mindustry.gen.*;
|
|
|
|
import static mindustry.Vars.*;
|
|
|
|
@Component
|
|
abstract class VelComp implements Posc{
|
|
@Import float x, y;
|
|
|
|
//TODO @SyncLocal this? does it even need to be sent?
|
|
transient final Vec2 vel = new Vec2();
|
|
transient float drag = 0f;
|
|
|
|
//velocity needs to be called first, as it affects delta and lastPosition
|
|
@MethodPriority(-1)
|
|
@Override
|
|
public void update(){
|
|
move(vel.x * Time.delta, vel.y * Time.delta);
|
|
vel.scl(Math.max(1f - drag * Time.delta, 0));
|
|
}
|
|
|
|
/** @return function to use for check solid state. if null, no checking is done. */
|
|
@Nullable
|
|
SolidPred solidity(){
|
|
return null;
|
|
}
|
|
|
|
/** @return whether this entity can move through a location*/
|
|
boolean canPass(int tileX, int tileY){
|
|
SolidPred s = solidity();
|
|
return s == null || !s.solid(tileX, tileY);
|
|
}
|
|
|
|
/** @return whether this entity can exist on its current location*/
|
|
boolean canPassOn(){
|
|
return canPass(tileX(), tileY());
|
|
}
|
|
|
|
boolean moving(){
|
|
return !vel.isZero(0.01f);
|
|
}
|
|
|
|
void move(float cx, float cy){
|
|
SolidPred check = solidity();
|
|
|
|
if(check != null){
|
|
collisions.move(self(), cx, cy, check);
|
|
}else{
|
|
x += cx;
|
|
y += cy;
|
|
}
|
|
}
|
|
}
|