为什么我的2d角色向上移动,即使我甚至没有按按键?



我正在学习如何通过参考[https://www.youtube.com/watch?v=VpH33Uw-_0E&list=PL_QPQmz5C6WUF-pOQDsbsKbaBZqXj4qSq&index=2]制作自我开发的2d游戏

那么在下面,您将看到三个简单的类代码。我检查了每一行,但当我运行游戏时,白色矩形直接开始向上移动。任何帮助都是伟大的仁慈。

主类

package main;
import javax.swing.JFrame;
public class Main {
public static void main(String[] args) {
JFrame window = new JFrame();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setResizable(false);
window.setTitle("MY 2-D GAME");

GamePanel gamePanel = new GamePanel();
window.add(gamePanel);

window.pack();

window.setLocationRelativeTo(null);
window.setVisible(true);

gamePanel.startGameThread();
}
}

GamePanel类
package main;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
public class GamePanel extends JPanel implements Runnable{
private static final int FPS = 60;
final int originalTileSize = 16;
final int scale = 3; 

final int tileSize = originalTileSize * scale; // 48x48
final int maxScreenCol = 16;
final int maxScreenRow = 12;
final int screenWidth = tileSize * maxScreenCol;
final int screenHeight = tileSize * maxScreenRow;

KeyHandler key_Handler = new KeyHandler();

Thread gameThread;

int player_x = 100;
int player_y = 100;
int player_speed = 4;

public GamePanel() {
this.setPreferredSize(new Dimension(screenWidth,screenHeight));
this.setBackground(Color.black);
this.setDoubleBuffered(true);
this.addKeyListener(key_Handler);
this.setFocusable(true);


}

public void startGameThread() {
gameThread = new Thread(this);
gameThread.start();
}

public void run() {

double drawInterval = 1000000000/FPS;
double delta = 0;
long lastTime = System.nanoTime();

long current_time;

while (gameThread != null) {
current_time = System.nanoTime();

delta += (current_time - lastTime) / drawInterval;

lastTime = current_time;

if (delta >= 1) {
update();
repaint();
delta--;
}

}



}


public void update() {
if (key_Handler.upMove = true) {
player_y -= player_speed;
}

else if (key_Handler.downMove = true) {
player_y += player_speed;
}

else if (key_Handler.leftMove = true) {
player_x -= player_speed;
}

else if (key_Handler.rightMove = true) {
player_x += player_speed;
}

}

public void paintComponent(Graphics g) {
super.paintComponent(g);

Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.white);
g2.fillRect(player_x,player_y, tileSize, tileSize);
g2.dispose();



}
}

KeyHandler类
package main;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class KeyHandler implements KeyListener{

public boolean upMove, downMove, leftMove, rightMove;


public void keyTyped(KeyEvent e) {
}

public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();

if (code == KeyEvent.VK_W) {
upMove = true;
}
if (code == KeyEvent.VK_S) {
downMove = true;
}
if (code == KeyEvent.VK_A) {
leftMove = true;
}
if (code == KeyEvent.VK_D) {
rightMove = true;
}


}

public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
int code = e.getKeyCode();

if (code == KeyEvent.VK_W) {
upMove = false;
}
if (code == KeyEvent.VK_S) {
downMove = false;
}
if (code == KeyEvent.VK_A) {
leftMove = false;
}
if (code == KeyEvent.VK_D) {
rightMove = false;
}

}

}

快速浏览后,我想我找到了罪魁祸首:

if (key_Handler.upMove = true) {
player_y -= player_speed;
}

请记住,对于c风格语言中的比较,您需要双引号==,或者更好的是,将key_handler.upMove单独放在括号中,因为它已经是一个布尔值。因此,将if语句修改如下:

if (key_Handler.upMove) { // or key_Handler.upMove == true if you prefer.
player_y -= player_speed;
}

你的代码将key_handler.upMove赋值为true,并在if语句中使用它。

而不是使用:

if (key_Handler.upMove = true) {
player_y -= player_speed;
}

使用:

if (key_Handler.upMove) {
player_y -= player_speed;
}

其他情况也一样。

最新更新