mirror of
https://github.com/Anuken/Mindustry.git
synced 2025-02-13 12:16:53 +07:00
Better conveyor animations
This commit is contained in:
parent
a234949b8c
commit
79c8548171
@ -20,6 +20,7 @@ import static mindustry.Vars.*;
|
||||
public class MassConveyor extends Block{
|
||||
public float moveTime = 70f;
|
||||
public TextureRegion topRegion, edgeRegion;
|
||||
public Interpolation interp = Interpolation.pow5;
|
||||
|
||||
public MassConveyor(String name){
|
||||
super(name);
|
||||
@ -40,7 +41,7 @@ public class MassConveyor extends Block{
|
||||
|
||||
public class MassConveyorEntity extends TileEntity implements MassAcceptor{
|
||||
public @Nullable Payload item;
|
||||
public float progress, itemRotation;
|
||||
public float progress, itemRotation, animation;
|
||||
public @Nullable MassAcceptor next;
|
||||
public boolean blocked;
|
||||
public int step = -1, stepAccepted = -1;
|
||||
@ -58,7 +59,7 @@ public class MassConveyor extends Block{
|
||||
|
||||
int ntrns = 1 + size/2;
|
||||
Tile next = tile.getNearby(Geometry.d4[rotation()].x * ntrns, Geometry.d4[rotation()].y * ntrns);
|
||||
blocked = next != null && next.solid();
|
||||
blocked = (next != null && next.solid()) || (this.next != null && (this.next.rotation() + 2)%4 == rotation());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -66,33 +67,38 @@ public class MassConveyor extends Block{
|
||||
progress = Time.time() % moveTime;
|
||||
|
||||
//TODO DEBUG
|
||||
if(Core.input.keyTap(KeyCode.G) && world.tileWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y) == tile){
|
||||
item = new UnitPayload(UnitTypes.dagger.create(Team.sharded));
|
||||
if(Core.input.keyTap(KeyCode.G) && world.entWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y) == this){
|
||||
item = new UnitPayload((Mathf.chance(0.5) ? UnitTypes.wraith : UnitTypes.dagger).create(Team.sharded));
|
||||
itemRotation = rotation() * 90;
|
||||
animation = 0f;
|
||||
}
|
||||
|
||||
int curStep = curStep();
|
||||
if(curStep > step){
|
||||
if(step != -1 && stepAccepted != curStep){
|
||||
if(canMove()){
|
||||
boolean valid = step != -1;
|
||||
step = curStep;
|
||||
|
||||
if(valid && stepAccepted != curStep && item != null){
|
||||
if(next != null){
|
||||
//trigger update forward
|
||||
next.updateTile();
|
||||
|
||||
if(next.acceptMass(item, this)){
|
||||
//move forward.
|
||||
next.handleMass(item, this);
|
||||
item = null;
|
||||
}
|
||||
}
|
||||
|
||||
step = curStep;
|
||||
}
|
||||
|
||||
|
||||
//dumping item forward.
|
||||
if(fract() >= 0.5f && item != null && !blocked && next == null){
|
||||
float trnext = fract() * size * tilesize, cx = Geometry.d4[rotation()].x, cy = Geometry.d4[rotation()].y, rot = rotation() * 90;
|
||||
}else if(!blocked){
|
||||
//dump item forward
|
||||
float trnext = size * tilesize / 2f, cx = Geometry.d4[rotation()].x, cy = Geometry.d4[rotation()].y, rot = rotation() * 90;
|
||||
|
||||
item.dump(x + cx * trnext, y + cy * trnext, rotation() * 90);
|
||||
item = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(){
|
||||
@ -138,16 +144,36 @@ public class MassConveyor extends Block{
|
||||
|
||||
@Override
|
||||
public void drawLayer(){
|
||||
float fract = !blocked ? fract() : fract() > 0.5f ? 1f - fract() : fract();
|
||||
float trnext = fract * size * tilesize, cx = Geometry.d4[rotation()].x, cy = Geometry.d4[rotation()].y, rot = Mathf.slerp(itemRotation, rotation() * 90, fract);
|
||||
//fract:
|
||||
//0: arriving
|
||||
//0.5: middle
|
||||
//1: leaving
|
||||
|
||||
if(animation > fract()){
|
||||
animation = Mathf.lerp(animation, 0.8f, 0.15f);
|
||||
}
|
||||
|
||||
animation = Math.max(animation, fract());
|
||||
|
||||
float fract = animation;
|
||||
float rot = Mathf.slerp(itemRotation, rotation() * 90, fract);
|
||||
|
||||
if(fract < 0.5f){
|
||||
Tmp.v1.trns(itemRotation + 180, (0.5f - fract) * tilesize * size);
|
||||
}else{
|
||||
Tmp.v1.trns(rotation() * 90, (fract - 0.5f) * tilesize * size);
|
||||
}
|
||||
|
||||
float vx = Tmp.v1.x, vy = Tmp.v1.y;
|
||||
|
||||
if(item != null){
|
||||
Draw.color(0, 0, 0, 0.4f);
|
||||
float size = 21;
|
||||
Draw.rect("circle-shadow", x + cx * trnext, y + cy * trnext, size, size);
|
||||
float size = 24;
|
||||
Draw.rect("circle-shadow", x + vx, y + vy, size, size);
|
||||
Draw.color();
|
||||
Draw.rect("pneumatic-drill", x + vx, y + vy, rot);
|
||||
|
||||
item.draw(x + cx * trnext, y + cy * trnext, rot);
|
||||
item.draw(x + vx, y + vy, rot);
|
||||
}
|
||||
}
|
||||
|
||||
@ -161,11 +187,12 @@ public class MassConveyor extends Block{
|
||||
this.item = item;
|
||||
this.stepAccepted = curStep();
|
||||
this.itemRotation = source.rotation() * 90;
|
||||
this.animation = 0;
|
||||
}
|
||||
|
||||
boolean blends(int direction){
|
||||
if(direction == rotation()){
|
||||
return !blocked;
|
||||
return !blocked || next != null;
|
||||
}else{
|
||||
Tilec accept = nearby(Geometry.d4[direction].x * size, Geometry.d4[direction].y * size);
|
||||
return accept instanceof MassAcceptor && accept.block().size == size &&
|
||||
@ -173,10 +200,6 @@ public class MassConveyor extends Block{
|
||||
}
|
||||
}
|
||||
|
||||
boolean canMove(){
|
||||
return item != null && next != null && next.acceptMass(item, this);
|
||||
}
|
||||
|
||||
TextureRegion clipRegion(Rect bounds, Rect sprite, TextureRegion region){
|
||||
Rect over = Tmp.r3;
|
||||
|
||||
@ -206,7 +229,7 @@ public class MassConveyor extends Block{
|
||||
}
|
||||
|
||||
float fract(){
|
||||
return Interpolation.pow5.apply(progress / moveTime);
|
||||
return interp.apply(progress / moveTime);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,3 @@
|
||||
org.gradle.daemon=true
|
||||
org.gradle.jvmargs=-Xms256m -Xmx1024m
|
||||
archash=2b64b11475b00658cd99050063e88bec31064748
|
||||
archash=b47ef8107460bacd15f90e805b60ad826ead16f1
|
||||
|
Loading…
Reference in New Issue
Block a user