Преглед изворни кода

improve controls, map scrolling depending on player position, zoom, map border, player renderer, refactoring

Hudriwudri пре 4 година
родитељ
комит
efcd7da9fc

BIN
lib/SnuviEngine.jar


+ 0 - 135
src/gameplay/Hiker.java

@@ -1,135 +0,0 @@
-/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
-package gameplay;
-
-import me.hammerle.snuviengine.api.KeyBinding;
-import me.hammerle.snuviengine.api.KeyHandler;
-import me.hammerle.snuviengine.api.Renderer;
-import me.hammerle.snuviengine.api.Texture;
-import org.lwjgl.glfw.GLFW;
-
-/**
- *
- * @author Julia
- */
-public class Hiker {
-
-    private float oldX = 0;
-    private float oldY = 0;
-    private float x = 0;
-    private float y = 0;
-
-    private static final float speed = 2;
-    private static final float maxWidth = 1024;
-    private static final float maxHeight = 1024;
-
-    private enum moveStates {
-        still, left, right, up, down
-    };
-    private moveStates moveState = moveStates.still;
-
-    private static final Texture characterFront = new Texture("res\\character\\characterFront.png");
-    private static final Texture characterLeft = new Texture("res\\character\\characterLeft.png");
-    private static final Texture characterRight = new Texture("res\\character\\characterRight.png");
-    private static final Texture characterBack = new Texture("res\\character\\characterBack.png");
-
-    private static final KeyBinding UP_KEY = KeyHandler.register(GLFW.GLFW_KEY_W);
-    private static final KeyBinding DOWN_KEY = KeyHandler.register(GLFW.GLFW_KEY_S);
-    private static final KeyBinding LEFT_KEY = KeyHandler.register(GLFW.GLFW_KEY_A);
-    private static final KeyBinding RIGHT_KEY = KeyHandler.register(GLFW.GLFW_KEY_D);
-
-    public void Hiker() {
-    }
-
-    public void tick() {
-        calcMoveState();
-        animate();
-
-        oldX = x;
-        oldY = y;
-
-        if (LEFT_KEY.isDown() && moveState != moveStates.up && moveState != moveStates.down && x > 0) {
-            x -= speed;
-        } else if (RIGHT_KEY.isDown() && moveState != moveStates.up && moveState != moveStates.down && x < maxWidth) {
-            x += speed;
-        } else if (UP_KEY.isDown() && moveState != moveStates.left && moveState != moveStates.right && y > 0) {
-            y -= speed;
-        } else if (DOWN_KEY.isDown() && moveState != moveStates.left && moveState != moveStates.right && y < maxHeight) {
-            y += speed;
-        } else {
-            if (x % 32 != 0 || y % 32 != 0) {
-                if (moveState == moveStates.left) {
-                    x -= speed;
-                } else if (moveState == moveStates.right) {
-                    x += speed;
-                } else if (moveState == moveStates.up) {
-                    y -= speed;
-                } else if (moveState == moveStates.down) {
-                    y += speed;
-                }
-            }
-        }
-
-    }
-
-    public void renderTick(Renderer r, float lag) {
-        r.setMixColorEnabled(false);
-
-        renderTestBackground(r);
-
-        r.setColorEnabled(false);
-        r.setTextureEnabled(true);
-
-        r.translateTo(0.0f, 0.0f);
-        r.updateMatrix();
-
-        float ix = oldX + (x - oldX) * lag;
-        float iy = oldY + (y - oldY) * lag;
-        r.getTextureRenderer().drawRectangle(ix, iy, ix + 32, iy + 32, 0, 0, 1, 1);
-
-    }
-
-    private void calcMoveState() {
-        if (oldX == x && oldY == y) {
-            moveState = moveStates.still;
-        } else if (oldX > x) {
-            moveState = moveStates.left;
-        } else if (oldX < x) {
-            moveState = moveStates.right;
-        } else if (oldY > y) {
-            moveState = moveStates.up;
-        } else if (oldY < y) {
-            moveState = moveStates.down;
-        }
-    }
-
-    private void animate() {
-        if (moveState == moveStates.still || moveState == moveStates.down) {
-            characterFront.bind();
-        } else if (moveState == moveStates.left) {
-
-            characterLeft.bind();
-        } else if (moveState == moveStates.right) {
-            characterRight.bind();
-        } else if (moveState == moveStates.up) {
-            characterBack.bind();
-        }
-    }
-
-    private void renderTestBackground(Renderer r) {
-        r.setColorEnabled(true);
-        r.setTextureEnabled(false);
-        r.getColorRenderer().drawRectangle(0, 0, 32, 32, 0xFF0000FF);
-        r.getColorRenderer().drawRectangle(32, 0, 64, 32, 0xFF00FF00);
-        r.getColorRenderer().drawRectangle(0, 32, 32, 64, 0xFF00FF00);
-        r.getColorRenderer().drawRectangle(32, 32, 64, 64, 0xFF0000FF);
-        r.getColorRenderer().drawRectangle(64, 0, 96, 32, 0xFF0000FF);
-        r.getColorRenderer().drawRectangle(0, 64, 32, 96, 0xFF0000FF);
-        r.getColorRenderer().drawRectangle(64, 32, 96, 64, 0xFF00FF00);
-        r.getColorRenderer().drawRectangle(32, 64, 64, 96, 0xFF00FF00);
-        r.getColorRenderer().drawRectangle(64, 64, 96, 96, 0xFF0000FF);
-    }
-}

+ 64 - 10
src/pathgame/PathGame.java

@@ -2,35 +2,89 @@ package pathgame;
 
 import me.hammerle.snuviengine.api.IGame;
 import me.hammerle.snuviengine.api.Renderer;
+import pathgame.gameplay.Keys;
 import pathgame.rendering.TileMapRenderer;
 import pathgame.tilemap.TileMap;
 import pathgame.utils.TestUtils;
-import gameplay.Hiker;
+import pathgame.gameplay.Player;
+import pathgame.rendering.PlayerRenderer;
+import pathgame.rendering.TileRenderer;
 
 public class PathGame implements IGame
 {
     private final TileMapRenderer mapRenderer = new TileMapRenderer();
-    private final TileMap map = TestUtils.getTestMap(25, 15);
+    private final TileMap map = TestUtils.getTestMap(33, 25);
+
+    private final PlayerRenderer playerRenderer = new PlayerRenderer();
+    private final Player player = new Player();
     
-    private final Hiker player = new Hiker();
+    private float lastScale = 1.0f;
+    private float scale = 1.0f;
     
     public PathGame()
     {
-        
     }
-    
+
     @Override
     public void tick()
     {
-        mapRenderer.tick();        
-        player.tick();
+        mapRenderer.tick();
+        player.tick(map);
+        
+        lastScale = scale;
+        if(Keys.ZOOM_IN_KEY.isDown())
+        {
+            scale *= 1.1f;
+        }
+        else if(Keys.ZOOM_OUT_KEY.isDown())
+        {
+            scale /= 1.1f;
+        }
     }
-    
+
     @Override
     public void renderTick(Renderer r, float lag)
     {
-        mapRenderer.renderTick(map, r, false, 0.0f, 0.0f);
-        player.renderTick(r, lag);
+        float interScale = lastScale + (scale - lastScale) * lag;
+        mapRenderer.setScale(interScale);
+        
+        float offX = getMapOffsetX(r, lag, interScale);
+        float offY = getMapOffsetY(r, lag, interScale);
+
+        mapRenderer.renderTick(map, r, false, offX, offY);
+        playerRenderer.renderTick(map, mapRenderer, r, player, lag, offX, offY);
+    }
+
+    private float getMapOffsetX(Renderer r, float lag, float interScale)
+    {
+        float ix = (player.getLastX() + (player.getX() - player.getLastX()) * lag) * interScale * TileRenderer.TILE_SIZE;
+        float offX = (-ix + r.getViewWidth() * 0.5f) - TileRenderer.TILE_SIZE * 0.5f * interScale;
+
+        if(offX < -mapRenderer.getWidth(map) + r.getViewWidth())
+        {
+            return -mapRenderer.getWidth(map) + r.getViewWidth();
+        }
+        else if(offX > 0.0f)
+        {
+            return 0.0f;
+        }
+        return offX;
+    }
+
+    private float getMapOffsetY(Renderer r, float lag, float interScale)
+    {
+        float iy = (player.getLastY() + (player.getY() - player.getLastY()) * lag) * interScale * TileRenderer.TILE_SIZE;
+        float offY = (-iy + r.getViewHeight() * 0.5f) - TileRenderer.TILE_SIZE * 0.5f * interScale;
+
+        if(offY < -mapRenderer.getHeight(map) + r.getViewHeight())
+        {
+            return -mapRenderer.getHeight(map) + r.getViewHeight();
+        }
+        else if(offY > 0.0f)
+        {
+            return 0.0f;
+        }
+        return offY;
     }
 
     @Override

+ 15 - 0
src/pathgame/gameplay/Keys.java

@@ -0,0 +1,15 @@
+package pathgame.gameplay;
+
+import me.hammerle.snuviengine.api.KeyBinding;
+import me.hammerle.snuviengine.api.KeyHandler;
+import org.lwjgl.glfw.GLFW;
+
+public class Keys
+{
+    public static final KeyBinding UP_KEY = KeyHandler.register(GLFW.GLFW_KEY_W);
+    public static final KeyBinding DOWN_KEY = KeyHandler.register(GLFW.GLFW_KEY_S);
+    public static final KeyBinding LEFT_KEY = KeyHandler.register(GLFW.GLFW_KEY_A);
+    public static final KeyBinding RIGHT_KEY = KeyHandler.register(GLFW.GLFW_KEY_D);
+    public static final KeyBinding ZOOM_IN_KEY = KeyHandler.register(GLFW.GLFW_KEY_I);
+    public static final KeyBinding ZOOM_OUT_KEY = KeyHandler.register(GLFW.GLFW_KEY_O);
+}

+ 89 - 0
src/pathgame/gameplay/Player.java

@@ -0,0 +1,89 @@
+package pathgame.gameplay;
+
+import pathgame.tilemap.Tile;
+import pathgame.tilemap.TileMap;
+
+public class Player
+{
+    private static final float SPEED = 0.125f;
+
+    private float lastX = 0;
+    private float lastY = 0;
+    private float x = 0;
+    private float y = 0;
+
+    private float velX = 0;
+    private float velY = 0;
+    private boolean isMoving = false;
+
+    public Player()
+    {
+    }
+
+    public float getLastX()
+    {
+        return lastX;
+    }
+
+    public float getLastY()
+    {
+        return lastY;
+    }
+
+    public float getX()
+    {
+        return x;
+    }
+
+    public float getY()
+    {
+        return y;
+    }
+
+    public void tick(TileMap map)
+    {
+        lastX = x;
+        lastY = y;
+
+        if(isOnTile())
+        {
+            velX = 0.0f;
+            velY = 0.0f;
+            if(isMoving)
+            {
+                //TODO: +Energy
+                //Tile currTile = map.getTile((int)x,(int) y);
+
+            }
+            isMoving = false;
+        }
+
+        if(Keys.LEFT_KEY.isDown() && !isMoving && x > 0)
+        {
+            velX = -SPEED;
+            isMoving = true;
+        }
+        else if(Keys.RIGHT_KEY.isDown() && !isMoving && x < map.getWidth() - 1)
+        {
+            velX = SPEED;
+            isMoving = true;
+        }
+        else if(Keys.UP_KEY.isDown() && !isMoving && y > 0)
+        {
+            velY = -SPEED;
+            isMoving = true;
+        }
+        else if(Keys.DOWN_KEY.isDown() && !isMoving && y < map.getHeight() - 1)
+        {
+            velY = SPEED;
+            isMoving = true;
+        }
+        x += velX;
+        y += velY;
+    }
+
+    private boolean isOnTile()
+    {
+        return Math.abs(x - Math.round(x)) < 0.01f && Math.abs(y - Math.round(y)) < 0.01f;
+    }
+}

+ 32 - 0
src/pathgame/rendering/PlayerRenderer.java

@@ -0,0 +1,32 @@
+package pathgame.rendering;
+
+import me.hammerle.snuviengine.api.Renderer;
+import me.hammerle.snuviengine.api.Texture;
+import pathgame.gameplay.Player;
+import pathgame.tilemap.TileMap;
+
+public class PlayerRenderer
+{
+    private static final Texture CHARACTER = new Texture("res/character/characterFront.png");
+    //private static final Texture characterLeft = new Texture("res/character/characterLeft.png");
+    //private static final Texture characterRight = new Texture("res/character/characterRight.png");
+    //private static final Texture characterBack = new Texture("res/character/characterBack.png");
+
+    public void renderTick(TileMap map, TileMapRenderer mapR, Renderer r, Player p, float lag, float offX, float offY)
+    {
+        float playerSize = mapR.getScale() * TileRenderer.TILE_SIZE;
+
+        r.setMixColorEnabled(false);
+        r.setColorEnabled(false);
+        r.setTextureEnabled(true);
+
+        r.translateTo(0.0f, 0.0f);
+        r.updateMatrix();
+
+        CHARACTER.bind();
+        //TODO: animation with velocity
+        float ix = (p.getLastX() + (p.getX() - p.getLastX()) * lag) * mapR.getScale()*TileRenderer.TILE_SIZE + offX;
+        float iy = (p.getLastY() + (p.getY() - p.getLastY()) * lag) * mapR.getScale()*TileRenderer.TILE_SIZE + offY;
+        r.getTextureRenderer().drawRectangle(ix, iy, ix + playerSize, iy + playerSize, 0, 0, 1, 1); //TODO: change last 4 texture coordinates for animation 
+    }
+}