2011-09-07 2 views
15

방금 ​​Elder Scrolls IV : Oblivion 며칠 전에 게임을 시작했는데 퀘스트 시스템이 프로그래밍 방식으로 어떻게 처리되는지 궁금합니다.게임 (예 : 망각) 퀘스트는 어떻게 모델링 되나요?

특히 게임에는 수십 (수백)의 퀘스트와 하위 퀘스트가 있으며 게임의 환경에 다양한 방식으로 반영됩니다. 특정 시간/특정 사람들 (아직 살아 있다고 가정)과 관련된 퀘스트 아이템 (특정 NPC와 퀘스트 상태와 관련된 것들), 다른 NPC와의 다양한 대화 (다시 말하면 복잡한 트리가 변경 될 수 있음) 다른 NPC들과 대화하여 & 퀘스트의 일반적인 상태).

또한 어느 시점에서든 활성/비활성 퀘스트간에 전환 할 수 있으므로 주변 환경에 근본적인 영향을 미치는 이러한 복잡한 동적 동작은 완전히 상호 교환 가능하므로 한 걸음 더 앞서 나가게됩니다.

그것은 논리적으로 악몽처럼 보입니다. 나는 너무 깊고 풍부한 것을 프로그래밍 방식으로 정의 할 수있는 방법을 꼼꼼하게 파악하는 데 어려움을 겪고 있습니다.

이러한 종류의 시스템에 들어가는 것을 (광범위하게) 설명 할 수있는 경험이있는 사람이 있습니까?

+6

이 공식 세계 편집기에서 게임을 열 수 있습니다에 대한 답을 찾을 수 예쁜 직접적인 방법 및 아니에요 그들이이 데이터를 어떻게 모델링하는지보십시오. 편집기가 게임에 포함되어 있습니다. –

답변

1

저는 여기서 추측하고 있습니다. 이런 종류의 프로그래밍을 해보지는 않았지만 연주하는 동안 그들이 어떻게하는지에 대해 많이 생각했습니다. RuneScape.

아마도 귀하의 계정과 관련된 플래그 및 변수가 많으며 귀하가 퀘스트를 진행할 때 값이 변경됩니다. 처음에는 문자 X가 살아있는 것으로 표시되고 위치 Y에서는 나중에 위치 Z로 표시됩니다. 그런 다음 죽었습니다. 그래서, 위치 Y를 입력하면, 변수를 검사하여 그녀가 거기에 있는지를 확인하고 거기에 그녀의 객체를 넣을 것인가 말 것인지를 결정합니다. 한편, 퀘스트를 시작하지 않은 다른 플레이어는 같은 지역에있을 수 있으며 완전히 다른 것을 볼 수 있습니다.

+0

Oblivion Scripting 엔진을 살펴보면 실제로 어떻게 많은 일을하는지 알 수 있습니다. 많은 퀘스트 대응 아이템조차도 그들이 정한 플래그 일뿐입니다. 나는 새로운 Skyrim 엔진에서 이것이 사실이 아니며 더 진보 된 다이나믹 기술을 사용한다고 들었다. –

1

나는 더 게임 디자이너는 아니지만 그러나 나는 많은 개체 내에서 깔끔하게 데이터와 로직을 캡슐화하여 복잡성과 역 동성 이런 종류의

Object Oriented Programming

허용 여기 일이있을 수 있습니다 뭔가를 ... 볼 수 있습니다. 이러한 개체는 개체 간 메시징을 사용하여 작업을 서로 위임하는 '구두로'상호 작용할 수 있습니다. 메시지의 발신자는 수신자에게 메시지를 해석하는 방법을 알 필요가 없으며, 수신자에게 전적으로 작업 방법을 남겨 둡니다. 실제 세계와 마찬가지로 위임을 통해 사물을 더 부드럽게 움직일 수 있습니다.

예를 들어 뉴욕시의 Del Posto에서 버섯 리조또를 주문할 때 주방으로 걸어 가서 직접 요리사와 이야기하여 주문 하시겠습니까? 앞치마를 두르고 리조또를 직접 준비합니까? 가장 가까운 버섯 농장으로 가서 자신의 버섯을 골 랐니? 아니, 그렇지 않아. 이 작업을 웨이터, 요리사 팀 및 농산물 공급자에게 각각 위임하기 만하면됩니다. 버섯 리조또를 얻으려면 웨이터에게 원하는 것을 알려주면됩니다. 나머지는 위임 사슬을 통해 자동으로 수행됩니다. 이와 같은 종류의 위임은 게임에 존재할 가능성이 큽니다.

이제 개체로 돌아갑니다. 어떤 객체는 부모 객체로부터 데이터와 로직을 상속받으며, 이런 방식으로 많은 양의 데이터/로직을 공유 할 수 있습니다. 이 형제 자매들을 불러야합니다. 게임 퀘스트의 예에서, 각 퀘스트는 부모 '퀘스트 부모'로부터 상속 된 기본 데이터 및 로직을 가진 자체 '퀘스트 대상'일 가능성이 큽니다. 퀘스트 형제는 특정 퀘스트와 관련된 추가 데이터/논리를 추가하여 서로 구분할 수 있습니다.

게임의 동작 (게임 메뉴에서 선택한 것)에 따라 게임 개체가 형제 중 하나에 대한 활성 퀘스트 개체를 스왑 아웃 할 수 있습니다. 종종, 이것은 정말 간단한 명령을 수행 할 수 있습니다 (의사 코드에서 특정 프로그래밍 언어를 모방하지) :

gameObject.activeQuest -> getCurrentObject(); 
//returns the object containing all of the data/logic of the current active quest: 
Gibbons_GoldenArtifacts 
//Let's say the quest description is "Scour the Catacombs of Gibbon for a 
mysterious treasure" 

gameObject.activeQuest -> setCurrentObject(Gibbon_DefeatGhost) 
//sets the activeQuest object (note that QUEST OBJECT contains baseline data/logic) 
//assuming, say, Gibbon_DefeatGhost is an object like so: 

Gibbon_DefeatGhost={QUEST OBJECT}; 
Gibbon_DefeatGhost.extend(
    description="Defeat Gibbon's ghost to retrieve his golden artifacts"; 
    objective="Defeat Gibbon's ghost"; 
    questNPC="Gibbon's ghost"; 
    questLocation="Gibbon's Inner Sanctum" 
    questTriggers[1]="When PLAYER enters Gibbon's Inner Sanction: Release Gibbon's ghost"; 
    questTriggers[2]="When Gibbon is slain: Drop Gibbon's golden artifacts" 
) 

을 그 시점에서 게임 객체 자체가 아마 활성 탐구와 상호 작용에 객체는 항상 가지고있는 것과 같지만 활성 퀘스트 객체는 형제 객체 형제와 다른 방식으로 상호 작용을 인식하여 다른 게임 경험을하게됩니다.

희망 나는 완전히이 하나에 광대 fudging ...

+0

참고로이 사이트에는 OOP에 대한 많은 정보가 있습니다. –

관련 문제