From b773d8e92a03a3416b1ff63aacf37be22f09c9f3 Mon Sep 17 00:00:00 2001 From: valyrie97 Date: Mon, 26 Dec 2022 15:25:22 -0500 Subject: [PATCH] smooth pawn motion rendering --- .../java/xyz/valnet/engine/math/Vector2f.java | 4 ++++ .../xyz/valnet/hadean/gameobjects/Camera.java | 8 ++++++++ .../hadean/gameobjects/worldobjects/Pawn.java | 2 +- .../gameobjects/worldobjects/agents/Agent.java | 16 ++++++++++++++++ .../java/xyz/valnet/hadean/pathfinding/Path.java | 4 ++++ 5 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/main/java/xyz/valnet/engine/math/Vector2f.java b/src/main/java/xyz/valnet/engine/math/Vector2f.java index 4ce9caf..9220997 100644 --- a/src/main/java/xyz/valnet/engine/math/Vector2f.java +++ b/src/main/java/xyz/valnet/engine/math/Vector2f.java @@ -22,4 +22,8 @@ public class Vector2f { return x == v.x && y == v.y; } + public Vector2f add(Vector2f v) { + return new Vector2f(x + v.x, y + v.y); + } + } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java b/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java index 4f4fb7d..05327df 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java @@ -34,6 +34,10 @@ public class Camera extends GameObject { return new Vector2f(x * tileWidth + screenWidth / 2 - focus.x * tileWidth, y * tileWidth + screenHeight / 2 - focus.y * tileWidth); } + public Vector2f world2screen(Vector2f pos) { + return world2screen(pos.x, pos.y); + } + public Vector2f screen2world(float x, float y) { return new Vector2f((x - screenWidth / 2 + focus.x * tileWidth) / tileWidth, (y - screenHeight / 2 + focus.y * tileWidth) / tileWidth); } @@ -63,6 +67,10 @@ public class Camera extends GameObject { draw(layer, sprite, x, y, 1, 1); } + public void draw(float layer, Sprite sprite, Vector2f pos) { + draw(layer, sprite, pos.x, pos.y, 1, 1); + } + public void draw(float layer, Sprite sprite, float x, float y, float w, float h) { Vector2f screenPos = world2screen(x, y); Drawing.setLayer(layer + (((y + h) - minY) / (maxY - minY))); diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Pawn.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Pawn.java index 07a78bd..44cd3af 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Pawn.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Pawn.java @@ -28,7 +28,7 @@ public class Pawn extends Agent implements IWorker { @Override public void render() { super.render(); - camera.draw(Layers.PAWNS, Assets.pawn, x, y); + camera.draw(Layers.PAWNS, Assets.pawn, getCalculatedPosition()); } @Override diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java index 6284837..4608aaa 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java @@ -22,6 +22,7 @@ import xyz.valnet.hadean.pathfinding.Path; import xyz.valnet.hadean.util.Action; import xyz.valnet.hadean.util.Assets; import xyz.valnet.hadean.util.Layers; +import static xyz.valnet.engine.util.Math.lerp; public abstract class Agent extends WorldObject implements ISelectable { public abstract String getName(); @@ -35,6 +36,15 @@ public abstract class Agent extends WorldObject implements ISelectable { return path != null && !path.isComplete(); } + protected Vector2f getCalculatedPosition() { + if(path == null || path.isComplete()) return getWorldPosition(); + Vector2f nextPos = path.peek().getPosition().asFloat(); + return new Vector2f( + lerp(x, nextPos.x, frameCounter / (float)speed), + lerp(y, nextPos.y, frameCounter / (float)speed) + ); + } + @Override public void start() { super.start(); @@ -108,6 +118,7 @@ public abstract class Agent extends WorldObject implements ISelectable { Drawing.setLayer(Layers.GENERAL_UI); Assets.flat.pushColor(Vector4f.opacity(0.4f)); if(path != null) { + int count = 0; for(Node node : path) { glBegin(GL_LINES); Vector2f u, v; @@ -116,11 +127,16 @@ public abstract class Agent extends WorldObject implements ISelectable { else u = camera.world2screen(node.from.x + 0.5f, node.from.y + 0.5f); v = camera.world2screen(node.x + 0.5f, node.y + 0.5f); + + if(count == path.getLength() - 1) { + u = camera.world2screen(getCalculatedPosition().add(new Vector2f(0.5f, 0.5f))); + } glVertexAttrib2f(SimpleShader.TEX_COORD, 0, 88 / 256f); glVertex3f(u.x, u.y, 3f); glVertexAttrib2f(SimpleShader.TEX_COORD, 0, 88 / 255f); glVertex3f(v.x, v.y, 3f); glEnd(); + count ++; } Assets.flat.swapColor(Vector4f.opacity(0.6f)); diff --git a/src/main/java/xyz/valnet/hadean/pathfinding/Path.java b/src/main/java/xyz/valnet/hadean/pathfinding/Path.java index 528b137..b324831 100644 --- a/src/main/java/xyz/valnet/hadean/pathfinding/Path.java +++ b/src/main/java/xyz/valnet/hadean/pathfinding/Path.java @@ -14,6 +14,10 @@ public class Path implements Iterable { this.dst = dst; } + public int getLength() { + return nodes.size(); + } + public Node peek() { return nodes.peek(); }