好吧,我正在制作游戏。它基本上是一种“射击游戏”,您可以在其中射击其他玩家。好吧,一切都很好,但是角色的动作让我很烦。在这里不要误会我的意思,我可以对角色的运动进行编程,并且可以正常工作...但是不太流利。让我解释一下“流利”一词。现在,我角色的动作是这样的;如果我按“向右箭头”将字符向右移动,它将一直进行到我不再按该键为止。我想摆脱它,而是想将我的角色在单个KeyPress中向右移动,并且应该一直向右移动,直到我按下“向左箭头”。

public class Character extends Main implements KeyListener {
int x;
int y;
int width;
int height;



public Character() {
    this.x = 250;
    this.y = 400;
    this.width = 30;
    this.height = 30;
    addKeyListener(this);
    setFocusable(true);
    setVisible(true);


}

public void paint(Graphics g) {

    super.paint(g);
    Graphics2D mainGraphics = (Graphics2D) g;
    mainGraphics.setColor(Color.BLUE);
    mainGraphics.fillRect(this.x, this.y, this.width, this.height);
    mainGraphics.setColor(Color.GREEN);
    mainGraphics.fillRect(Enemy.xEnemy, Enemy.yEnemy, Enemy.widthEnemy, Enemy.heightEnemy);
    mainGraphics.setColor(Color.RED);
    mainGraphics.fillRect(Fire.xFire, Fire.yFire, Fire.widthFire, Fire.heightFire);

    mainGraphics.setColor(Color.RED);
    mainGraphics.fillRect(FireEnemy.xFireEnemy, FireEnemy.yFireEnemy, FireEnemy.widthFireEnemy, FireEnemy.heightFireEnemy);


    }



public void keyReleased(KeyEvent arg0) {


}


public void keyTyped(KeyEvent arg0) {


}

public void keyPressed(KeyEvent e) {

    int keyCode = e.getKeyCode();

    if(keyCode == e.VK_LEFT) {
        this.x = this.x - 10;
        Fire.xFire -= 10;
    }
    else if(keyCode == e.VK_RIGHT) {
        this.x = this.x + 10;
        Fire.xFire += 10;
    }
    else if(keyCode == e.VK_A) {
        Enemy.xEnemy -= 10;
        FireEnemy.xFireEnemy -= 10;
    }
    else if(keyCode == e.VK_D) {
        Enemy.xEnemy += 10;
        FireEnemy.xFireEnemy += 10;
    }
    else if(keyCode == e.VK_P) {

            Fire.xFire = this.x;
            Fire.yFire = Fire.yFire - 45;

        if(this.x == Enemy.xEnemy && Fire.yFire <= Enemy.yEnemy) {
            System.out.println("Player 1 won");
        }



    }
    else if(keyCode == e.VK_W) {
        FireEnemy.xFireEnemy = FireEnemy.xFireEnemy + 0;
        for(int i = 0; i<2; i++) {
            FireEnemy.yFireEnemy = FireEnemy.yFireEnemy + 45;
        }

        if(Enemy.xEnemy == this.x && FireEnemy.yFireEnemy >= this.y) {
            System.out.println("Player 2 won");
        }



    }

    repaint();

}


}

我的主班

    public class Main extends JPanel {


    public static void main(String[] args) {

            JFrame window = new JFrame();
            Character character = new Character();
            Enemy enemy = new Enemy();
            Fire fire = new Fire();
            FireEnemy fireEnemy = new FireEnemy();
            window.setBounds(10, 10, 500, 500);
            window.setBackground(Color.DARK_GRAY);
            window.setResizable(false);
            window.setVisible(true);
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            window.add(character);
    }


}

Fire,FireEnemy,Enemy只是Empty的类,我只在其中添加了“ static int ...”和一个构造函数。这些都不重要。

最佳答案

存储最后按下的键。然后调用keyPressed,检查密钥是否与上次存储的密钥相同。如果是这样,请返回,否则进行处理。

在Character类中,创建此成员:

int lastKeyCode;


在您的keyPressed方法中,添加以下内容:

int keyCode = e.getKeyCode();
if (keyCode == lastKeyCode) return;
else lastKeyCode = keyCode ;


并使用您常用的代码。
注意:我不会为您编写程序,只是指向正确的方向。由于您是一个初学者,从长远来看,它将帮助您更好。

10-06 02:48