一次按键即可流畅移动



嗯,我现在正在做一个游戏。它基本上是一个"射击游戏",您可以在其中射击其他玩家。好吧,一切都很好,但角色的动作让我很烦恼。不要在这里理解我的意思,我可以对角色的运动进行编程,而且它有点工作......但不流利。让我解释一下"流利"这个词。现在,我的角色的动作是这样的;如果我按"向右箭头"将字符向右移动,它会一直持续到我不再按键为止。我想摆脱它,相反,我想在一次按键中向右移动我的字符,它应该一直向右移动,直到我按下"向左箭头"。

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只是空的类,我只是在其中放了"static int..."和一个构造函数。其中没有什么重要的东西。

存储上次按下的键。然后按键被调用,检查键是否与上次存储的相同。如果是这样,请返回,否则处理它。

在 Character 类中,创建以下成员:

int lastKeyCode;

在 keyPress 方法中,添加如下内容:

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

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

相关内容

  • 没有找到相关文章

最新更新