입력 객체와 게임 객체의 우려를 어떻게 분리합니까?


20

아마도 개발자가 입력을 처리해야 할 모든 게임에서 아마도 간단한 키보드 및 마우스 이벤트, 터치 이벤트 또는 가속도계 입력과 같은 것일 수 있습니다. 이 입력은 게임에서 오브젝트에 간접적으로 영향을줍니다. 때로는 같은 입력이 다른 객체에 영향을 줄 수 있습니다. 이제 이것을 모델링하는 방법에 대해 생각하고 있습니다. 내가 보는 방식에는 두 가지 다른 접근법이 있습니다.

  • 게임 오브젝트 자체가 처리하고 이벤트를 구독하고 자체 메소드를 호출하게하십시오. 이것은 게임 오브젝트 자체가 어떤 입력이 어떤 행동을 유발하는지 결정하게하는 이점이 있습니다. 단점은 입력 코드가 "핵심"게임 오브젝트 코드와 엉망이되는 것 같습니다. 또한 게임 오브젝트는 게임의 나머지 상태를 인식하지 못하며 때로는 입력 이벤트에 작용하지 않아야합니다. 이것은 옳지 않은 것 같습니다.

  • 일반 입력 컨트롤러가 모든 입력을 처리하고 누가 어떤 이벤트를 처리 할 것인지 결정합니다. 이것은 문제를 더 잘 분리하는 것처럼 보이지만 입력 컨트롤러 클래스를 게임 오브젝트에 깔끔하게 연결합니다. 누가 어떤 이벤트와 어떤 주를 받고 싶어하는지 알아야합니다. 이것도 옳지 않은 것 같습니다.

이를 처리하기 위해 어떤 전략을 사용하고 있습니까?

답변:


7

게임 오브젝트에서 입력 이벤트를 분리하여 10 개의 오브젝트 클래스를 편집하고 디버그하지 않고도 입력 방법을 빠르게 변경 / 업그레이드 할 것을 권장합니다. 키보드 전용 컨트롤에서 마우스 + 키보드로 전환하거나 단순히 키를 재 할당하는 예입니다.

개별 게임 오브젝트에 입력을 단단히 연결하는 대신 게임 오브젝트에서 고유 한 입력 신호 당 하나의 메소드 만 호출하여 실행 방법을 결정하십시오.

입력 컨트롤러를 사용하여 입력 상태를 추적하십시오.

Up press event   -> dir = up
Down press event -> dir = down

입력 상태가 변경 될 때마다 게임 오브젝트를 수정할 준비가되었는지 평가하십시오.

set dir  ->  if gamestate != paused && battlemode == false
             ->  character.changeDir(dir);

게임 컨트롤러에서 필요에 따라 입력 컨트롤러 나 다른 게임 개체에서 호출 할 수있는 일반적인 방법을 구현하십시오.

changeDir (dir)
setSpeed (walk/run)

7

MVC 접근 방식을 권장합니다. MVC에서 게임 객체는 게임 시스템 모델링에 대해 걱정할 필요가 없으며 move_left와 같은 높은 수준의 인터페이스를 제공합니다. 그런 다음 입력을 모델 호출에 매핑하는 것을 걱정하는 컨트롤러 개체를 갖습니다. 컨트롤을 쉽게 변경할 수있을뿐만 아니라 다른 컨트롤러 일뿐 아니라 AI를위한 훌륭한 인터페이스를 제공합니다.

두 번째 옵션에서는 입력 컨트롤러를 두 부분으로 나눌 것입니다. 하나는 실제 장치 터치, 키보드, 가속을 처리 할 수있는 모든 것을 처리 할 수 ​​있으며 일반적인 입력 세트에 매핑해야합니다. 그런 다음 일반 입력을 게임 특정 입력에 매핑하는 두 번째 부분이 있습니다. 키보드의 위쪽 화살표가 입력 1에 매핑되고 터치 스크린의 상단을 터치해도 입력 1에 매핑되고 입력 1을 매핑하는 점프하는 두 번째 조각을 작성합니다. 이제 모든 IO 장치와 저장된 재생 또는 AI 입력을이 일반 입력 시스템에 매핑 할 수 있으며 게임에 입력 1의 의미를 모델에로드하는 작은 게임 특정 부분을 가질 수 있습니다.


5
이 사이트에서 MVC가 일반적으로 게임에 적합한 패턴이 아닌 이유에 대해 많은 논의가 있습니다. 스톤 메탈은 MVC가 아니라 추상화 일뿐입니다. "VCC 사용"은 대답이 아닙니다. MVC는 전체 아키텍처 클래스에 대한 설명이며 문제를 분리 할 수있는 특별한 방법이 아닙니다 (유일한 방법은 아님).

2
MVC는 그에게 A) 위키피디아 기사를 읽어야합니다. 컨트롤러는 저수준 입력 (실제 또는 합성)을 고수준 액션에 매핑하고 일부 이벤트 시스템이 아닌 모델을 직접 조작합니다.
stonemetal

1

게임 ( Model )이 가능한 입력 이벤트 목록을 정의 하도록 제안 합니다 (기본 인터페이스가 공통으로 열거 또는 객체로 구현 됨). 같은 것들 MovingRightStarted, MovingRightStopped, FiredWeapon1, Escape, 등 ...

게임은 queue입력 코드 ( Controller )가 입력 이벤트로 채울 수 있는 데이터 구조 (예 : a )를 정의 합니다.

그런 다음 게임에서 데이터 구조를 폴링하여 입력 이벤트를 얻을 수 있습니다.

이런 식으로 다른 종류의 컨트롤러를 연결하여 모델을 공급할 수 있습니다.

  • 키보드 만
  • 키보드 + 마우스
  • 조종간
  • 터치 스크린
  • 인공 지능

입력 이벤트를 모델로 푸시하기 만하면됩니다.


나는 queue이것을 저장하기 위해 데이터 유형으로 선택하는 것을 제외하고는 당신이 의미하는 바를 이해한다고 생각 합니다. 이유를 설명해 주시겠습니까?
Robert Massa

모델에서 2 개의 입력 이벤트 폴링 사이에서 컨트롤러가 여러 동작 이벤트를 푸시했을 수 있으므로 사용자 입력 순서를 유지하는 것이 중요합니다. 그래서 FIFO 데이터 구조를 선택했습니다. 실제로 입력이 발생한 정확한 시간을 지정해야 할 수도 있습니다.
Splo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.