From b6aab0873eeb0a279d3c396d7dfa91444460c7d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Thu, 1 Apr 2021 13:36:17 +0200 Subject: [PATCH] Make EntityInstantAnimation returns a CompletableFuture --- .../base/api/entity/Entity.java | 6 +++++- .../base/lib/entity/EntityDelegate.java | 11 +++++++++-- .../world/entity/model/DefaultEntity.java | 16 ++++++++++++++-- .../entity/model/EntityInstantAnimation.java | 18 ++++++++++++------ 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/entity/Entity.java b/api/src/main/java/com/bartlomiejpluta/base/api/entity/Entity.java index 6f963944..cbbff897 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/entity/Entity.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/entity/Entity.java @@ -7,6 +7,8 @@ import com.bartlomiejpluta.base.api.move.Movable; import com.bartlomiejpluta.base.internal.logic.Updatable; import com.bartlomiejpluta.base.internal.render.Renderable; +import java.util.concurrent.CompletableFuture; + public interface Entity extends Movable, Animated, Renderable, Updatable { Direction getFaceDirection(); @@ -35,5 +37,7 @@ public interface Entity extends Movable, Animated, Renderable, Updatable { void setZIndex(int zIndex); - void performInstantAnimation(Direction targetFaceDirection, Runnable onFinish); + CompletableFuture performInstantAnimation(); + + CompletableFuture performInstantAnimation(Direction targetFaceDirection); } diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/entity/EntityDelegate.java b/api/src/main/java/com/bartlomiejpluta/base/lib/entity/EntityDelegate.java index 25b1b1ba..a50efb04 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/lib/entity/EntityDelegate.java +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/entity/EntityDelegate.java @@ -13,6 +13,8 @@ import org.joml.Matrix4fc; import org.joml.Vector2fc; import org.joml.Vector2ic; +import java.util.concurrent.CompletableFuture; + public abstract class EntityDelegate implements Entity { protected final Entity entity; @@ -266,8 +268,13 @@ public abstract class EntityDelegate implements Entity { } @Override - public void performInstantAnimation(Direction targetFaceDirection, Runnable onFinish) { - entity.performInstantAnimation(targetFaceDirection, onFinish); + public CompletableFuture performInstantAnimation() { + return entity.performInstantAnimation(); + } + + @Override + public CompletableFuture performInstantAnimation(Direction targetFaceDirection) { + return entity.performInstantAnimation(targetFaceDirection); } @Override diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/entity/model/DefaultEntity.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/entity/model/DefaultEntity.java index 0c945fbf..66ec4a04 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/entity/model/DefaultEntity.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/entity/model/DefaultEntity.java @@ -21,6 +21,7 @@ import org.joml.Vector2i; import java.util.LinkedList; import java.util.Map; import java.util.Queue; +import java.util.concurrent.CompletableFuture; import static java.util.Objects.requireNonNull; @@ -119,8 +120,19 @@ public class DefaultEntity extends MovableSprite implements Entity { } @Override - public void performInstantAnimation(Direction targetFaceDirection, Runnable onFinish) { - instantAnimations.add(new EntityInstantAnimation(this, defaultSpriteColumn, targetFaceDirection, onFinish)); + public CompletableFuture performInstantAnimation() { + var animation = new EntityInstantAnimation(this, defaultSpriteColumn); + instantAnimations.add(animation); + + return animation.getFuture(); + } + + @Override + public CompletableFuture performInstantAnimation(Direction targetFaceDirection) { + var animation = new EntityInstantAnimation(this, defaultSpriteColumn, targetFaceDirection); + instantAnimations.add(animation); + + return animation.getFuture(); } @Override diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/entity/model/EntityInstantAnimation.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/entity/model/EntityInstantAnimation.java index f8b5ac02..98004c36 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/entity/model/EntityInstantAnimation.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/entity/model/EntityInstantAnimation.java @@ -1,6 +1,9 @@ package com.bartlomiejpluta.base.engine.world.entity.model; import com.bartlomiejpluta.base.api.move.Direction; +import lombok.Getter; + +import java.util.concurrent.CompletableFuture; public class EntityInstantAnimation { @@ -8,15 +11,20 @@ public class EntityInstantAnimation { private final int firstFrame; private final int lastFrame; private final Direction faceDirectionOnFinish; - private final Runnable onFinish; private boolean finished = false; - EntityInstantAnimation(DefaultEntity entity, int firstFrame, Direction faceDirectionOnFinish, Runnable onFinish) { + @Getter + private final CompletableFuture future = new CompletableFuture<>(); + + EntityInstantAnimation(DefaultEntity entity, int firstFrame) { + this(entity, firstFrame, null); + } + + EntityInstantAnimation(DefaultEntity entity, int firstFrame, Direction faceDirectionOnFinish) { this.entity = entity; this.firstFrame = firstFrame; this.lastFrame = entity.getMaterial().getTexture().getColumns() - 1; this.faceDirectionOnFinish = faceDirectionOnFinish; - this.onFinish = onFinish; } public boolean updateFrame() { @@ -30,9 +38,7 @@ public class EntityInstantAnimation { entity.setFaceDirection(faceDirectionOnFinish); } - if (onFinish != null) { - onFinish.run(); - } + future.complete(null); return true; }