You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java太空侵略者游戏:D键无法控制飞船右移问题求助

解决太空侵略者飞船右移无效问题

问题现象

开发太空侵略者游戏时,按下D键控制飞船右移,飞船无任何移动,打印X坐标发现数值完全未变化。

错误分析

从提供的代码中可发现两处核心错误:

  1. 按键绑定逻辑颠倒:键盘事件处理中,按下D键(KeyEvent.VK_D)调用的是左移方法Sinistra(),按下A键(KeyEvent.VK_A)却调用了右移方法Dstra(),控制逻辑完全搞反。
  2. 右移方法逻辑错误:Dstra()方法的判断条件和坐标更新逻辑完全错误,当前代码是当飞船右侧超出窗口(x + larghezza > 800)时让x减少,不仅无法实现右移,反而会在不该移动的时候让飞船左移。

修复方案

  1. 修正按键绑定:将D键与右移方法Dstra()绑定,A键与左移方法Sinistra()绑定。
  2. 修正右移方法逻辑:右移时判断飞船右侧未超出窗口边界(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:24:55