From 557d0eb5696ab27ea27d9dd607a2d73f6d9b386b Mon Sep 17 00:00:00 2001 From: Valerie Date: Fri, 20 May 2022 00:02:00 -0400 Subject: [PATCH] epix camera & routing --- res/textures.png | Bin 7744 -> 7746 bytes src/main/java/xyz/valnet/engine/App.java | 2 +- .../xyz/valnet/engine/graphics/Drawing.java | 54 ++++----- .../java/xyz/valnet/engine/math/Vector2f.java | 17 +++ .../valnet/engine/scenegraph/GameObject.java | 2 + .../java/xyz/valnet/hadean/HadeanGame.java | 4 +- src/main/java/xyz/valnet/hadean/Tile.java | 17 ++- .../xyz/valnet/hadean/gameobjects/Camera.java | 35 ++++++ .../xyz/valnet/hadean/gameobjects/Pawn.java | 113 +++++++++++------- .../valnet/hadean/gameobjects/Terrain.java | 28 +++-- .../xyz/valnet/hadean/scenes/GameScene.java | 7 ++ 11 files changed, 188 insertions(+), 91 deletions(-) create mode 100644 src/main/java/xyz/valnet/engine/math/Vector2f.java create mode 100644 src/main/java/xyz/valnet/hadean/gameobjects/Camera.java diff --git a/res/textures.png b/res/textures.png index 82599410e35fc30d49279b5bf946cc19fd45631e..eb12416371613fee062aa1e8a3b73642287d5498 100644 GIT binary patch delta 7073 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 RoB)51>Ql`pRf<+&{{?89", 1, 17); Assets.font.drawString("MEMORY: " + (int)((allocated / (double)max) * 100) + "% (" + (allocated / (1024 * 1024)) + "/" + (max / (1024 * 1024)) + "MB)", 1, 33); - Assets.font.drawString("", 1, 49); + Assets.font.drawString("IPATHABLE", 1, 49); Assets.font.drawString("", 1, 65); Assets.font.drawString("", 1, 81); @@ -47,7 +47,7 @@ public class HadeanGame extends Game { Assets.font.drawString("FPS: " + Math.round(averageFPS) + "/" + measuredFPS + " | AVG/MEASURED", 0, 0); Assets.font.drawString("Mouse: <" + App.mouseX + ", " + App.mouseY + ">", 0, 16); Assets.font.drawString("MEMORY: " + (int)((allocated / (double)max) * 100) + "% (" + (allocated / (1024 * 1024)) + "/" + (max / (1024 * 1024)) + "MB)", 0, 32); - Assets.font.drawString("", 0, 48); + Assets.font.drawString("IPATHABLE", 0, 48); Assets.font.drawString("", 0, 64); Assets.font.drawString("", 0, 80); diff --git a/src/main/java/xyz/valnet/hadean/Tile.java b/src/main/java/xyz/valnet/hadean/Tile.java index cd56361..18a126a 100644 --- a/src/main/java/xyz/valnet/hadean/Tile.java +++ b/src/main/java/xyz/valnet/hadean/Tile.java @@ -3,28 +3,35 @@ package xyz.valnet.hadean; import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.graphics.Sprite; import xyz.valnet.engine.math.Vector4f; +import xyz.valnet.hadean.gameobjects.Camera; import xyz.valnet.hadean.gameobjects.Terrain; import xyz.valnet.hadean.util.Assets; +// TODO make these tiles REAL gameobjects... public class Tile { private final int x, y; private final Vector4f color = new Vector4f((float) Math.random() * 0.1f, 0.4f + (float) Math.random() * 0.15f, (float) Math.random() * 0.05f, 1f); private final Sprite sprite = Assets.defaultTerrain[(int)Math.floor(Math.random() * Assets.defaultTerrain.length)]; - private final boolean obstacle; + private boolean obstacle; public Tile(int x, int y) { - float distanceFromOrigin = 0.9f - (float)Math.sqrt(x * x + y * y) / 42; this.x = x; this.y = y; - this.obstacle = Math.random() > 0.8f; + this.obstacle = false; + // this.obstacle = Math.random() > 0.8f; } - public void render() { + public void render(Camera camera) { Assets.flat.pushColor(isWalkable() ? color : new Vector4f(0.1f, 0.1f, 0.1f, 1f)); - Drawing.drawSprite(sprite, Terrain.left + x * Terrain.TILE_SIZE, Terrain.top + y * Terrain.TILE_SIZE); + camera.draw(sprite, x, y); + // Drawing.drawSprite(sprite, Terrain.left + x * Terrain.TILE_SIZE, Terrain.top + y * Terrain.TILE_SIZE); Assets.flat.popColor(); } + public void wall() { + obstacle = true; + } + public boolean isWalkable() { return !obstacle; } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java b/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java new file mode 100644 index 0000000..91980a8 --- /dev/null +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java @@ -0,0 +1,35 @@ +package xyz.valnet.hadean.gameobjects; + +import xyz.valnet.engine.graphics.Drawing; +import xyz.valnet.engine.graphics.Sprite; +import xyz.valnet.engine.math.Vector2f; +import xyz.valnet.engine.scenegraph.GameObject; +import xyz.valnet.hadean.scenes.GameScene; + +public class Camera extends GameObject { + + private int tileWidth = 24; + // TODO link these in some way to the real resolution. + private int screenWidth = 1024, screenHeight = 576; + + private Vector2f focus = new Vector2f(0, 0); + + public Camera(GameScene scene) { + super(scene); + } + + public void focus(float x, float y) { + this.focus.x = x; + this.focus.y = y; + } + + public Vector2f world2screen(float x, float y) { + return new Vector2f(x * tileWidth + screenWidth / 2 - focus.x * tileWidth, y * tileWidth + screenHeight / 2 - focus.y * tileWidth); + } + + public void draw(Sprite sprite, float x, float y) { + Vector2f screenPos = world2screen(x, y); + Drawing.drawSprite(sprite, (int)(screenPos.x), (int)(screenPos.y), tileWidth, tileWidth); + } + +} diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Pawn.java b/src/main/java/xyz/valnet/hadean/gameobjects/Pawn.java index 131c223..9422de9 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Pawn.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Pawn.java @@ -1,69 +1,71 @@ package xyz.valnet.hadean.gameobjects; +import static org.lwjgl.opengl.GL11.GL_LINES; +import static org.lwjgl.opengl.GL11.glBegin; +import static org.lwjgl.opengl.GL11.glEnd; +import static org.lwjgl.opengl.GL11.glVertex2f; import static xyz.valnet.engine.util.Math.lerp; import java.util.Stack; import xyz.valnet.engine.graphics.Drawing; -import xyz.valnet.engine.math.Vector4f; +import xyz.valnet.engine.math.Vector2f; import xyz.valnet.engine.scenegraph.GameObject; +import xyz.valnet.hadean.Tile; import xyz.valnet.hadean.pathfinding.Node; import xyz.valnet.hadean.scenes.GameScene; import xyz.valnet.hadean.util.Assets; -import static org.lwjgl.opengl.GL20.*; -// import org.lwjgl.opengl.GL20; - public class Pawn extends GameObject { - private float x, y; + private float x = 0.5f, y = 0.5f; private float dx, dy; private float counter = 0; private Stack path; - private final float speed = 20f; + private final float speed = 50f; + + private Camera camera; + private Terrain terrain; public Pawn(GameScene scene) { super(scene); } + @Override + public void start() { + camera = get(Camera.class); + terrain = get(Terrain.class); + } + @Override public void render() { - Drawing.setLayer(0.15f); + Drawing.setLayer(0.5f); if(path != null && path.size() > 0) { - float cx = (int)(Terrain.left + (x - 0.5f) * Terrain.TILE_SIZE); - float cy = (int)(Terrain.top + (y - 0.5f) * Terrain.TILE_SIZE); - - Node n = path.peek(); - - float nx = Terrain.left + n.x * Terrain.TILE_SIZE; - float ny = Terrain.top + n.y * Terrain.TILE_SIZE; - - System.out.println("" + n.x + " " + n.y); - - Drawing.drawSprite(Assets.pawn, (int)lerp(cx, nx, counter / speed), (int)lerp(cy, ny, counter / speed)); + Node next = path.peek(); + float t = counter / speed; + camera.draw(Assets.pawn, lerp(x - 0.5f, next.x, t), lerp(y - 0.5f, next.y, t)); if(path != null) { for(Node node : path) { glBegin(GL_LINES); - if(node.from == null) { - glVertex2f(Terrain.left + x * Terrain.TILE_SIZE, Terrain.top + y * Terrain.TILE_SIZE); - } else { - glVertex2f(Terrain.left + (node.from.x + 0.5f) * Terrain.TILE_SIZE, Terrain.top + (node.from.y + 0.5f) * Terrain.TILE_SIZE); - } - glVertex2f(Terrain.left + (node.x + 0.5f) * Terrain.TILE_SIZE, Terrain.top + (node.y + 0.5f) * Terrain.TILE_SIZE); + Vector2f u, v; + + if(node.from == null) u = camera.world2screen(x, y); + 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); + glVertex2f(u.x, u.y); + glVertex2f(v.x, v.y); glEnd(); } } } else { - int nx = (int)(Terrain.left + (x - 0.5f) * Terrain.TILE_SIZE); - int ny = (int)(Terrain.top + (y - 0.5f) * Terrain.TILE_SIZE); - - Drawing.drawSprite(Assets.pawn, nx, ny); + camera.draw(Assets.pawn, x - 0.5f, y - 0.5f); } // Drawing.setLayer(0.1f); @@ -78,34 +80,53 @@ public class Pawn extends GameObject { @Override public void tick(float dTime) { - counter ++; - if(counter >= speed) action(); + if(path != null && !path.empty()) move(); + else newPath(); } + private void newPath() { + // set new destination + dx = 0.5f + (float)Math.floor(Math.random() * Terrain.WORLD_SIZE); + dy = 0.5f + (float)Math.floor(Math.random() * Terrain.WORLD_SIZE); + // and route there. + route(); + } - private void action() { - if(path == null || path.empty()) { - dx = 0.5f + (float)Math.floor(Math.random() * Terrain.WORLD_SIZE); - dy = 0.5f + (float)Math.floor(Math.random() * Terrain.WORLD_SIZE); + private void route() { + // intify all the coordinates + int ix = (int)Math.floor(x); + int iy = (int)Math.floor(y); - int ix = (int)Math.floor(x); - int iy = (int)Math.floor(y); + int idx = (int)Math.floor(dx); + int idy = (int)Math.floor(dy); - int idx = (int)Math.floor(dx); - int idy = (int)Math.floor(dy); + // try to make a new path. + path = get(Terrain.class).getPath(ix, iy, idx, idy); + } - path = get(Terrain.class).getPath(ix, iy, idx, idy); - if(path != null) { - counter = 0; + private void move() { + // check if we CAN move. + Node nextNode = path.peek(); + Tile nextTile = terrain.getTile(nextNode.x, nextNode.y); + if(!nextTile.isWalkable()) { + if(counter > 0) counter --; + if(counter < 0) counter = 0; + if(counter == 0) { + route(); } - } else { - Node n = path.pop(); - x = n.x + 0.5f; - y = n.y + 0.5f; - counter = 0; + return; } + counter ++; + if(counter < speed) return; + + path.pop(); + x = nextNode.x + 0.5f; + y = nextNode.y + 0.5f; + counter = 0; + + nextTile.wall(); } } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java b/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java index 71198c8..5f46511 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java @@ -2,34 +2,40 @@ package xyz.valnet.hadean.gameobjects; import java.util.ArrayList; import java.util.Comparator; -import java.util.LinkedList; import java.util.List; import java.util.Stack; import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.scenegraph.GameObject; -import xyz.valnet.engine.scenegraph.IScene; import xyz.valnet.hadean.Tile; import xyz.valnet.hadean.pathfinding.Node; import xyz.valnet.hadean.scenes.GameScene; - -// implements IPathable, the thing that has callbacks for interfacing with a pathfinder. + +// TODO SPLIT PATHABLES. | implements IPathable, the thing that has callbacks for interfacing with a pathfinder. public class Terrain extends GameObject { - public static final int WORLD_SIZE = 40; + public static final int WORLD_SIZE = 24; public static final int TILE_SIZE = 8; - public static int left, top; + // public static int left, top; private Tile[][] tiles = new Tile[WORLD_SIZE][WORLD_SIZE]; + private Camera camera; + public Terrain(GameScene scene) { super(scene); + } + + public void start() { for (int i = 0; i < WORLD_SIZE; i++) { for (int j = 0; j < WORLD_SIZE; j++) { tiles[i][j] = new Tile(i, j); } } + camera = get(Camera.class); + + camera.focus(WORLD_SIZE / 2, WORLD_SIZE / 2); } public Tile getTile(int x, int y) { @@ -44,8 +50,8 @@ public class Terrain extends GameObject { } private Node getPathfindingNode(int x, int y, List open, List closed, Node parent, int dstX, int dstY) { + // TODO this isnt necessarily the BOUNDS so... think about that. if(x < 0 || y < 0 || x >= WORLD_SIZE || y >= WORLD_SIZE) { - // * out of bounds return null; } @@ -126,6 +132,8 @@ public class Terrain extends GameObject { n = n.from; } + path.pop(); + return path; } @@ -164,13 +172,13 @@ public class Terrain extends GameObject { @Override public void render() { - left = 400 - (WORLD_SIZE * TILE_SIZE / 2); - top = 225 - (WORLD_SIZE * TILE_SIZE / 2); + // left = 400 - (WORLD_SIZE * TILE_SIZE / 2); + // top = 225 - (WORLD_SIZE * TILE_SIZE / 2); Drawing.setLayer(0f); for (int i = 0; i < WORLD_SIZE; i++) { for (int j = 0; j < WORLD_SIZE; j++) { - tiles[i][j].render(); + tiles[i][j].render(camera); } } } diff --git a/src/main/java/xyz/valnet/hadean/scenes/GameScene.java b/src/main/java/xyz/valnet/hadean/scenes/GameScene.java index 1331ed9..4d2e964 100644 --- a/src/main/java/xyz/valnet/hadean/scenes/GameScene.java +++ b/src/main/java/xyz/valnet/hadean/scenes/GameScene.java @@ -5,6 +5,7 @@ import java.util.List; import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.engine.scenegraph.IScene; +import xyz.valnet.hadean.gameobjects.Camera; import xyz.valnet.hadean.gameobjects.Pawn; import xyz.valnet.hadean.gameobjects.Terrain; @@ -45,6 +46,12 @@ public class GameScene implements IScene { for(int i = 0; i < 3; i ++) { objects.add(new Pawn(this)); } + Camera camera = new Camera(this); + objects.add(camera); + + for(GameObject obj : objects) { + obj.start(); + } } @Override