refined the movement, only partly I still wanna do some touches so it feels better

This commit is contained in:
Martin Dvořák 2026-10-22 23:34:36 +02:00
commit 915afaa7cb
3 changed files with 69 additions and 24 deletions

View file

@ -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), /* 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 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 */ 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 boolean levelProgress = false; // this is used to make the transition from the Game menu to the game level look cool
public int fadeAnimation = 0; public int fadeAnimation = 0;
@ -109,15 +109,24 @@ public class Game extends JPanel implements ActionListener {
// defines the initial player variables // defines the initial player variables
public int playerX = 423; public int playerX = 423;
public int playerY = 310; 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 playerSizeX = 14*4;
public int playerSizeY = 18*4; public int playerSizeY = 18*4;
public String playerDirection = "none"; public String playerDirection = "none";
public BufferedImage playerCurrentSprite; public BufferedImage playerCurrentSprite;
public int playerWalkingModifier = 5; public int playerWalkingModifier = 5;
public boolean playerOnFeet = true; public boolean playerOnFeet = true;
public boolean playerJumped = false; public boolean playerActive = true;
public boolean playerActive = false;
public int walkTick; public int walkTick;
public static int ticksPerFrame = 8; public static int ticksPerFrame = 8;
public static int[] walkCycle = {1, 0, 2, 0}; public static int[] walkCycle = {1, 0, 2, 0};

View file

@ -14,26 +14,23 @@ public class input implements KeyListener {
case KeyEvent.VK_W: case KeyEvent.VK_W:
m.playerDirection = "backward"; m.playerDirection = "backward";
break; break;
case KeyEvent.VK_A: case KeyEvent.VK_A, KeyEvent.VK_LEFT:
m.playerDirection = "left"; m.playerDirection = "left";
m.leftHeld = true;
break; break;
case KeyEvent.VK_S: case KeyEvent.VK_S:
m.playerDirection = "forward"; m.playerDirection = "forward";
break; break;
case KeyEvent.VK_D: case KeyEvent.VK_D, KeyEvent.VK_RIGHT:
m.playerDirection = "right"; m.playerDirection = "right";
m.rightHeld = true;
break; break;
case KeyEvent.VK_SPACE: case KeyEvent.VK_SPACE:
if (!m.playerJumped && m.playerOnFeet) { if (m.playerOnFeet) {
m.playerJumped = true; m.playerYVelocity = m.jumpSpeed;
m.playerOldY = m.playerY; m.playerOnFeet = false;
} }
break; 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()) { 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 public void keyReleased(KeyEvent e) { // what happens when you let go of a key
if (m.playerActive) { if (m.playerActive) {
switch (e.getKeyCode()) { switch (e.getKeyCode()) {
case KeyEvent.VK_W -> m.playerDirection = "none"; case KeyEvent.VK_W:
case KeyEvent.VK_A -> m.playerDirection = "none"; m.playerDirection = "none";
case KeyEvent.VK_S -> m.playerDirection = "none"; break;
case KeyEvent.VK_D -> m.playerDirection = "none"; 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 /* ONLY FOR DEBUGGING BELOW
case KeyEvent.VK_A -> m.playerX -= m.playerWalkingModifier; case KeyEvent.VK_A -> m.playerX -= m.playerWalkingModifier;
case KeyEvent.VK_D -> m.playerX += m.playerWalkingModifier; case KeyEvent.VK_D -> m.playerX += m.playerWalkingModifier;

View file

@ -14,6 +14,13 @@ public class update {
default -> m.playerForward0; 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) { static void performPerTick(Game m) {
Random rand = new Random(); Random rand = new Random();
m.starSize = rand.nextInt(2,4); m.starSize = rand.nextInt(2,4);
@ -75,13 +82,35 @@ public class update {
} else { } else {
m.walkTick = 0; m.walkTick = 0;
} }
if (m.playerJumped) { if (m.leftHeld && !m.rightHeld) {
m.playerOnFeet = false; m.playerXVelocity -= m.acceleration;
m.playerY -= 20; } else if (m.rightHeld && !m.leftHeld) {
if (m.playerOldY-80 >= m.playerY) { m.playerJumped = false; } 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 // 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)) { if (m.level == 3 && (m.playerY < 338 || (m.playerX >= 583 || m.playerX <= 274) && m.playerY < 366)) {
m.playerY += 10; m.playerY += 10;
m.playerOnFeet = false; m.playerOnFeet = false;
@ -90,9 +119,9 @@ public class update {
m.playerOnFeet = true; m.playerOnFeet = true;
} else { } else {
m.playerOnFeet = true; 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); m.playerCurrentSprite = spriteFor(m, m.playerDirection, frame);
// first ship // first ship
if (m.playerX < -m.playerSizeX || m.playerX > m.windowWidth) { m.level = 4; } if (m.playerX < -m.playerSizeX || m.playerX > m.windowWidth) { m.level = 4; }