KeyListener가 창에서 작동을 멈췄습니다.

DrMGC

주말에는 퐁의 복제품을 만들려고했습니다. 처음에는 키 청취가 작동했지만 이후에는 작동하지 않았습니다.

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferStrategy;
import java.util.Random;

import javax.swing.JFrame;

public final class PingPong extends Canvas implements KeyListener {
    private static final long serialVersionUID = 381061428448529952L;

    public static final long FPS_LIMIT = 500;

    public static final int BALL_SIZE = 10;
    public static final int BALL_SPEED = 3;

    public static final int BAT_LENGTH = 64;
    public static final int BAT_WIDTH = 16;
    public static final int BAT_POSITION_SHIFT_X = 16;
    public static final int BAT_SPEED = 2;

    private long fps_;

    public void run() {
        long last = System.currentTimeMillis();
        long now;
        long delta = 0;

        this.resetGame_();
        while(true) {
            now = System.currentTimeMillis();
            delta = now - last;

            if(delta >= 1000 / FPS_LIMIT) {
                this.process_();
                this.draw_();

                this.fps_ = 1000 / delta;

                last = now;
            }
        }
    }

    enum EDirection { LEFT, RIGHT }

    int ballPosX;
    int ballPosY;
    EDirection ballDirection;
    float ballRoll = 0;

    int firstBatPosY;
    int leftScore = 0;

    int secondBatPosY;
    int rightScore = 0;

    private void process_() {
        if(ballDirection == null) {
            Random rnd = new Random();
            ballDirection = rnd.nextBoolean() == true ? EDirection.LEFT : EDirection.RIGHT;
        }

        /*
         * Bats
         */
        if(this.keyW)
            firstBatPosY -= BAT_SPEED;
        else if(this.keyS)
            firstBatPosY += BAT_SPEED;

        if(this.keyUp)
            secondBatPosY -= BAT_SPEED;
        else if(this.keyDown)
            secondBatPosY += BAT_SPEED;

        if(firstBatPosY < 0)
            firstBatPosY = 0;

        if(secondBatPosY < 0)
            secondBatPosY = 0;


        /*
         * Ball
         */
        switch(ballDirection) {
        case LEFT:
            ballPosX -= BALL_SPEED;
            break;
        case RIGHT:
            ballPosX += BALL_SPEED;
            break;
        }
        ballPosY += ballRoll;

        if(ballPosX <= 0) {
            ballDirection = EDirection.RIGHT;
        } else {
            switch(ballDirection) {
            case LEFT:
                if(ballPosX <= BAT_POSITION_SHIFT_X + BAT_WIDTH) {
                    if((ballPosY >= firstBatPosY && ballPosY <= firstBatPosY + BAT_LENGTH)
                       || (ballPosY + BALL_SIZE >= firstBatPosY && ballPosY + BALL_SIZE <= firstBatPosY + BAT_LENGTH)) {
                        ballDirection = EDirection.RIGHT;
                        break;
                    } else {
                        if(ballPosX <= 0) {
                            rightScore++;
                            this.resetGame_();
                        }
                    }
                }
                break;
            case RIGHT:
                if(ballPosX >= super.getWidth() - BAT_POSITION_SHIFT_X - BAT_WIDTH) {
                    if((ballPosY >= secondBatPosY && ballPosY <= secondBatPosY + BAT_LENGTH)
                       || (ballPosY + BALL_SIZE >= secondBatPosY && ballPosY + BALL_SIZE <= secondBatPosY + BAT_LENGTH)) {
                        ballDirection = EDirection.LEFT;
                        break;
                    } else {
                        if(ballPosX >= super.getWidth()) {
                            leftScore++;
                            this.resetGame_();
                        }
                    }
                }
                break;
            }
        }
    }

    private void draw_() {
        BufferStrategy bs = super.getBufferStrategy();

        if(bs == null) {
            super.createBufferStrategy(2);
            super.requestFocus();
            return;
        }

        Graphics gfx = bs.getDrawGraphics();

        gfx.setColor(Color.BLACK);
        gfx.fillRect(0, 0, super.getWidth(), super.getHeight());

        gfx.setColor(Color.GRAY);
        gfx.fillRect(super.getWidth() / 2 - 5, 10, 10, super.getHeight() - 20);

        gfx.setColor(Color.WHITE);
        gfx.fillRect(ballPosX, ballPosY, BALL_SIZE, BALL_SIZE);
        gfx.fillRect(BAT_POSITION_SHIFT_X, firstBatPosY, BAT_WIDTH, BAT_LENGTH);
        gfx.fillRect(super.getWidth() - BAT_POSITION_SHIFT_X - BAT_WIDTH, secondBatPosY, BAT_WIDTH, BAT_LENGTH);

        gfx.setColor(Color.WHITE);
        gfx.drawString(String.valueOf(this.fps_), 10, 20);
        gfx.drawString(String.valueOf(leftScore), super.getWidth() / 2 / 2, 64);
        gfx.drawString(String.valueOf(rightScore), super.getWidth() - (super.getWidth() / 2 / 2), 64);

        gfx.dispose();
        bs.show();
    }

    private void resetGame_() {
        ballPosX = super.getWidth() / 2 - BALL_SIZE / 2;
        ballPosY = super.getHeight() / 2 - BALL_SIZE / 2;
        ballDirection = null;
        ballRoll = 0;

        firstBatPosY = super.getHeight() / 2 - BAT_LENGTH /  2;

        secondBatPosY = super.getHeight() / 2 - BAT_LENGTH /  2;
    }

    boolean keyW, keyS, keyUp, keyDown;

    @Override
    public void keyPressed(KeyEvent _key) {
        switch(_key.getKeyCode()) {
        case KeyEvent.VK_W:    keyW = true; break;
        case KeyEvent.VK_S:    keyS = true; break;
        case KeyEvent.VK_UP:   keyUp = true; break;
        case KeyEvent.VK_DOWN: keyDown = true; break;
        }
    }

    @Override
    public void keyReleased(KeyEvent _key) {
        switch(_key.getKeyCode()) {
        case KeyEvent.VK_W:    keyW = false; break;
        case KeyEvent.VK_S:    keyS = false; break;
        case KeyEvent.VK_UP:   keyUp = false; break;
        case KeyEvent.VK_DOWN: keyDown = false; break;
        }
    }

    @Override
    public void keyTyped(KeyEvent _key) {

    }

    public static void main(String[] args) {
        PingPong game = new PingPong();

        JFrame frame = new JFrame("DrMGC's Ping-Pong");
        frame.setSize(1024, 512);
        frame.setLayout(new BorderLayout());
        frame.setFocusable(true);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.addKeyListener(game);
        frame.add(game, BorderLayout.CENTER);

        frame.setVisible(true);
        game.run();
    }

}

keyPressed () 메소드가 프레임 키 수신으로 호출되지 않더라도 작동하지 않습니다. 즉, 키의 코드에 문제가 없습니다.

DrMGC

동의 : 대신

frame.addKeyListner(game);

쓰다

game.addKeyListner(game);

또는 메소드 run ()

super.addKeyListener(this);

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Chrome DedicatedTools가 Node.js에서 작동을 멈췄습니다.

분류에서Dev

Finder 용 AppleScript가 Mavericks에서 작동을 멈췄습니다.

분류에서Dev

parray가 TCL에서 작동을 멈췄습니다.

분류에서Dev

Eclipse CDT에서 "solution.exe가 작동을 멈췄습니다."

분류에서Dev

sh.exe가 Windows 8에서 작동을 멈췄습니다.

분류에서Dev

Netflix가 Chrome에서 작동을 멈췄습니다.

분류에서Dev

Xcode가 장치에서 작동을 멈췄습니다.

분류에서Dev

ppp가 Fedora 28에서 작동을 멈췄습니다.

분류에서Dev

VsHub 서버가 작동을 멈췄습니다.

분류에서Dev

HDCP가 작동을 멈췄습니다.

분류에서Dev

Apache가 작동을 멈췄습니다.

분류에서Dev

Sox가 작동을 멈췄습니다

분류에서Dev

sudo가 작동을 멈췄습니다.

분류에서Dev

XRDP가 작동을 멈췄습니다!

분류에서Dev

MPI가 갑자기 여러 코어에서 작동을 멈췄습니다.

분류에서Dev

Android Studio 4에서 "adb.exe가 작동을 멈췄습니다."오류

분류에서Dev

Xcode Core Data Editor가 Xcode 12에서 작동을 멈췄습니다.

분류에서Dev

Wirless가 hp Pavillion dv6000의 Ubuntu 13.10에서 작동을 멈췄습니다.

분류에서Dev

USB 드라이버가 Windows 8에서 작동을 멈췄습니다.

분류에서Dev

Flash가 갑자기 SeaMonkey / Ubuntu 13.10에서 작동을 멈췄습니다.

분류에서Dev

직장 전환기가 Ubuntu 16.04에서 작동을 멈췄습니다.

분류에서Dev

일부 <a> 링크가 내 사이트에서 작동을 멈췄습니다.

분류에서Dev

인턴 키보드 테스트가 Chrome에서 작동을 멈췄습니다.

분류에서Dev

Wi-Fi가 갑자기 Ubuntu 18.04에서 작동을 멈췄습니다.

분류에서Dev

VirtualBox가 갑자기 Ubuntu 16.04에서 작동을 멈췄습니다.

분류에서Dev

BitBucket에서 Microsoft Azure Web App 게시가 작동을 멈췄습니다.

분류에서Dev

Cmd + Enter 단축키가 Atom 편집기에서 작동을 멈췄습니다.

분류에서Dev

Kubuntu 17.04에서 터치 패드가 갑자기 작동을 멈췄습니다.

분류에서Dev

갑자기 $ this-> request-> data가 cakephp에서 작동을 멈췄습니다.

Related 관련 기사

  1. 1

    Chrome DedicatedTools가 Node.js에서 작동을 멈췄습니다.

  2. 2

    Finder 용 AppleScript가 Mavericks에서 작동을 멈췄습니다.

  3. 3

    parray가 TCL에서 작동을 멈췄습니다.

  4. 4

    Eclipse CDT에서 "solution.exe가 작동을 멈췄습니다."

  5. 5

    sh.exe가 Windows 8에서 작동을 멈췄습니다.

  6. 6

    Netflix가 Chrome에서 작동을 멈췄습니다.

  7. 7

    Xcode가 장치에서 작동을 멈췄습니다.

  8. 8

    ppp가 Fedora 28에서 작동을 멈췄습니다.

  9. 9

    VsHub 서버가 작동을 멈췄습니다.

  10. 10

    HDCP가 작동을 멈췄습니다.

  11. 11

    Apache가 작동을 멈췄습니다.

  12. 12

    Sox가 작동을 멈췄습니다

  13. 13

    sudo가 작동을 멈췄습니다.

  14. 14

    XRDP가 작동을 멈췄습니다!

  15. 15

    MPI가 갑자기 여러 코어에서 작동을 멈췄습니다.

  16. 16

    Android Studio 4에서 "adb.exe가 작동을 멈췄습니다."오류

  17. 17

    Xcode Core Data Editor가 Xcode 12에서 작동을 멈췄습니다.

  18. 18

    Wirless가 hp Pavillion dv6000의 Ubuntu 13.10에서 작동을 멈췄습니다.

  19. 19

    USB 드라이버가 Windows 8에서 작동을 멈췄습니다.

  20. 20

    Flash가 갑자기 SeaMonkey / Ubuntu 13.10에서 작동을 멈췄습니다.

  21. 21

    직장 전환기가 Ubuntu 16.04에서 작동을 멈췄습니다.

  22. 22

    일부 <a> 링크가 내 사이트에서 작동을 멈췄습니다.

  23. 23

    인턴 키보드 테스트가 Chrome에서 작동을 멈췄습니다.

  24. 24

    Wi-Fi가 갑자기 Ubuntu 18.04에서 작동을 멈췄습니다.

  25. 25

    VirtualBox가 갑자기 Ubuntu 16.04에서 작동을 멈췄습니다.

  26. 26

    BitBucket에서 Microsoft Azure Web App 게시가 작동을 멈췄습니다.

  27. 27

    Cmd + Enter 단축키가 Atom 편집기에서 작동을 멈췄습니다.

  28. 28

    Kubuntu 17.04에서 터치 패드가 갑자기 작동을 멈췄습니다.

  29. 29

    갑자기 $ this-> request-> data가 cakephp에서 작동을 멈췄습니다.

뜨겁다태그

보관