Javaのゲームでボタンのホールドを検出する方法は?

ケニー:

私は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) {}
}

マイケル:

あなたはすでにボタンが保持されていることを検出するために、すべてのものを持っていますが、運動を適用するあなたのアプローチが間違っています。キーが押されたときは、検出し、かつキーが解放されたときに検出します。これらの2つのイベントの間に、キーを表し、すべての時間が開催されています。

キーが押されたときに一度だけ発生しますので、あなたは、運動を適用するべきではありません。あなたは、単にフラグを設定する必要があります。

@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;
    }
}

他の場所でゲームのメインループ(すべてのフレームと呼ばれています1)で、あなたはフラグをチェックする必要がありますし、それに応じて行動します。

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=341388&siteId=1