我正在学习如何通过参考[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;
}
其他情况也一样。