포인트 앤 클릭 스타일 어드벤처 게임을위한 명령 시스템을 어떻게 구현할 수 있습니까?


11

포인트 앤 클릭 어드벤처 게임을 만들고 있으며 현재 커맨드 시스템을 구현하는 가장 좋은 방법을 찾으려고 노력하고 있습니다.

동사 팔레트와 장면 및 인벤토리의 객체가있는 Monkey Island 또는 Maniac Mansion 스타일 인터페이스를 가정합니다. 이것을 클릭하면 문장을 작성하여 실행할 수 있습니다.

예를 들어, look at나무를 클릭 한 다음 "나무를 보거나"사과를 클릭 give한 다음 소녀를 클릭하여 "사과 소녀에게 사과주기"를 수행 할 수 있습니다.

문장의 세 가지 가능한 형태가 있습니다 :

  • verb예를 들어 "저장"
  • verb noun예를 들어 "애플 픽업", "문어를 본다"
  • verb noun noun, 예를 들어 "개를 썩게 피클 피클", "피클 병에 크로우 바 사용"

다른 상황에서는 작업이 다른 객체로 정의되기를 원합니다.

예를 들어, give동사의 경우, 캐릭터가 "그것에 매달리는 것을 선호합니다"와 같은 말을하도록하는 기본 동작이 정의되어있을 수 있습니다. .

인터페이스가 Maniac Mansion과 같이 작동하려면 문장을 작성한 다음 실행하도록 지시하십시오 (Maniac Mansion에서는 문장을 클릭하거나 마지막으로 클릭 한 항목을 다시 클릭하여).

그것이 원숭이 섬처럼 작동한다면, 문장은 완성되 자마자 실행되는데, 동사 use는 때때로 하나의 명사를 필요로하는 동사 와 다른 경우에는 2 번 문제가 발생합니다 .

그렇다면 이것을 처리하는 시스템을 어떻게 구현하겠습니까?


1
동사에는 세 가지 유형의 동사가 있는데, 하나는 제로 명사에 대한 하나, 다른 하나는 두 개에 해당하는 것 같습니다. 이들은 같은 클래스의 객체가 아닙니다. 당신은 "피클 병으로 문어를 볼 수 없습니다"그래서 look단일 명사 동사 등입니다
tenpn

답변:


10

선택 순서를 바꾸면 사용하기가 더 쉬울 수 있습니다. 따라서 사용자는 명사를 클릭 하면 게임에서 해당 명사에 대해 수행 할 수있는 동사 세트가 표시됩니다. 동사에 객체가 필요한 경우 (예 : "___에게 제공"), 게임은 사용자가 객체를 선택하기를 기다렸다가 동작을 수행합니다.

다음과 같은 것 :

  1. 사용자가 치즈 버거를 클릭합니다.
  2. 게임은 "픽업, 먹기,보기, ___에주기"메뉴를 보여줍니다.
  3. 사용자는 "___에게 제공"을 선택합니다.
  4. 게임은 "누구에게 줄까?"라고 말합니다. 사용자가 다른 명사 (또는 취소 단추)를 클릭 할 때까지 기다립니다.
  5. 사용자가 원숭이를 클릭합니다.
  6. 게임은 원숭이에게 치즈 버거를줍니다.

구현 측면에서 게임의 각 오브젝트에는 다음에 대한 데이터가 있어야합니다.

  1. 어떤 동사 집합을 적용 할 수 있습니까?
  2. 동사의 경우 어떤 개체 집합을 적용 할 수있는 개체를 가져옵니다.
  3. 각 동사 또는 동사-객체 쌍에 대해 사용자가 수행 할 때 수행 할 동작입니다.

문법은 실제로 중첩되지 않으므로 인터프리터 패턴만큼 복잡한 것이 필요하지 않습니다.


사물의 모델링 측면과 사물의 인터페이스 측면 모두에서 +1. 네, 대부분이 방법이기 때문에 나는 동의 해요 나는 것 그것을 할, 그러나 나는이 대답을 좋아한다.
drhayes

우리가 동의한다면 분명히 우리 모두가 옳 아야합니다. ;)
munificent

효과적으로 수행 할 행동은 항상 첫 번째 명사에 의해 정의되어야한다고 생각합니까?
SpoonMeiser

1
예, 여러 명사가 동작 을 공유 한다고 생각 합니다 ( "pick up"은 다른 객체를 선택하기 위해 동일한 코드를 사용합니다). 그러나 적용 할 수있는 동사 집합을 결정하기 위해 명사에 달려있는 것이 합리적입니다. 그것에. 명사 세트가 매우 크고 (게임의 모든 것) 동사 세트가 작을 경우 (아마도 소수의 연산) 아마도 조합을 더 많이 알고 있기 때문에 사용자가 먼저 명사를 선택하는 것이 합리적이라고 생각합니다 빨리. 실용적으로 사용자가 단어를 클릭 하지 않고 상호 작용을 시작하기 위해 사물 을 클릭 할 수 있습니다 .
munificent

이것은 일종의 스로틀이 얼마나 많은지를 보여줍니다.
Jari Komppa

2

나는 단순한 해결책을 제시한다. 물론 확장 할 수 있습니다.

(verb, object1, object2) 의 간단한 목록으로 해결할 수 있다고 생각 합니다.

  • 플레이어가 객체 (동사) "사용"을 클릭하고 "balloon"객체를 클릭하고 플레이어가 "펌프"객체를 클릭하고 삼중 항 ( "사용", "ballon", "펌프")이있는 경우 "펌프와 함께 ballon을 사용함"
  • 때때로 "use helium"(use, helium, NULL)과 같이 object2는 NULL이됩니다.
  • 플레이어가 먼저 객체 동사를 클릭하도록 요구하십시오
  • 플레이어가 아무것도 일치하지 않는 것을 클릭하면 "이 작업을 수행 할 수 없습니다.
  • 물론 순서가 올바른지 클릭 할 때마다 확인해야합니다.

기본값을 처리하는 방법 :

  • 동사 개체에서 첫 번째 클릭이 없으면 가능한 기본 동작을 검색하십시오.
  • 기본값을 저장하는 한 가지 방법은 쿼드 을 만드는 것입니다 (동사, object1, object2, is-default)
  • 그것들을 저장하는 다른 방법은 기본 세 쌍둥이 목록을 갖는 것입니다.
  • ...

몇 가지 예 :

  • (용도, 발롱, 펌프)
  • (존, 감자에게주세요)
  • (도보, 피라냐, NULL)
  • (재고, ballin-in-inventory, 펌프)
  • (open, door-to-roof, NULL), 기본값 .... 기본 동작의 예

확장 할 수 있습니다 :

  • 트리거 할 이벤트를 추가하십시오 (플레이어에게 무언가를주십시오. 플레이어는 "나는 강력한 해적이기 때문에 그렇게 할 수 없습니다"라고 말하고 장면을 시작하고 세계에서 무언가를 바꾸십시오 ...)
  • 전제 조건을 추가하십시오. 때로는 ballon이 우리 안에있을 수 있으므로 "ballon이 우리 안에 있지 않다"라고 표현해야합니다. 이벤트 미적분이나 프롤로그로 접근하거나 함수 포인터로 수행 할 수 있다고 생각합니다 ...
  • 때때로 커맨드 라인의 문장은 "홀을 쳐다 보지"않을 것이지만 "홀을 쳐다 보도록"재 작성 될 수 있습니다.

1

여기에는 플레이어의 입력을 구문 트리로 해석 한 다음 해당 트리를 실행하는 두 가지 문제가 있습니다.

첫 번째 단계에서는 각 동사 버튼이 동사 인터페이스에서 파생 된 구체적인 동사 인스턴스를 생성하게합니다. 해당 인스턴스에는 유효성 검사를 위해 추가 명사 또는 동사가 전달됩니다. 유효하면 명사를 내부 구문 트리에 첨부하고, 그렇지 않으면 적절한 오류로 거부합니다.

각 버튼을 누른 후 동사 트리가 진행하기에 유효한 상태인지 물어볼 수 있습니다 (Monkey Island 스타일 입력의 경우).

두 번째 단계가되면 콘크리트 동사는 자체 트리를 파싱하고 게임 상태를 업데이트합니다.

보다 복잡한 해결책은 트리를 외부에서 동사로 구문 분석하는 것입니다. 각 트리 요소는 원하는 결과를 함께 생성하는 작은 작업을 담당합니다. 이 방법을 사용하면 작은 빌딩 블록에서보다 긴급한 문장을 만들 수 있습니다.

구문 분석 단계에 대한 자세한 정보 는 인터프리터 패턴을 확인하십시오 .


1
플레이어 입력을 해석하는 것이 문제라고 생각하지 않습니다. 확실히 여기에 필요한 텍스트 어드벤처에 대한 입력을 구문 분석하는 것만 큼 정교한 것은 없습니다. 실제로이 질문은 수행 할 실제 동작을 정의하는 객체에 대해 최대한의 유연성을 허용하기 위해 객체 계층과 상호 작용을 어떻게 설계 할 것인지에 달려 있습니다.
SpoonMeiser
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.