Как настроить обнаружение нажатия клавиш, которое переключает состояние логической переменной - PullRequest
1 голос
/ 17 февраля 2020

Как настроить обнаружение нажатия клавиш, которое переключает состояние логической переменной paused, где paused - это атрибут моего класса GCTester с начальным состоянием false?

// GCTester demonstrates how we can override the GameCore class
// to create our own 'game'. We usually need to implement at
// least 'draw' and 'update' (not including any local event handling)
// to begin the process. You should also write your own 'init'
// method that will initialise event handlers etc. By default GameCore
// will handle the 'Escape' key to quit the game but you should
// override this with your own event handler.

public class GCTester extends GameCore {

    private Animation anim;
    private Sprite rock;
    long total;         // Total time elapsed
    boolean paused;

    // The obligatory main method that creates
    // an instance of our GCTester class and
    // starts it running
    public static void main(String[] args) {
        GCTester gct = new GCTester();
        gct.init();
        // Start in windowed mode with a 800x600 screen
        gct.run(false, 800, 600);
    }

    // Initialise the class, e.g. set up variables
    // animations, register event handlers
    public void init() {
        total = 0;
        Image player = loadImage("images/rock.png");
        anim = new Animation();
        anim.addFrame(player, 20);

        rock = new Sprite(anim);

        rock.setX(100);
        rock.setY(100);
        rock.setVelocityX(0.1f);
        rock.setVelocityY(0.1f);
        rock.show();
    }

    // Draw the current frame
    public void draw(Graphics2D g) {
        // A simple demo - note that this is not
        // very efficient since we fill the screen
        // on every frame.
        g.setColor(Color.black);
        g.fillRect(0, 0, 800, 600);
        g.setColor(Color.yellow);
        g.drawString("Time Expired:" + total, 30, 50);

        rock.draw(g);
    }

    // Update any sprites and check for collisions
    public void update(long elapsed) {
        if (paused) return;
        total += elapsed;
        if (total > 60000) stop();
        rock.update(elapsed);
    }

    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode == KeyEvent.VK_ESCAPE)
            stop(); // Call GameCore stop method to stop the game loop
        else {
            if (keyCode == KeyEvent.VK_S) rock.stop();
            if (keyCode == KeyEvent.VK_G) rock.setVelocityX(0.1f);

            e.consume();
        }
    }
}

1 Ответ

0 голосов
/ 17 февраля 2020

Вы должны использовать компонент окна, чтобы показать свое приложение на экране. Предположим, что это JFrame (или это может быть JDialog). Создайте JComponent, который будет «прослушивать» ключевые действия, добавьте его к вашему jFrame или любому другому компоненту верхнего окна, который вы используете:

JComponent controlComp = new JComponent() {};
controlComp.setBounds(0, 0, 800, 600); // your bounds
controlComp.setFocusTraversalKeysEnabled(false);
jFrame.add(controlComp);

ActionListener keyEscListener = new ActionListener() {
    public void actionPerformed(ActionEvent actionEvent) {
        paused = !paused;
        // your logic for Escape
    }
};

// tie KeyStroke and keyboard action to the controlComp
KeyStroke keyEsc = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false);
controlComp.registerKeyboardAction(keyEscListener, keyEsc, JComponent.WHEN_FOCUSED);

Этот метод требует создания отдельного объекта Listener и KeyStroke для каждый ключ, который вы хотите слушать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...