CodeGym /Java Blog /무작위의 /CodeGym의 게임 섹션: 이벤트 처리
John Squirrels
레벨 41
San Francisco

CodeGym의 게임 섹션: 이벤트 처리

무작위의 그룹에 게시되었습니다
CodeGym의 "Games"는 인기 있는 게임의 자신만의 버전을 만드는 크고 흥미로운 작업이 포함된 새로운 섹션입니다. 간단합니다. 각 게임 프로젝트는 하위 작업으로 나뉩니다. 하나씩 완료하면 게임이 완료됩니다. 소셜 네트워크에서 공유하고 친구를 초대하여 플레이할 수 있습니다. 이 기사에서는 게임 작성에 사용되는 이벤트 처리CodeGym의 "게임" 섹션: 이벤트 처리 - 1 방법에 대해 자세히 설명합니다 .

1. 마우스로 작업하기

게임 엔진에는 마우스로 작업하는 두 가지 방법이 있습니다.
  • void onMouseLeftClick(int x, int y);

  • void onMouseRightClick(int x, int y);

를 상속하는 클래스에서 이러한 메서드를 선언 Game하고 원하는 코드를 추가하기만 하면 됩니다. 게임 엔진은 사용자가 마우스 버튼을 클릭할 때 이를 호출합니다.
  1. onMouseLeftClick(int x, int y)— 마우스 왼쪽 버튼을 클릭하면 엔진에서 호출됩니다. 해당 매개변수는 클릭이 발생한 경기장 셀의 좌표입니다. 왼쪽 상단 셀의 좌표는 (0, 0)입니다. 이 메서드를 사용하려면 재정의해야 합니다.

  2. onMouseRightClick(int x, int y)— 마우스 오른쪽 버튼을 클릭했을 때 호출됩니다. 이 방법은 onMouseLeftClick(int x, int y)방법처럼 작동합니다.

다음은 이러한 방법을 사용하는 예입니다.

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;
import com.codegym.engine.cell.Key;

public class MySuperGame extends Game {
    @Override
    public void initialize() {
        // Set the size of the playing field to 3x3
        setScreenSize(3, 3);

        // Paint the playing field white
        for (int x = 0; x < 3; x++) {
            for (int y = 0; y < 3; y++) {
                setCellColor(x, y, Color.WHITE);
            }
        }
    }

    @Override
    public void onMouseLeftClick(int x, int y) {
        // Set "X" in the cell where the left mouse click occurred
        setCellValue(x, y, "X");
    }

    @Override
    public void onMouseRightClick(int x, int y) {
        // Clear the cell where the right mouse click occurred
        setCellValue(x, y, "");
    }
}

2. 키보드로 작업하기

게임 엔진에는 키보드 작업을 위한 두 가지 방법이 있습니다.
  • void onKeyPress(Key key);

  • void onKeyReleased(Key key);

사용자가 키를 누를 때 어떤 일이 일어나게 하려면 Game을 상속하는 클래스에서 이러한 메서드를 선언하고 여기에 코드를 추가하십시오. 게임 엔진은 사용자가 키를 누르거나 놓을 때 이를 호출합니다.
  1. onKeyPress(Key key)— 아무 키나 누를 때 호출됩니다. 키 매개변수는 누른 키(또는 Key.UNKNOWN)입니다.

  2. onKeyReleased(Key key)— 키를 놓았을 때 호출됩니다. 키 매개변수는 해당 키(또는 Key.UNKNOWN)입니다.

다음은 이러한 방법을 사용하는 예입니다.

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;
import com.codegym.engine.cell.Key;

public class MySuperGame extends Game {
    @Override
    public void initialize() {
        // Set the size of the playing field to 3x3
        setScreenSize(3, 3);

        // Paint the playing field white
        for (int x = 0; x < 3; x++) {
            for (int y = 0; y < 3; y++) {
                setCellColor(x, y, Color.WHITE);
            }
        }
    }

    @Override
    public void onKeyPress(Key key) {
        // When the space bar is pressed, the center cell turns yellow
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.YELLOW);
        }
    }

    @Override
    public void onKeyReleased(Key key) {
        // When the space bar is released, the center cell changes back to white
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.WHITE);
        }
    }
}
중요한! 게임 엔진의 현재 버전에서 키 유형에는 9개의 값으로 제한된 세트가 있습니다.
사용자가 누른 키
키.엔터 사용자가 Enter 키를 눌렀습니다.
키.이스케이프 사용자가 Esc를 눌렀습니다.
키.PAUSE 사용자가 일시중지를 눌렀습니다.
키.스페이스 사용자가 스페이스바를 눌렀습니다.
키.왼쪽 사용자가 왼쪽 화살표 키를 눌렀습니다.
키.오른쪽 사용자가 오른쪽 화살표 키를 눌렀습니다.
키업 사용자가 위쪽 화살표 키를 눌렀습니다.
키다운 사용자가 아래쪽 키를 눌렀습니다.
키.알 수 없음 사용자가 위의 키 이외의 키를 눌렀습니다.

3. 타이머 작업

많은 게임은 실시간으로 발생합니다. 즉, 사용자가 아무것도 하지 않아도 게임에서 이벤트가 계속 발생합니다. 이러한 게임을 구현할 수 있도록 게임 엔진에 타이머를 추가했습니다. 다음과 같이 작동합니다. 타이머를 켜고 타이머 간격을 설정합니다. 예를 들어 500밀리초입니다. 그런 다음 0.5초마다 게임 엔진이 onTurnTimer()메서드를 호출합니다. 계속해서 영원히 — 타이머가 꺼질 때까지. 그럼 타이머는 어떻게 사용하나요?
  1. 타이머를 켜십시오.

    이를 위해 특별한 방법이 있습니다 . 이 메서드는 밀리초(1밀리초 = 1/1000초) 단위의 호출 간격을 인수로 사용합니다. 한 번만 호출하면 게임 엔진이 매 밀리초마다 메서드 호출을 시작합니다.void setTurnTimer(int timeMs)onTurn()

  2. onTurn(int) 메서드를 재정의합니다.

    이렇게 하려면 상속하는 클래스에서 메서드를 선언해야 합니다 . 이 메소드는 게임 엔진에 의해 호출됩니다. 또한 각 호출에서 게임 엔진은 호출에 대한 순차적 식별자(1, 2, 3, …)를 메서드에 전달합니다.void onTurn(int step)Game

  3. 타이머를 끕니다.

    예를 들어 사용자가 게임을 완료하면 타이머가 더 이상 필요하지 않으면 끌 수 있습니다. 이렇게 하려면 메서드를 호출하기만 하면 됩니다.stopTurnTimer()

  4. 타이머를 가속하거나 변경합니다.

    일부 게임에서는 이벤트 발생 속도가 지속적으로 빨라지므로 타이머 속도를 높이는 것이 편리합니다(호출 간격을 줄임). 이보다 더 쉬울 수는 없습니다. setTurnTimer(int timeMs)새 값으로 다시 한 번 호출하면 호출 사이의 시간이 onTurn()변경됩니다.

예를 들어:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;

public class MySuperGame extends Game {
    …
    @Override
    public void initialize() {
    	// Create a playing field that is 3 cells x 3 cells
        setScreenSize(3, 3);
        showGrid(false);
        setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);

        setTurnTimer(500);   // Turn on the timer, the interval between calls is 500ms.
    }

    @Override
    public void onTurn(int step) {
        if(step == 100) {
            stopTurnTimer();  // If 100 calls have been made, turn off the timer
        }

        if (step % 2 == 1) {
            // If this call is odd, set the cell background to red
            setCellColor(1, 1, Color.RED);
        } 
        else {
            // If this call is even, set the cell background to blue
            setCellColor(1, 1, Color.BLUE);

        }
    }
    …
}
이 간단한 예에서는 셀 3개 x 셀 3개인 필드를 만들었습니다. onTurn()그런 다음 0.5초마다 메서드를 호출하는 타이머를 시작했습니다 . 0.5초마다 셀 색상이 변경되지만 내용은 변경되지 않습니다. 50초 후에는 색상이 더 이상 변경되지 않습니다. 지금은 여기까지입니다! "게임" 섹션에 대해 자세히 알아보려면 다음과 같은 유용한 문서를 참조하세요.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION