게임 스토리 이벤트 프로그래밍


28

c / c ++ 및 DirectX에서 게임 엔진을 개발했습니다.

맵, 애니메이션 플레이어 / NPC 스프라이트, NPC와 대화, 메뉴 및 레벨 변경을위한 타일 엔진이 있지만 게임이 없으며 비어 있습니다.

나는 주변을 둘러보고 유행어 답변을 계속 들었지만 내 게임에서 스토리를 구현하는 방법을 알고 싶습니다.

어떤 사람들은 게임에서 가능한 모든 행동 / 상태를 통제하는 플래그를 저장하는 저장 파일을 말했지만이 소리가 들립니다.

그것은 야심 찬 것이지만 나는 오래된 포켓몬 / 파이널 판타지 게임과 같은 게임을 목표로하고 있습니다.

이 게임들이 어떻게 작동하는지 또는 이론이 어떻게 사용되는지 아는 사람이 있습니까?

나는 오랫동안 찾고 있었고 사람들의 의견을 진심으로 감사하겠습니다.

답변:


19

게임 스토리는 유한 상태 오토 마톤 (또는 일종의 확장 FSA) 형식이어야합니다. 특정 이벤트가 발생하면 새로운 상태로 이동해야합니다. 이렇게하면 현재 상태와 FSA에서 다음에 어디로 이동할지 (위치, 건강 등의 플레이어 세부 정보와 함께) 알기 위해 필요한 정보 만 저장하면됩니다.

예를 들어, 포켓몬 게임을 지나치게 단순화하면 체육관 배지가 FSA의 주요 지점을 형성합니다. 배지가없는 상태 0에서 시작하고 체육관 리더를 이길 때 상태, 상태 1, 상태 2 등으로 이동합니다. 게임 엔터티가 현재 상태로 업데이트되도록하려면 현재 상태를 볼 수 있습니다. 예를 들어, 3rd gym 외부의 NPC는 현재 상태를 확인하고 3 개의 배지가있는 상태에있는 것을보고 그에 따라 응답합니다 ( "아침"으로 표시).

세상의 모든 상태를 저장할 필요는 없습니다. 이야기의 상태. 엔티티 자체는 현재 상태에 따라 반응하는 방법을 알고 있습니다.


재미있는 접근 방식과 시도해보아야하지만 스토리 진행에 의존하지 않는 사이드 퀘스트를 어떻게 추적합니까?

그것은 당신의 이야기가 얼마나 복잡한 지에 달려 있습니다. 여러 개의 FSA (하위 스토리 당 하나)를 갖는 것이 가장 쉬울 수도 있고 복잡한 분기가 필요할 수도 있습니다. 앉아서 이야기를 로드맵으로 그려야합니다. 모든 것이 어떻게 얽혀 있는지 이해할 때 현재 상태 (또는 한 번에 둘 이상에있을 수있는 상태)를 저장할 수있는 방법에 대해 생각하십시오. 스토리에 의존하지 않기 때문에 NPC의 위치 (저장해야 할 경우) 및 특정 캐릭터의 건강과 같은 일부 항목을 별도로 저장해야합니다.

이 FSA는 당신이 이것에 대한 설명을 어디에서 찾을 수 있는지에 대한 이야기입니다.
Skeith

전 세계의 상태 머신에 대한 모든 것을 배울 수 있지만 게임에 대해 이야기하지 않는 시간의 99.9 %입니다. 계산에 대한 입문서는 그들에 대해 가르쳐 줄 것이지만 실제로는 그다지 많은 세부 사항이 필요하지 않습니다. 특정 이벤트가 발생했을 때 상태에 있고 그 사이에서 이동한다는 개념을 이해하면됩니다. @ pwny의 응답은 실제로 다른 방식으로 동일한 것을 말하는 것입니다. FSA에 대해 읽는 것은 상태 머신의 개념을 배우는 좋은 방법이 될 것입니다. 스테이트 머신 소개를위한 Google!
Joseph Mansfield

7

게임의 가능한 상태 세트를 사용할 수 있습니다. NPC와 세계는 해당 상태를 인식하고 그에 따라 반응 / 표시합니다. 일부 동작 / 이벤트에 의해 활성화 될 트리거 세트를 정의 할 수도 있습니다.

예를 들어, 특정 상대를 때리면 트리거 A가 활성화되어 상태 S가 월드에 추가되고 상태 S에서 캐릭터가 상대의 은신처에서 벗어날 때 감전됩니다. 아니면 밖에 비가 온다. 아니면 당신은 희귀 사탕을 찾을 수 있습니다. 당신은 요점을 얻습니다.

게임에이 두 가지 간단한 추가 기능을 사용하면 게임을 더욱 "살아"게 할 수 있습니다.

세계, 캐릭터 및 스토리 라인을위한 풍부한 배경을 만들고 게임이 해당 배경과 일치하는지 확인하십시오. 먼저 이야기를 계획하십시오.

또한 Gamedev를 사용해보십시오


그것은 가능하지만 전문가가 더 나은 것을 가지고 있다고 확신합니다. 나는 단지 대규모 게임에 대한 현실적인 접근 방식으로 보지 않습니다. 링크 주셔서 감사합니다

반드시 그런 것은 아니지만 5 개의 독립적 인 중첩 가능한 상태를 상상해보십시오. 5 개의 부울에 대해 32 개의 가능한 분기를 얻습니다. 나는 그것이 합리적이라고 생각합니다. 또한 트리거 시스템은 많은 전문 게임에서 사용됩니다. 특히 일련의 트리거를 사용하여 동작을 스크립팅 할 수 있기 때문입니다.
pwny

2

sftrabbit가 언급했듯이 이것은 상태 머신에 대한 완벽한 응용 프로그램입니다.

기본적으로 일종의 트리 구조가 있습니다. 각 리프 / 노드는 현재 상태에 대한 정보와 다음 상태로 진행하기위한 규칙을 포함합니다. 플롯 / 플레이 흐름이 얼마나 복잡한 지에 따라 각 노드에 여러 개의 이탈이 포함될 수 있습니다.

이것에 대한 아주 느슨한 아날로그는 Choose Your Own Adventure 책입니다. 각 페이지에는 스토리의 일부를 설명하는 텍스트와 플레이어가 할 수있는 결정이 포함되어 있습니다. 각 결정은 다른 페이지로 연결됩니다. 일부 페이지는 이전에 방문한 페이지 등으로 다시 연결될 수 있습니다.

ZorkPhobos의 가죽 여신 과 같은 오래된 텍스트 기반 어드벤처 게임과 악명 높은 Sierra * Quest 게임 ( Roger Wilco가 우주 관리인이 주연 한 SpaceQuest )은이 유형의 시스템의 매우 간단한 버전을 사용했습니다. 지도의 각 방은 다른 주나 방과 연결된 출구가있는 상태였습니다. 아이템을 획득하면 전역 상태 객체에서 플래그가 설정됩니다. 각 방마다 깃발을 확인하여 각 방에서 사용할 수있는 캐릭터 나 아이템을 결정합니다.

따라서 상태는 클래스 또는 구조체로 구현 될 수 있으며 각 속성은 다음과 같습니다.

자산 목록-배경 그래픽에 대한 포인터 목록 및 방 / 주 / 레벨을 표시해야하는 기타 항목.

입학 조건-레벨에 도달하기 위해 이미 도달 한 업적

엑시트-가능한 각 "다음"엑시트에 링크합니다. 북쪽, 남쪽, 동쪽 및 서쪽이 여기에 해당하는 예이지만 Door1, Teleport 등을 포함 할 수도 있습니다. 방을 나 가려고 시도하거나 출구 / 문을 결정하는 것이 "열림"이면 게임에서 다음 상태를 확인할 수 있습니다. 입장 조건이 충족되었는지 확인하고 출구가 화면에 표시되는 방식을 변경하거나 플레이어가 그 방향으로 움직이지 못하게하십시오.

화려하고 싶다면 입장 조건이 다른 상태의 다른 버전을 포함시켜 룸이 플레이어에게 제시되는 방식 또는 해당 룸에서 사용 가능한 작업을 변경할 수 있습니다.

시작 화면, 사망 / 게임 오버 화면 등은 메뉴 화면 사이를 탐색하는 방식과 유사하게 시스템 내의 모든 상태 일 수 있습니다. 실제로 그러한 메뉴 시스템이 있다면이를 위해 사용할 수 있습니다. 메뉴를 탐색하기 위해 위 / 아래 화살표와 "입력"대신, 텔레포트 패드를 밟거나, 화면 오른쪽을 걷는 등의 특정 이벤트를 게임 플레이 영역 내에서 찾을 수 있습니다.

관리 관점에서, 상태 머신을 작성할 수있는 관리 도구 작성의 이점이 있는지 고려하십시오. 방을지도에 추가하고, 방을 연결하고, 배경 이미지와 같은 자산을 할당하십시오. 이것은 아마도 처음 시도 할 때 너무 과도합니다. 관리 도구를 만드는 데 너무 쉽게 빠져 실제로 게임을 끝내지 않습니다. 기억하십시오-미들웨어가 아니라 게임입니다.

이것이 도움이되기를 바랍니다.


이 예제는 도시를 뒤흔들다. 타일 ​​레이아웃과 그래픽 및 크기, npc 목록 및 일반적인 것들을 포함하는 파일이 있습니다. 새로운 타운 캠을 게임에 추가하여 다른 사람들이 계획에 기여할 수 있도록 파일을 추가함으로써 파일이 다소 꽉 차고 복잡해졌습니다. 내가 당신을 이해한다면 나는 진행 상황을 추적하기 위해 깃발과 함께이 파일에서 상기 도시에서 일어날 수있는 이벤트를 넣을 것입니까?
Skeith

@Skeith 예, 합리적인 접근법처럼 들립니다.
3Dave

0

나는이 게임 엔진을 VERGE 라고 했었다 . 그걸로 놀아보고 이벤트를 처리하는 방법을보십시오. 정말 좋아합니다. 오픈 소스이기도하므로 여기에서 어떻게 구현하는지 확인할 수 있습니다 . 다음은 간단한 설명입니다.

각지도에는 다양한 레이어가 있습니다. 그래픽 레이어는 여러 개가있을 수 있습니다. 방해 층. 그리고 존 레이어가 있습니다. 존 레이어는 여기서 중요한 것입니다. *

각 타일에는 해당 영역이 속한 영역을 나타내는 숫자가 있습니다. 각 영역은 두 가지 기본 방법으로 활성화 할 수 있습니다. 플레이어가 영역에 진입하면 영역이 활성화되거나 인접 활성화가 있습니다. 인접 활성화는 플레이어가 영역의 타일 중 하나에 인접 해 있고 활성화 키로 지정된 일부 키를 누르면 영역이 활성화됨을 의미합니다.

영역이 활성화되면 스크립트에서 함수를 호출합니다. 따라서 일종의 스크립팅 언어를 포함해야합니다. VERGE에는 VergeC라는 자체 언어가 있으며 루아도 허용합니다. 나 자신은 파이썬을 선호한다.

이 장애물을 극복하면 이벤트 스크립팅에서 엄청난 힘을 얻게됩니다. 플레이어 통계, 스토리 플래그 등과 같은 데이터를 저장하고 실행할 수있는 본격적인 프로그래밍 언어가 있습니다.

* 엔티티 레이어도 있습니다. 엔티티는 모바일 인접 활성화 영역과 같은 역할을합니다.


롤 플레잉 게임 메이커 시리즈에서 사용되는 일종의 시스템처럼 들립니다. 그러나 그 타일이 당신이 얼마나 멀리 있는지에 따라 5 개의 다른 이벤트가 있다면 어떻게 될까요?
Skeith

@Skeith 그것은 할 수 없습니다. 각 타일에는 하나의 영역 만 연결되어 있습니다. 그리고 각 영역에는 호출하는 하나의 스크립트 기능 만 있습니다. 그래도 문제는 아닙니다. 여기에는 완전한 프로그래밍 언어가 있습니다. 스토리가 얼마나 멀리 있는지에 대한 정보는 변수 (또는 여러 개)에 저장됩니다. 따라서 수행 할 작업을 결정하는 것은 스크립트에서 해당 변수를 테스트하고 그 값에 따라 적절한 조치를 취하는 것입니다.
Benjamin Lindley

@Skeith : 타일이 속한 영역을 변경하는 옵션을 추가 할 수도 있습니다.
Benjamin Lindley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.