【问题标题】:How to detect a button hold in a Java game?如何检测 Java 游戏中的按钮保持?
【发布时间】:2023-04-09 21:58:02
【问题描述】:

我正在尝试用 Java 制作我的第一个小游戏。 如果你不按任何东西,我想制造一个向下移动的球。但是,如果您按下空格键,它会以与向下移动相同的速度向上移动。所以只需一键上下。

问题是,球没有顺利上升。我该如何解决这个问题?

package Game;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;
import javax.swing.Timer;

public class Gameplay extends JPanel implements KeyListener, ActionListener{

    private boolean play = false;
    private int delay = 5;
    private Timer timer;

    private int playerX = 250;
    private int playerY = 325;
    private int playerYdir = 2;
    private boolean up = false;

    public Gameplay() { 
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
        timer = new Timer(delay, this);
        timer.start();
    }

    public void paint(Graphics g) {
        //BG
        g.setColor(Color.black);
        g.fillRect(0, 0 , 1000, 700);
        //Player
        g.setColor(Color.yellow);
        g.fillOval(playerX, playerY, 30, 30);

        g.dispose();
    }


    @Override
    public void actionPerformed(ActionEvent e) {
        timer.start();

        if(play) {
            if(playerY >= 640) playerY = 640;
            if(playerY <= 0) playerY = 0;
            if(!up) move(-playerYdir, false);
        }
        repaint();
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_SPACE) {
            move(8, true);
            play = true;

        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_SPACE) {
            move(8, false);

        }
    }

    public void move(int moveUp, boolean dir) {
        //dir: true = down, false = up
        up = dir;
        playerY -= moveUp;
    }

    @Override
    public void keyTyped(KeyEvent e) {}
}

【问题讨论】:

    标签: java keylistener


    【解决方案1】:

    您已经拥有一切可以检测到按钮被按住的情况,但是您应用该动作的方法是错误的。您检测何时按下键,并检测何时释放键。这两个事件之间的所有时间都代表着关键。

    您不应该在按键时应用移动,因为这只会发生一次。你应该简单地设置一个标志。

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_SPACE) {
            isSpaceButtonDown = true;
        }
    }
    
    @Override
    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_SPACE) {
            sSpaceButtonDown = false;
        }
    }
    

    在游戏主循环的其他地方(每帧调用的那个),您应该检查标志并采取相应措施。

    void myMainGameLoop() {
        if (isSpaceButtonDown) {
            moveUp();
        }
        else {
            moveDown()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多