Java太空侵略者游戏:D键无法控制飞船右移问题求助
解决太空侵略者飞船右移无效问题
问题现象
开发太空侵略者游戏时,按下D键控制飞船右移,飞船无任何移动,打印X坐标发现数值完全未变化。
错误分析
从提供的代码中可发现两处核心错误:
- 按键绑定逻辑颠倒:键盘事件处理中,按下D键(
KeyEvent.VK_D)调用的是左移方法Sinistra(),按下A键(KeyEvent.VK_A)却调用了右移方法Dstra(),控制逻辑完全搞反。 - 右移方法逻辑错误:
Dstra()方法的判断条件和坐标更新逻辑完全错误,当前代码是当飞船右侧超出窗口(x + larghezza > 800)时让x减少,不仅无法实现右移,反而会在不该移动的时候让飞船左移。
修复方案
- 修正按键绑定:将D键与右移方法
Dstra()绑定,A键与左移方法Sinistra()绑定。 - 修正右移方法逻辑:右移时判断飞船右侧未超出窗口边界(
x + larghezza < 800),满足条件时让x增加(x += speed+10),实现向右移动。
修正后的代码
控制飞船移动的代码
public PannelloGioco() { setBackground(Color.BLACK); navicella = new Navicella(350, 500); // Posizione iniziale della navicella //metodo per gestire gli input da tastiera addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); if (keyCode == KeyEvent.VK_D) { navicella.Dstra(); // D键对应右移 } else if (keyCode == KeyEvent.VK_A) { navicella.Sinistra(); // A键对应左移 } else if (keyCode == KeyEvent.VK_W) { navicella.Sopra(); } else if (keyCode == KeyEvent.VK_S) { navicella.Sotto(); } repaint(); // faccio il repaint dopo ogni azione } }); // Aziono il focus per poter ricevere gli eventi da tastiera setFocusable(true); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // Pulisce il pannello navicella.draw(g); // Disegna la navicella }
飞船移动逻辑代码
public void Sinistra() { //metodo per spostare la navicella a sinistra if (x > 0) { x -= speed+10; } } public void Dstra() { //metodo per spostare la navicella a destra if (x + larghezza < 800) { // 判断右侧未超出窗口 x += speed+10; // 坐标增加实现右移 } } public void Sopra() { if (y > 0) { //metodo per spostare la navicella sopra y -= speed+10; } } public void Sotto() { if (y + altezza < 600) { //metodo per spostare la navicella sotto y += speed+10; } }
内容的提问来源于stack exchange,提问作者Valentin Constantin
相关产品推荐
相关产品推荐

