2010-11-23 4 views
4

저는 현재 플레이어가 다른 방 사이를 이동하고 아이템을 들고 사용하며 음식을 먹을 수있는 간단한 콘솔 기반 게임을 만들고 있습니다. 게임의 현재 상태에 관한 것입니다.프로그램 디자인에 대한 도움

내 게임에 좋은 "이벤트"클래스 만들기 : I는 도움이 필요 무엇

. 제가 작동시키려는 방식은 모든 아이템과 방이 이벤트와 연관 ​​될 수 있어야한다는 것입니다.

나는 이런 식의 절차와 관련된 모든 독서 자료 또는 에 대한 조언을 통해 포인트가 인 것으로 간주하는 것이 가장 좋은 방법을 고맙게 생각합니다. 간단하게 이런 종류의 문제 (클래스를 설정하는 방법을 결정하는 데 문제가 있음)를 공격하는 방법.

  • 출력 텍스트를 다음 선수에게 질문 :

    나는 예를 들어, 여러 종류의 이벤트를 만들 수 있어야합니다. 플레이어가 올바른 대답을하면 뭔가를하십시오.

  • 텍스트를 출력 한 다음 플레이어의 인벤토리에서 항목을 제거한 다음 플레이어를 다른 방으로 옮깁니다.

    • 게임의 전체 포인트는 책임 중심의 디자인, 응집 및 커플 링과 같은 일이 그래서 좋은 클래스 디자인을 실천하는 것입니다 : 내가 피하기 위해 노력하고있어

    중요한 측면. 따라서 나는 그것이 가능한 한 간단하고 재사용 가능하며 독립적이어야한다.

  • 항목이나 방이 Event 클래스의 특정 메서드를 호출하기 때문에 모든 이벤트를 하드 코딩해야합니다. 내가 예를 들어, 새로운 이벤트를 생성 (및 연결)를 사용하여 할 수있는 몇 가지 하위 클래스를 작성

    그래서 : ( itemObject.setEvent 새로운 나는 순간에 생각하고 무엇

이벤트 (새 질문 ("introText", "outroText", "correctAnswer")));

자세한 정보가 필요하면 알려주세요. 감사합니다.

+0

질문에 좀 더 구체적으로 설명해 주실 수 있습니까? – jzd

+3

@jzd : 공평하게 말하면 이것은 상당히 상세한 질문입니다. – Adamski

+0

@Adamski 미안하지만, 어떻게 든 근본적인 질문이있는 세 번째 단락을 잘못 읽은 것처럼 보입니다. – jzd

답변

2

게임 프로그래밍 보석 책은 훌륭합니다 ... 조금 비싸지 만.

당신은 아마 GameDev's Article list에 걸쳐 관련 기사 또는 두 가지를 찾을 수 있으며 이벤트 클래스에 관해서는, 당신은 거의 확실 서브 클래스의 어떤 수 (MoveEvent와 기본 클래스를 원하는 their forums

에 묻혀 좋은 물건이 거기에 아마 , InventoryEvent 등). 그리고 이 실제로 일을 하드 코딩하지 않으려면 데이터 파일에 게임을 정의해야합니다. 방, 항목 및 이벤트 ... 나중에 추가 할 내용. 사물을 정의하는 데 사용하는 형식은 전적으로 귀하에게 달려 있습니다. 저는 이것이 당신에게 실전 경험을주는 것을 권합니다. 예를 들어 사용하지 않은 XML 파서입니다. 구문 분석 할 수있는 가장 효율적인 형식은 아니지만 콘솔 게임이므로 문제는 아닙니다.

이벤트 하위 클래스에 대한 제안 중 하나는 다른 이벤트를 함께 연결할 수있는 것입니다. 인터페이스가 변경되지 않으며 "플레이어의 인벤토리에 추가하여 멀리 가져 가서 여기로 옮길"과 같은 작업을 수행 할 수 있습니다.

2

입력 텍스트의 구문 분석과 기본 도메인 모델의 출력 텍스트 생성을 구분하는 것이 하나의 고려 사항입니다. 당신의 질문은 두 부분을 섞어 쓰는 것 같지만 나는 문제의 텍스트 부분을 표현 계층으로 생각할 것입니다.

예를 들어, 도메인은 다음과 같은 인터페이스로 구성 될 수있다 :

또한
public enum Action { HIT, TALK_TO, EAT, USE }; 

public interface GameEntity { 
    /** 
    * Performs the specified action on this GameEntity, passing in zero or 
    * more other GameEntity instances as parameters. 
    */ 
    void applyAction(Action action, GameEntity... params);  
} 

public interface Item extends GameEntity { } 
public interface Person extends GameEntity { } 

당신은 입력 문자열을 처리 할 것 TextParser 클래스를 정의하고 도메인 층에 결과 통화를하거나 다른 기본을 반환 할 수 답변 : "이해가 안됩니다."예를 들어, 입력 문구 "문에 사용하는 키"메서드 호출이 발생할 것이다 : 나는 최근에 당신이 설명하는 것과 유사한 무언가를 구현했습니다

key.applyAction(Action.USE, door); 
1

합니다. "게시"및 "구독"메소드가있는 EventManager 클래스를 작성했습니다.

/// <summary> 
/// A class that intends to listen for specific events to be published by an 
/// event manager. 
/// <see cref="EventManager"/> 
/// </summary> 
public interface IEventListener 
{ 
    /// <summary> 
    /// Subscribes to the event types that this listener wishes to listen for. 
    /// </summary> 
    /// <param name="eventManager"></param> 
    void RegisterSubscriptions(EventManager eventManager); 
} 

을 ... 그리고 그들 각각에 RegisterSubscriptions 메소드를 호출 : 시스템이 시작될 때, IEventListener 인터페이스를 구현하는 클래스에 대한 모든로드 된 어셈블리 (라이브러리)를 검색합니다. (어디서나 사용되는 EventManager의 인스턴스는 하나 뿐이며, 종속 인스턴스를 사용하여 싱글 톤 인스턴스로 바인딩합니다.)

RegisterSubscriptions는 주어진 클래스가 의도하는 각 이벤트 유형 및 핸들러에 대한 Subscribe 메소드를 호출합니다 다루다. (.NET을 사용하기 때문에 이벤트와 핸들러가 좀 더 쉽게 작업 할 수 있지만 익명 서브 클래스를 사용하여 Java에서 동일한 작업을 수행 할 수 있습니다.)

일반적인 이벤트는 RoomEntered와 같을 수 있으며 인수 이 이벤트와 관련하여 룸 ID와 룸에 대한 다른 속성이 포함됩니다. 게임 엔진은 사용자가 방에 들어가서 해당 방에 적절한 이벤트 인수를 제공하면이 이벤트를 게시하고 EventManager 클래스는 해당 이벤트 유형에 가입 한 각 핸들러를 호출합니다. 이 이벤트의 한 처리기는 "HandleEnterRoomWithMonsters"일 수 있습니다.이 핸들러는 방에 괴물이 있는지 여부를 확인하고 이에 따라 작업을 수행합니다.

전체적으로 의미가 있습니까? 이 접근법에 대해 질문이 있으십니까?

2

이벤트를 말할 때 observer pattern이 떠오른다. 당신은 게임을 여러 상태 머신에 의해 내부적으로 표현할 수 있다고 생각할 수 있습니다 (Wikipedia에서도 이것을 볼 수 있습니다. 그래서 나는 SO에 처음으로 제 2의 링크를 추가 할 수 없습니다). 하나의 무대에서 다른 무대로의 각 전환은 그 사건의 등록 된 관료에게 전달 될 수있는 사건이다.

예제

: LOCK ON

USE 키 : 키 도어 개구부의 제거를 트리거; 추가 사용자 상호 작용 (문 열림)없이 다음 이벤트에 암묵적으로 "계단식"으로 연결됨 : 추가 출구 등이있는 방을 트리거합니다.

관련 문제