diff --git a/src/main/java/dev/dvorakmortonxd/Game.java b/src/main/java/dev/dvorakmortonxd/Game.java index 4a63563..f43f2a6 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; @@ -109,15 +109,24 @@ public class Game extends JPanel implements ActionListener { // defines the initial player variables public int playerX = 423; public int playerY = 310; - public int playerOldY = playerY; + public double playerXVelocity = 0; + public double playerYVelocity = 0; + public boolean leftHeld, rightHeld; + + public static final double acceleration = 0.01; + public final double friction = 0.6; + public final double maxSpeed = 6.0; + public final double gravity = 1.0; + public final double jumpSpeed = -12.6; + public final double maxFall = 20.0; + public int playerSizeX = 14*4; public int playerSizeY = 18*4; 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}; diff --git a/src/main/java/dev/dvorakmortonxd/input.java b/src/main/java/dev/dvorakmortonxd/input.java index d1dfbf0..40957a0 100644 --- a/src/main/java/dev/dvorakmortonxd/input.java +++ b/src/main/java/dev/dvorakmortonxd/input.java @@ -14,26 +14,23 @@ public class input implements KeyListener { case KeyEvent.VK_W: m.playerDirection = "backward"; break; - case KeyEvent.VK_A: + case KeyEvent.VK_A, KeyEvent.VK_LEFT: m.playerDirection = "left"; + m.leftHeld = true; break; case KeyEvent.VK_S: m.playerDirection = "forward"; break; - case KeyEvent.VK_D: + case KeyEvent.VK_D, KeyEvent.VK_RIGHT: m.playerDirection = "right"; + m.rightHeld = true; break; case KeyEvent.VK_SPACE: - if (!m.playerJumped && m.playerOnFeet) { - m.playerJumped = true; - m.playerOldY = m.playerY; + if (m.playerOnFeet) { + m.playerYVelocity = m.jumpSpeed; + m.playerOnFeet = false; } break; - /* ONLY FOR DEBUGGING BELOW - case KeyEvent.VK_A -> m.playerX -= m.playerWalkingModifier; - case KeyEvent.VK_D -> m.playerX += m.playerWalkingModifier; - case KeyEvent.VK_S -> m.playerY += 1; - case KeyEvent.VK_W -> m.playerY -= 1; */ } } switch (e.getKeyCode()) { @@ -49,10 +46,20 @@ 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_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"; + case KeyEvent.VK_W: + m.playerDirection = "none"; + break; + case KeyEvent.VK_A, KeyEvent.VK_LEFT: + m.playerDirection = "none"; + m.leftHeld = false; + break; + case KeyEvent.VK_S: + m.playerDirection = "none"; + break; + case KeyEvent.VK_D, KeyEvent.VK_RIGHT: + m.playerDirection = "none"; + m.rightHeld = false; + break; /* 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 fc5b3a1..08810b4 100644 --- a/src/main/java/dev/dvorakmortonxd/update.java +++ b/src/main/java/dev/dvorakmortonxd/update.java @@ -14,6 +14,13 @@ public class update { default -> m.playerForward0; }; } + public static double getGroundY(Game m) { + if (m.level == 3) { + if (m.playerX > 274 && m.playerX < 583) { return 338; } else { return 366; } + } else { + return m.windowHeight; + } + } static void performPerTick(Game m) { Random rand = new Random(); m.starSize = rand.nextInt(2,4); @@ -75,13 +82,35 @@ public class update { } else { m.walkTick = 0; } - if (m.playerJumped) { - m.playerOnFeet = false; - m.playerY -= 20; - if (m.playerOldY-80 >= m.playerY) { m.playerJumped = false; } + if (m.leftHeld && !m.rightHeld) { + m.playerXVelocity -= m.acceleration; + } else if (m.rightHeld && !m.leftHeld) { + m.playerXVelocity +=m.acceleration; + } else { + if (m.playerXVelocity > 0) { + m.playerXVelocity = Math.max(0, m.playerXVelocity - m.friction); + } else if (m.playerXVelocity < 0) { + m.playerXVelocity = Math.min(0, m.playerXVelocity + m.friction); + } } + m.playerXVelocity = Math.clamp(m.playerXVelocity, -m.maxSpeed, m.maxSpeed); + m.playerX += m.playerXVelocity; + m.playerYVelocity = Math.min(m.playerYVelocity + m.gravity, m.maxFall); + m.playerY += m.playerYVelocity; + // collisions + + double groundY = getGroundY(m); + if (m.playerY >= groundY) { + m.playerY = (int) groundY; + m.playerYVelocity = 0; + m.playerOnFeet = true; + } else { + m.playerOnFeet = false; + } + + /* if (m.level == 3 && (m.playerY < 338 || (m.playerX >= 583 || m.playerX <= 274) && m.playerY < 366)) { m.playerY += 10; m.playerOnFeet = false; @@ -90,9 +119,9 @@ public class update { m.playerOnFeet = true; } else { m.playerOnFeet = true; - } + }*/ - // update the player sprite based on direction and if hes walking and frame + // update the player sprite based on direction and if he's walking and frame m.playerCurrentSprite = spriteFor(m, m.playerDirection, frame); // first ship if (m.playerX < -m.playerSizeX || m.playerX > m.windowWidth) { m.level = 4; }