게임 내 이벤트를 관리하는 가장 좋은 방법은?


13

게임 중 일부 이벤트가 가끔씩 발생해야하는 게임을 만들고 있습니다. 좋은 예가 튜토리얼입니다. 게임을 시작하면 게임의 여러 지점에서 이벤트가 발생합니다.

  • 당신은 당신의 첫 번째 적을 만나고, 게임이 멈추고 그것을 죽이는 방법에 대한 설명을받습니다.
  • 당신은 첫 번째 적을 죽이고 "좋은 직업"메시지를받습니다.
  • 아이템 통계 팝업 메뉴가있는 새로운 아이템을 얻습니다.

내가 작업중 인 게임은 게임의 규칙이 거의 동일한 퍼즐 게임이므로 이러한 모든 이벤트를 별도의 수준으로 하드 코딩하는 것은 비효율적입니다.

XML과 같은 외부 소스에서 이러한 이벤트를 어떻게 정의해야합니까? 그런 다음 XML을 읽고 레벨에 대한 이벤트 요구 사항을 설정하는 인터프리터를 작성하십시오. 예를 들어 두 명의 적을 죽일 때 발생하는 이벤트를 어떻게 정의 할 수 있는지 잘 모르겠습니다.

분명히하기 위해이 작업을 수행하는 데 가장 적합한 프로그래밍 언어 또는 스크립팅 언어가 아니라이를 처리하는 가장 좋은 방법을 찾고 있습니다.

감사!


편집 : 내 질문을 이해하기가 어려워 두 번째 예 :

내가 겪고있는 문제는 게임에서 몇 가지 추가 작업을 항상 거의 동일한 절차로 수행하는 것입니다. 롤 플레잉 전투처럼 모든 사람은 차례가 있고 기술 등을 고릅니다. 항상 같습니다. 그러나 그 사이 어딘가에 컷씬을 표시하고 싶은 경우가 있다면 어떨까요? 컷씬이 포함 된 변경된 전투 클래스를 통과하기 위해 전체 게임 구조를 수정하는 것은 매우 비효율적입니다. 나는 이것이 일반적으로 어떻게되는지 궁금합니다.


8
과장을 만들려고하지 마십시오. 예를 들어 튜토리얼은 매우 구체적이며 다양한 트리거 / 이벤트가 제공됩니다. 하드 코딩 / 스크립트에 문제가 없습니다.
Maik Semder

1
@Maik 당신이 답을 Id +1에 넣으면 .. 간단하고 해결하는 것이 어느 날보다 더 좋습니다.
James

두 번째 예는 추상 메시징 시스템이 큰 승리임을 분명히 보여줍니다. 튜토리얼의 경우 처음부터 한 번만 발생하기 때문에 하드 코딩 할 수 있지만 게임의 전체 기간 동안 언제든지 발생할 수있는 진행중인 이벤트의 경우 다릅니다.
jhocking

여전히 약간 모호합니다. 3 가지 컷씬에 대해 적어도 3 가지 트리거를 나열하십시오. 일반적으로 대답하기가 매우 어렵습니다. 기본적으로 가장 잘 구현하는 방법을 이해하려면 공통 패턴을 찾아야합니다.
Maik Semder

무엇을 원하세요? 작업을 일시 중지하고 추가 작업을 수행 한 다음 작업을 일시 중지하고 싶습니까?
user712092

답변:


7

이것은 이벤트가 게임 내 오브젝트간에 실제로 통신되는 방식에 따라 다릅니다. 예를 들어 중앙 메시징 시스템을 사용하는 경우 특정 메시지를 수신하고 특정 메시지를들을 때마다 자습서 팝업을 작성하는 자습서 모듈이있을 수 있습니다. 그런 다음 XML 파일 또는 학습서 모듈에서 구문 분석 한 내용으로 표시 할 팝업과 함께 수신 할 메시지를 설정할 수 있습니다. 게임 상태를 모니터링하고 게임에서 물건을 발견했을 때 튜토리얼 팝업을 표시하는 별도의 튜토리얼 객체를 가짐으로써 게임에 대해 다른 것을 변경할 필요없이 튜토리얼 객체를 마음대로 변경할 수 있습니다. (이것은 옵저버 패턴입니까? 모든 디자인 패턴에 익숙하지는 않습니다.)

전반적으로 걱정할만한 가치가 있다면 튜토리얼의 복잡성에 달려 있습니다. 코드 및 / 또는 레벨에서 이벤트를 하드 코딩하는 것은 소수의 튜토리얼 팝업으로 큰 도움이되지 않습니다. 모든 트리거를 수행 할 때마다 TutorialModule.show ( "1st_kill")과 같은 메시지를 튜토리얼 모듈에 디스패치하기 때문에 비효율적이라고 생각하는 것이 정확히 무엇인지 궁금합니다.


퍼즐 게임이기 때문에 그의 논리는 여러 레벨의 한 위치에 있으며, 이에 대한 자습서를 작성 해야하는지 확인하는 것이 끝이 아닙니다. 솔직히 퍼즐 게임이라면 이것이 가장 예쁜 코드가 아니더라도 큰 타격을 입을 것이라고 생각하지 않으며, 배송되는 게임에서 작동하는 코드가 항상-항상- 결코 빛을 보지 못하는 예쁜 코드보다 100 % 더 좋습니다.)
James

옵저버 패턴과 같은 것을 생각하지 마십시오. 좋은 해결책처럼 들립니다. 시도해
볼게요

7

내가 이해하는 디자인 제약은 다음과 같습니다.

  1. 핵심 게임 플레이 코드는 레벨 요구 사항에 신경 쓰지 않으며이를 처리하는 코드와 결합되어서는 안됩니다.

  2. 동시에, 요구 사항을 충족시키는 특정 이벤트 (항목 가져 오기, 적 처치 등)가 발생하는 시점을 아는 핵심 게임 플레이 코드입니다.

  3. 레벨마다 요구 사항이 다르므로 어딘가에 설명해야합니다.

이러한 점을 감안할 때 다음과 같은 작업을 수행 할 수 있습니다. 먼저 게임 수준을 나타내는 클래스를 만듭니다. 레벨이 갖는 특정 요구 사항 세트를 캡슐화합니다. 게임 이벤트가 발생할 때 호출 할 수있는 메소드가 있습니다.

핵심 게임 플레이 코드에 현재 레벨 오브젝트에 대한 참조를 제공하십시오. 게임 플레이 이벤트가 발생하면 메소드를 호출하여 레벨을 알려줍니다 : enemyKilled,itemPickedUp , 등

내부적 Level으로 몇 가지가 필요합니다.

  • 이미 발생한 이벤트를 추적 할 상태입니다. 이렇게하면 첫 번째를 구별 할 수 있습니다 죽인 적을 다른 사람 있으며, 주어진 아이템을 처음 집었을 때를 알 수 있습니다.
  • LevelRequirement해당 레벨에 필요한 특정 목표 세트를 설명하는 오브젝트 목록 .

레벨을 입력 Level하면 올바른을 사용하여을 만들고 LevelRequirement게임 플레이 코드를 설정 한 다음 해당 레벨을 지정합니다.

게임 이벤트가 발생할 때마다 게임 플레이가로 전달됩니다 Level. 그러면 집계 데이터 (사망 된 적의 총 수, 해당 유형의 적 등)가 계산됩니다. 그런 다음 요구 사항 개체를 통해 각 개체에 집계 데이터를 제공합니다. 요구 사항이 충족되는지 여부를 테스트하고, 해당되는 경우 결과 동작이 적절하게 발생하는지 확인합니다 (자습서 텍스트 표시 등).

LevelRequirement 기본적으로 두 가지가 필요합니다.

  1. 요구 사항이 충족되었는지 확인하기 위한 테스트 에 대한 설명입니다 . 언어가 그렇게 쉬운 경우 함수일 수 있습니다. 그렇지 않으면 데이터로 모델링 할 수 있습니다. (즉, 각 종류를 확인하는 방법을 알고 있는 RequirementType것과 비슷한 것들이 있는 열거 형이 있습니다.)FIRST_KILLswitch
  2. 요구 사항이 충족 될 때 수행 할 조치입니다.

이러한 일련의 요구 사항이 어디에 설명되어 있는지 여전히 의문입니다. XML 또는 다른 텍스트 파일 형식과 같은 작업을 수행 할 수 있습니다. 다음과 같은 경우에 유용합니다.

  1. 비 프로그래머는 레벨을 작성합니다.
  2. 재 컴파일 및 / 또는 재시작없이 요구 사항을 변경할 수 있기를 원합니다.

둘 중 어느 것도 해당되지 않는다면 아마도 코드로 직접 생성 할 것입니다. 단순할수록 항상 좋습니다.


처음 3 점은 제가 지금 사용하고있는 방법에 대한 아주 가까운 설명입니다. 그래, 내가 가장 힘들어하는 것은 요구 사항을 설명하는 위치와 그것을 게임으로 변환하는 방법입니다 (아마도 외부적인 것이기 때문에). 자세한 설명 감사합니다 :)
omgnoseat

5

이 이벤트를 만드는 방법을 알아야하고 나머지 게시물에 관한 내용을 알아야한다고 생각했습니다.이 이벤트를 저장하려면 관계형 데이터베이스를 사용하거나 텍스트를 사용하여 스크립트를 작성하고 스크립팅 언어를 사용하십시오 (파싱 및 평가를 수행합니다) 당신). :)

원하는 것은 이벤트가 발생했음을 인식하고 (1)이 이벤트가 요구하는 몇 가지 조치를 수행하는 것입니다 (메시지 인쇄, 키 누르기 확인 ...) (2). 또한 이러한 이벤트를 한 번만 발생 시키려고합니다 (3).

기본적으로 조건을 확인한 다음 동작을 예약하려고합니다.

이벤트를 인식하는 방법 (1)

  • "처음 발생한 적", "새 아이템 획득"과 같은 이벤트를 인식하려고합니다.
  • 일반 부품이 발생하는 경우 " 적 대기 ", " 항목 획득 "특정 부품 " 먼저 확인" ... "," 품목 획득 "

이벤트는 무엇입니까

보다 일반적인 관점에서, 이러한 각 이벤트는 다음과 같이 구성됩니다.

  • 전제 조건 , 당신은 그들을 확인
  • 전제 조건이 충족 될 때 수행 되는 작업 (예 : ""첫 번째 적을 죽였다! "," "A 및 B 버튼을 눌러 콤보 만들기", "계속하려면 '입력'을 누르십시오", 키를 입력해야 함 "))

이러한 이벤트를 저장하는 방법

일부 데이터 구조에서 :

  • 전제 조건 목록 (고급 언어로 작성하는 경우 문자열 또는 코드)
  • 동작 목록이 있습니다 (문자열 일 수도 있고 Quake 엔진은 이벤트에 문자열을 사용합니다)

이 게임을 크게 만들고 싶다면 필요하지 않은 것처럼 보이지만 관계형 데이터베이스에 저장할 수도 있습니다.

그런 다음이 문자열 / 사물을 구문 분석해야합니다. 또는 Python 또는 LUA와 같은 일부 스크립팅 언어 나 LISP와 같은 언어를 사용할 수 있으며 모두 구문 분석하고 실행할 수 있습니다. :)

게임 루프에서 이러한 이벤트를 사용하는 방법 (2)

다음 두 가지 데이터 구조가 필요합니다.

  • 이벤트 큐 (실행 예정 이벤트는 여기에 놓임)
  • 작업 대기열 (예약 된 작업, 이벤트는 어떤 작업이 수행되는지 나타냄)

연산:

  • 이벤트사전 조건 중 일부 가 충족 되면 이벤트 큐에 넣습니다.
  • (3) 그런 다음 원하는 경우이 이벤트가 한 번만 발생하도록해야합니다 (예 : 부울 배열 has_this_event_happened [ "첫 번째 적 발생"]
  • (경우 작업 큐는 다음, 비어)가에있는 이벤트의 경우 큐 이벤트 당신은 그의 넣어 작업을작업 큐 와 그를 제거 이벤트 큐
  • 작업 대기열작업 이있는 경우 필요한 작업 을 시작합니다.
  • 그러한 조치 가 수행 된 경우 조치 큐 에서 제거하십시오.

이러한 행동을 스스로하는 방법 (2)

기능 "update"가있는 객체 목록을 만듭니다. 엔티티 (Quake 엔진) 또는 액터 (Unreal Engine)라고도합니다.

  1. 조치 대기 행렬에서 시작하도록 요구 될 때 이러한 오브젝트를 시작합니다.
  2. 이 객체는 다른 타이머와 같은 다른 용도로 사용될 수 있습니다. Quake에서 이러한 엔티티는 전체 게임 로직에 사용되므로 이에 대한 자료를 읽어 보는 것이 좋습니다 .

액션 "무언가"

  1. 당신은 화면에 뭔가를 인쇄
  2. 이 메시지가 몇 초 동안 나타나기를 원합니다
  3. "업데이트"에서 :
    • 변수 remove_me_after를 만들고 시간이 지나면 감소
    • variable이 0 인 경우 조치 대기 행렬 에서이 조치를 제거합니다.
    • 또한이 개체를 제거하거나 제거되도록 예약하십시오.

조치 "키 필요"

  1. 그것은 당신이 그것을 만들고 싶어하는 방법에 달려 있습니다.
  2. "업데이트"에서 :
    • 원하는 키 누르기 이벤트 만 확인하십시오.
    • 키 누르기 이벤트를 유지하려면 배열 / 큐가 필요할 것입니다.
    • 그런 다음 작업 대기열 에서 객체를 제거하고 객체를 제거 할 수 있습니다

배울 방법


-1 맞아요, 아니면 그냥 함수를 호출합니다. 진지하게 OP는 특정 조건이 충족 될 때 메시지 상자를 원합니다
Maik Semder

그것은 아주 좋은 글이지만, 내가 찾던 것이 아닙니다. 나는 내가 원하는 것을 설명하는 데 어려움을 겪었습니다. 두 번째 설명을 추가했습니다. 제가 겪고있는 문제는 게임에서 몇 가지 추가 작업을 항상 거의 동일한 절차로 수행하는 것입니다. 롤 플레잉 전투처럼 모든 사람은 차례가 있고 기술 등을 고릅니다. 항상 같습니다. 그러나 그 사이에 컷 장면을 표시하려는 경우가 있다면 어떨까요? cutsene을 포함하여 변경된 전투 클래스를 통과하기 위해 전체 게임 구조를 수정하는 것은 매우 비효율적입니다. 이것이 일반적으로 어떻게 수행되는지 궁금합니다.
omgnoseat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.