From dc472265ab673e59915009bed5f6837983fd2b6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Thu, 1 Apr 2021 12:29:48 +0200 Subject: [PATCH] Enable queueing entity instant animations --- .../base/api/entity/Entity.java | 2 ++ .../base/lib/entity/EntityDelegate.java | 5 +++++ .../world/animation/model/AnimatedSprite.java | 16 +++------------ .../world/entity/model/DefaultEntity.java | 20 +++++++++++++------ 4 files changed, 24 insertions(+), 19 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..2890ceb8 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 @@ -35,5 +35,7 @@ public interface Entity extends Movable, Animated, Renderable, Updatable { void setZIndex(int zIndex); + void performInstantAnimation(Direction targetFaceDirection); + void performInstantAnimation(Direction targetFaceDirection, Runnable onFinish); } 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..6b0f839d 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 @@ -265,6 +265,11 @@ public abstract class EntityDelegate implements Entity { entity.setZIndex(zIndex); } + @Override + public void performInstantAnimation(Direction targetFaceDirection) { + entity.performInstantAnimation(targetFaceDirection); + } + @Override public void performInstantAnimation(Direction targetFaceDirection, Runnable onFinish) { entity.performInstantAnimation(targetFaceDirection, onFinish); diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/model/AnimatedSprite.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/model/AnimatedSprite.java index 66fac956..2fe7fd90 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/model/AnimatedSprite.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/animation/model/AnimatedSprite.java @@ -1,12 +1,9 @@ package com.bartlomiejpluta.base.engine.world.animation.model; import com.bartlomiejpluta.base.api.animation.Animated; -import com.bartlomiejpluta.base.api.camera.Camera; -import com.bartlomiejpluta.base.api.screen.Screen; import com.bartlomiejpluta.base.engine.core.gl.object.material.Material; import com.bartlomiejpluta.base.engine.core.gl.object.mesh.Mesh; import com.bartlomiejpluta.base.engine.world.object.Sprite; -import com.bartlomiejpluta.base.internal.render.ShaderManager; import com.bartlomiejpluta.base.util.math.MathUtil; import lombok.EqualsAndHashCode; import org.joml.Vector2fc; @@ -39,21 +36,14 @@ public abstract class AnimatedSprite extends Sprite implements Animated { @Override public void update(float dt) { - time = shouldAnimate() ? time + ((int) (dt * 1000)) : 0; - } - - @Override - public void render(Screen screen, Camera camera, ShaderManager shaderManager) { - animate(); - super.render(screen, camera, shaderManager); - } - - private void animate() { if (shouldAnimate()) { + time += dt * 1000; var positions = getSpriteAnimationFramesPositions(); currentAnimationFrame = ((time % (positions.length * intervalInMilliseconds)) / intervalInMilliseconds); var current = positions[currentAnimationFrame]; material.setSpritePosition(current); + } else { + time = 0; } } } 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 13720700..deac1ece 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 @@ -18,7 +18,9 @@ import org.joml.Vector2f; import org.joml.Vector2fc; import org.joml.Vector2i; +import java.util.LinkedList; import java.util.Map; +import java.util.Queue; import static java.util.Objects.requireNonNull; @@ -46,7 +48,7 @@ public class DefaultEntity extends MovableSprite implements Entity { private boolean animationEnabled = true; - private EntityInstantAnimation instantAnimation; + private final Queue instantAnimations = new LinkedList<>(); public DefaultEntity(Mesh mesh, EntitySetManager entitySetManager, Map spriteDirectionRows, Map spriteDefaultRows, String entitySetUid) { super(mesh, entitySetManager.loadObject(requireNonNull(entitySetUid))); @@ -93,7 +95,7 @@ public class DefaultEntity extends MovableSprite implements Entity { @Override protected boolean shouldAnimate() { - return animationEnabled && (isMoving() || instantAnimation != null); + return animationEnabled && (isMoving() || !instantAnimations.isEmpty()); } @Override @@ -114,9 +116,14 @@ public class DefaultEntity extends MovableSprite implements Entity { material.setSpritePosition(spriteDefaultRows.get(faceDirection)); } + @Override + public void performInstantAnimation(Direction targetFaceDirection) { + instantAnimations.add(new EntityInstantAnimation(this, targetFaceDirection, null)); + } + @Override public void performInstantAnimation(Direction targetFaceDirection, Runnable onFinish) { - instantAnimation = new EntityInstantAnimation(this, targetFaceDirection, onFinish); + instantAnimations.add(new EntityInstantAnimation(this, targetFaceDirection, onFinish)); } @Override @@ -203,11 +210,12 @@ public class DefaultEntity extends MovableSprite implements Entity { @Override public void render(Screen screen, Camera camera, ShaderManager shaderManager) { - super.render(screen, camera, shaderManager); - + var instantAnimation = instantAnimations.peek(); if (instantAnimation != null && instantAnimation.updateFrame()) { - instantAnimation = null; + instantAnimations.poll(); } + + super.render(screen, camera, shaderManager); } int currentFrame() {