Cómo detectar un botón de espera en un juego de Java?

Kenny:

Estoy tratando de hacer mi primer juego poco en Java. Quiero hacer una pelota, que se mueve hacia abajo, si no presiona nada. Sin embargo, si se pulsa la barra espaciadora, se mueve con la misma velocidad, que se mueve hacia abajo. Por lo que sólo subiendo y bajando con un botón.

El problema es que la pelota no sube sin problemas. ¿Cómo puedo arreglar esto?

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

Miguel :

Ya tiene todo para detectar que el botón se mantiene, pero su acercamiento a aplicar el movimiento es erróneo. Se detecta cuando se pulsa la tecla, y se detecta cuando se suelta la tecla. Todo el tiempo entre los 2 eventos representa la clave recluido.

No debe aplicar el movimiento cuando se pulsa la tecla, ya que sólo ocurrirá una vez. Simplemente debe establecer un indicador.

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

En otras partes de bucle principal de su juego (el que llama cada fotograma), usted debe comprobar la bandera y actuar en consecuencia.

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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=341391&siteId=1
Recomendado
Clasificación