From bbf6b24fa0e626b459e193eeffb0eb6f7cc740f2 Mon Sep 17 00:00:00 2001 From: dvorakmortonxd Date: Thu, 22 Oct 2026 12:00:52 +0200 Subject: [PATCH] Got animated walking player sprites working --- src/main/java/dev/dvorakmortonxd/Game.java | 10 +++-- src/main/java/dev/dvorakmortonxd/input.java | 12 ++++- src/main/java/dev/dvorakmortonxd/update.java | 47 +++++++++++++++----- 3 files changed, 52 insertions(+), 17 deletions(-) diff --git a/src/main/java/dev/dvorakmortonxd/Game.java b/src/main/java/dev/dvorakmortonxd/Game.java index 5bc27ae..7f3cbaf 100644 --- a/src/main/java/dev/dvorakmortonxd/Game.java +++ b/src/main/java/dev/dvorakmortonxd/Game.java @@ -60,7 +60,7 @@ public class Game extends JPanel implements ActionListener { /* defines the level which is used to determine what exactly shows (for example main menu is level 1), levelProgress which is only used for the animation from level 1 to level 2 and fadeAnimation which is also used for the animation from level 1 to level 2 */ - public int level = 1; + public int level = 3; public boolean levelProgress = false; // this is used to make the transition from the Game menu to the game level look cool public int fadeAnimation = 0; @@ -112,12 +112,16 @@ public class Game extends JPanel implements ActionListener { public int playerOldY = playerY; public int playerSizeX = 14*4; public int playerSizeY = 18*4; - public String playerDirection = "forward"; + public String playerDirection = "none"; public BufferedImage playerCurrentSprite; public int playerWalkingModifier = 5; public boolean playerOnFeet = true; public boolean playerJumped = false; - public boolean playerActive = false; + public boolean playerActive = true; + public int walkTick; + public static int ticksPerFrame = 8; + public static int[] walkCycle = {1, 0, 2, 0}; + // Starts update.java which is basically a class that contains all the stuff that happens every tick @Override public void actionPerformed(ActionEvent e) { // update step diff --git a/src/main/java/dev/dvorakmortonxd/input.java b/src/main/java/dev/dvorakmortonxd/input.java index e692fd6..2ec07ae 100644 --- a/src/main/java/dev/dvorakmortonxd/input.java +++ b/src/main/java/dev/dvorakmortonxd/input.java @@ -11,9 +11,15 @@ public class input implements KeyListener { public void keyPressed(KeyEvent e) { // input if (m.playerActive) { switch (e.getKeyCode()) { + case KeyEvent.VK_W: + m.playerDirection = "forward"; + break; case KeyEvent.VK_A: m.playerDirection = "left"; break; + case KeyEvent.VK_S: + m.playerDirection = "backward"; + break; case KeyEvent.VK_D: m.playerDirection = "right"; break; @@ -43,8 +49,10 @@ public class input implements KeyListener { public void keyReleased(KeyEvent e) { // what happens when you let go of a key if (m.playerActive) { switch (e.getKeyCode()) { - case KeyEvent.VK_A -> m.playerDirection = "forward"; - case KeyEvent.VK_D -> m.playerDirection = "forward"; + case KeyEvent.VK_W -> m.playerDirection = "none"; + case KeyEvent.VK_A -> m.playerDirection = "none"; + case KeyEvent.VK_S -> m.playerDirection = "none"; + case KeyEvent.VK_D -> m.playerDirection = "none"; /* ONLY FOR DEBUGGING BELOW case KeyEvent.VK_A -> m.playerX -= m.playerWalkingModifier; case KeyEvent.VK_D -> m.playerX += m.playerWalkingModifier; diff --git a/src/main/java/dev/dvorakmortonxd/update.java b/src/main/java/dev/dvorakmortonxd/update.java index 6fc2191..fc5b3a1 100644 --- a/src/main/java/dev/dvorakmortonxd/update.java +++ b/src/main/java/dev/dvorakmortonxd/update.java @@ -1,9 +1,19 @@ package dev.dvorakmortonxd; import java.awt.*; +import java.awt.image.BufferedImage; import java.util.Random; public class update { + public static BufferedImage spriteFor(Game m, String direction, int frame) { + return switch (direction) { + case "forward" -> new BufferedImage[]{m.playerForward0, m.playerForward1, m.playerForward2}[frame]; + case "backward" -> new BufferedImage[]{m.playerBackward0, m.playerBackward1, m.playerBackward2}[frame]; + case "left" -> new BufferedImage[]{m.playerLeft0, m.playerLeft1, m.playerLeft2}[frame]; + case "right" -> new BufferedImage[]{m.playerRight0, m.playerRight1, m.playerRight2}[frame]; + default -> m.playerForward0; + }; + } static void performPerTick(Game m) { Random rand = new Random(); m.starSize = rand.nextInt(2,4); @@ -43,34 +53,47 @@ public class update { } } if (m.playerActive) { - if (m.playerDirection == "forward"){ - m.playerCurrentSprite = m.playerForward0; - } else if (m.playerDirection == "backward") { - m.playerCurrentSprite = m.playerBackward0; - } else if (m.playerDirection == "right") { - m.playerCurrentSprite = m.playerRight0; + boolean moving = false; + if (m.playerDirection.equals("right")) { m.playerX += m.playerWalkingModifier; - } else if (m.playerDirection == "left") { - m.playerCurrentSprite = m.playerLeft0; + moving = true; + } else if (m.playerDirection.equals("left")) { m.playerX -= m.playerWalkingModifier; + moving = true; + } else if (m.playerDirection.equals("forward")) { + moving = true; + } else if (m.playerDirection.equals("backward")) { + moving = true; + } else { + moving = false; + } + + int frame = 0; + if (moving) { + frame = m.walkCycle[(m.walkTick / m.ticksPerFrame) % m.walkCycle.length]; + m.walkTick++; + } else { + m.walkTick = 0; } if (m.playerJumped) { m.playerOnFeet = false; - m.playerY -= 10; - if (m.playerOldY-100 >= m.playerY) { m.playerJumped = false; } + m.playerY -= 20; + if (m.playerOldY-80 >= m.playerY) { m.playerJumped = false; } } // collisions if (m.level == 3 && (m.playerY < 338 || (m.playerX >= 583 || m.playerX <= 274) && m.playerY < 366)) { - m.playerY += 5; + m.playerY += 10; m.playerOnFeet = false; - } else if (m.playerX < 583 && m.playerX > 274) { + } else if (m.level == 3 && m.playerX < 583 && m.playerX > 274) { m.playerY = 338; m.playerOnFeet = true; } else { m.playerOnFeet = true; } + // update the player sprite based on direction and if hes walking and frame + m.playerCurrentSprite = spriteFor(m, m.playerDirection, frame); // first ship if (m.playerX < -m.playerSizeX || m.playerX > m.windowWidth) { m.level = 4; } }