Create BulletAnimationRunner
This commit is contained in:
@@ -0,0 +1,152 @@
|
||||
package com.bartlomiejpluta.base.lib.animation;
|
||||
|
||||
import com.bartlomiejpluta.base.api.animation.Animation;
|
||||
import com.bartlomiejpluta.base.api.context.Context;
|
||||
import com.bartlomiejpluta.base.api.entity.Entity;
|
||||
import com.bartlomiejpluta.base.api.map.layer.base.Layer;
|
||||
import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer;
|
||||
import com.bartlomiejpluta.base.api.move.Direction;
|
||||
import com.bartlomiejpluta.base.util.path.Path;
|
||||
import org.joml.Vector2fc;
|
||||
import org.joml.Vector2i;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import static java.util.Objects.requireNonNull;
|
||||
|
||||
public class BulletAnimationRunner implements AnimationRunner {
|
||||
private static final Path<Animation> UP = new Path<Animation>().move(Direction.UP);
|
||||
private static final Path<Animation> DOWN = new Path<Animation>().move(Direction.DOWN);
|
||||
private static final Path<Animation> LEFT = new Path<Animation>().move(Direction.LEFT);
|
||||
private static final Path<Animation> RIGHT = new Path<Animation>().move(Direction.RIGHT);
|
||||
|
||||
private final String animationUid;
|
||||
|
||||
private Integer range;
|
||||
private Integer repeat = 1;
|
||||
private float scale = 1.0f;
|
||||
private int delay = 0;
|
||||
private float animationSpeed = 0.05f;
|
||||
private float speed = 0.05f;
|
||||
private float rotation = 0f;
|
||||
private Direction direction;
|
||||
private Path<Animation> path;
|
||||
private Consumer<Entity> onHit;
|
||||
private float offsetX = 0;
|
||||
private float offsetY = 0;
|
||||
|
||||
public BulletAnimationRunner(String animationUid) {
|
||||
this.animationUid = animationUid;
|
||||
}
|
||||
|
||||
public BulletAnimationRunner onHit(Consumer<Entity> runnable) {
|
||||
this.onHit = requireNonNull(runnable);
|
||||
return this;
|
||||
}
|
||||
|
||||
public BulletAnimationRunner range(int n) {
|
||||
this.range = n;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BulletAnimationRunner infiniteRange() {
|
||||
this.range = null;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BulletAnimationRunner repeat(int n) {
|
||||
this.repeat = n;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BulletAnimationRunner infinite() {
|
||||
this.repeat = null;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BulletAnimationRunner scale(float scale) {
|
||||
this.scale = scale;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BulletAnimationRunner delay(int delay) {
|
||||
this.delay = delay;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BulletAnimationRunner animationSpeed(float speed) {
|
||||
this.animationSpeed = speed;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BulletAnimationRunner speed(float speed) {
|
||||
this.speed = speed;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BulletAnimationRunner rotation(float rotation) {
|
||||
this.rotation = rotation;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BulletAnimationRunner offset(float x, float y) {
|
||||
this.offsetX = x;
|
||||
this.offsetY = y;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BulletAnimationRunner direction(Direction direction) {
|
||||
this.direction = direction;
|
||||
this.path = switch (direction) {
|
||||
case UP -> UP;
|
||||
case DOWN -> DOWN;
|
||||
case LEFT -> LEFT;
|
||||
case RIGHT -> RIGHT;
|
||||
};
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Context context, Layer layer, Vector2fc origin) {
|
||||
var animation = new BulletAnimation(context.createAnimation(animationUid), delay, direction, onHit);
|
||||
animation.setPosition(origin.x() + offsetX, origin.y() + offsetY);
|
||||
animation.setScale(scale);
|
||||
animation.setAnimationSpeed(animationSpeed);
|
||||
animation.setSpeed(speed);
|
||||
animation.setRotation(rotation);
|
||||
animation.setRepeat(repeat);
|
||||
animation.setPositionOffset(offsetX, offsetY);
|
||||
|
||||
animation.followPath(path, range, true, true);
|
||||
|
||||
layer.pushAnimation(animation);
|
||||
}
|
||||
|
||||
private static class BulletAnimation extends DelayedAnimation {
|
||||
private final Direction direction;
|
||||
private final Consumer<Entity> action;
|
||||
|
||||
public BulletAnimation(Animation animation, int delay, Direction direction, Consumer<Entity> action) {
|
||||
super(animation, delay);
|
||||
this.direction = direction;
|
||||
this.action = action;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFinish(Layer layer) {
|
||||
if (action != null) {
|
||||
var target = getCoordinates().add(direction.vector, new Vector2i());
|
||||
if (layer instanceof ObjectLayer) {
|
||||
for (var entity : ((ObjectLayer) layer).getEntities()) {
|
||||
var movement = entity.getMovement();
|
||||
if (entity.getCoordinates().equals(target) || movement != null && movement.getTo().equals(target)) {
|
||||
action.accept(entity);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user