이벤트 처리

사용 가능

1. 소개

게임 엔진을 화면에 무언가를 그리는 데만 사용할 수 있다면 거의 쓸모가 없을 것입니다. 본격적인 게임을 작성하려면 사용자와 상호 작용해야 합니다! 더 정확히 말하면 우리 프로그램은 사용자 행동을 추적하고 이에 응답해야 합니다.

이를 위해 CodeGym 게임 엔진에는 사용자가 마우스 버튼이나 키보드 키를 클릭할 때 호출하는 특수 메서드가 있습니다.

수업의 요점은 이러한 메서드를 직접 작성하면 CodeGym 게임 엔진이 해당 메서드 호출을 담당한다는 것입니다. 코드에서 이러한 메서드를 선언하기만 하면 됩니다. 이것은 소리보다 하기 쉽습니다.


2. 마우스로 작업하기

게임 엔진에는 마우스로 작업하는 두 가지 방법이 있습니다.

void onMouseLeftClick(int x, int y)
void onMouseRightClick(int x, int y)

클래스를 상속하는 자신의 클래스에서 이러한 메서드를 선언하기만 하면 됩니다 Game. 그런 다음 이러한 메서드에 원하는 코드를 작성합니다. 게임 엔진은 사용자가 마우스 버튼을 클릭할 때 이러한 메서드를 호출합니다.

onMouseLeftClick(int x, int y)마우스 왼쪽 버튼을 클릭 하면 엔진에 의해 호출됩니다 . 해당 매개변수는 클릭이 발생한 경기장 셀의 좌표입니다. 왼쪽 상단 셀의 좌표는 입니다 (0,0). @Override이 메서드를 사용하려면 메서드 이름 앞에 주석을 배치하여 재정의해야 합니다 .

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) {
      // Put a "X" in the cell that was clicked with the left mouse button
      setCellValue(x, y, "X");
   }

   @Override
   public void onMouseRightClick(int x, int y) {
      // Clear the cell that was clicked with the right mouse button
      setCellValue(x, y, "");
   }
}

위의 예에서 우리는 두 메서드를 모두 선언했습니다: onMouseLeftClick()onMouseRightClick(). 첫 번째 메서드는 사용자가 경기장의 셀에서 마우스 왼쪽 버튼을 클릭할 때 호출됩니다. 두 번째 메서드는 마우스 오른쪽 버튼을 클릭했을 때 호출됩니다.

인수로 CodeGym 게임 엔진은 (x, y)마우스를 클릭한 경기장 셀의 좌표를 전달합니다.



3. 키보드로 작업하기

게임 엔진에는 키보드 작업을 위한 두 가지 방법이 있습니다.

void onKeyPress(Key key);
void onKeyReleased(Key key);

사용자가 키를 누를 때 무언가를 수행하려면 클래스를 상속하는 클래스에서 이러한 메서드를 선언하기만 하면 됩니다 Game.

이러한 메서드에 코드를 작성하면 사용자가 키를 누르거나 놓을 때 게임 엔진이 이를 호출합니다.

onKeyPress(Key key)아무 키나 누를 때 호출됩니다 . 누른 키(또는 )의 값이 메서드에 매개 변수로 전달됩니다 . 이 메서드를 사용하려면 메서드 이름 앞에 주석을 배치하여 재정의해야 합니다 .Key.UNKNOWNkey@Override

onKeyReleased(Key key)키를 놓으면 호출 됩니다 . 해당 키(또는 )의 값이 매개변수에 할당됩니다 . 이 메서드를 사용하려면 메서드 이름 앞에 주석을 배치하여 재정의해야 합니다 .Key.UNKNOWNkey@Override

이러한 방법을 사용하는 예:

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 spacebar is pressed, the center cell turns yellow
      if (key == Key.SPACE) {
         setCellColor(1, 1, Color.YELLOW);
      }
   }

   @Override
   public void onKeyReleased(Key key) {
      // When the spacebar is released, the center cell returns to white
      if (key == Key.SPACE) {
         setCellColor(1, 1, Color.WHITE);
      }
   }
}


4. 지원되는 모든 키 목록

CodeGym 엔진은 onKeyPress()onKeyReleased()메서드를 호출할 때 눌린(해제된) 키에 대한 정보를 전달합니다. 이를 위해 CodeGym 엔진에는 Key.

엔진의 현재 버전에서 Key유형은 제한된 9개 값 세트만 지원합니다.

사용자가 누른 것
Key.ENTER
사용자가 Enter 키를 눌렀습니다.
Key.ESCAPE
사용자가 Esc 키를 눌렀습니다.
Key.PAUSE
사용자가 일시 중지 키를 눌렀습니다.
Key.SPACE
사용자가 스페이스 키를 눌렀습니다.
Key.LEFT
사용자가 왼쪽 화살표 키를 눌렀습니다.
Key.RIGHT
사용자가 오른쪽 화살표 키를 눌렀습니다.
Key.UP
사용자가 위쪽 화살표 키를 눌렀습니다.
Key.DOWN
사용자가 아래쪽 화살표 키를 눌렀습니다.
Key.UNKNOWN
위에 나열된 것 이외의 모든 키

플레이어가 스페이스바를 누르면 메서드가 매개변수로 onKeyPress()호출됩니다 . Key.SPACE사용자가 왼쪽 화살표를 누르면 매개변수는 가 됩니다 Key.LEFT. 사용자가 위 목록에 없는 키를 누르면 메서드가 매개 변수로 onKeyPress()호출됩니다 .Key.UNKNOWN

여기서 문제는 기존 CodeGym 게임이 휴대폰에서 실행되도록 설계되었다는 것입니다. 표준 키보드 대신 8개의 가상 버튼이 있습니다.


5. 타이머로 작업하기

많은 게임이 실시간으로 진행됩니다. 즉, 사용자가 아무것도 하지 않아도 특정 이벤트가 게임에서 계속 발생합니다. 이러한 게임을 구현할 수 있도록 게임 엔진에 타이머를 추가했습니다.

작동 방식은 다음과 같습니다. 타이머를 켜고 트리거되어야 하는 시간을 설정합니다. 예를 들어 500ms입니다. 그런 다음 0.5초마다 CodeGym 게임 엔진이 메서드를 호출합니다 onTurn(). 무한한 횟수 — 타이머가 꺼질 때까지.

타이머는 어떻게 사용하나요?

1. 타이머 켜기

타이머를 켜는 void setTurnTimer(int timeMs)방법이 있습니다. 이 메서드는 콜백 사이의 간격 기간(밀리초 또는 1/1000초)을 인수로 사용합니다. 이 메서드를 한 번만 호출하면 게임 엔진이 밀리초 onTurn()마다 메서드 호출을 시작합니다 timeMs.

2. onTurn(int)메서드 재정의

이렇게 하려면 클래스 void onTurn(int step)를 상속하는 클래스에서 메서드를 선언해야 합니다 Game. 게임 엔진은 이 메서드를 호출합니다. 호출할 때마다 엔진은 메서드 호출을 식별하는 일련 번호( 1, 2, 3, ...)를 전달합니다.

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 3x3 playing field
      setScreenSize(3, 3);
      showGrid(false);
      setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);

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

   @Override
   public void onTurn(int step) {
      if (step == 100) {
         stopTurnTimer(); // If this is the 100th callback, then turn off the timer
      }

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

이 간단한 예에서는 3셀 x 3셀인 필드를 만들었습니다. onTurn()그런 다음 0.5초마다 메서드를 호출하는 타이머를 켭니다 .

여기에서 중앙 셀의 색상은 0.5초마다 변경됩니다. 셀의 텍스트는 변경되지 않습니다. 50초(콜백 100회) 후 색상 변경이 중지되고 타이머가 꺼집니다.


코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다