Pergunta

Atualmente, estou criando um jogo simples baseado em console, no qual o jogador pode se mover entre salas diferentes, pegar e usar itens e comer comida. No estado atual do jogo, é isso.

O que eu preciso de ajuda é:

Criando uma boa classe de "evento" para o meu jogo. A maneira como eu gostaria que funcionasse é que todos os itens e espaço devem estar associados a um evento.

Como sou novo nisso, apreciaria qualquer material de leitura relacionado a esse tipo de procedimento, ou sugestões sobre Como seria melhor configurar minhas aulas, considerando os pontos abaixo, ou simplesmente Como atacar esse tipo de problema (que está tendo problemas para decidir como estabelecer classes).

Eu quero poder criar diferentes tipos de eventos, por exemplo:

  • Emitir um pouco de texto e faça uma pergunta ao jogador. Se o jogador der a resposta correta, faça algo.

  • Emitida em algum texto, remova um item do inventário do jogador e mova o jogador para outra sala.

O que estou tentando evitar:

  • O ponto principal do jogo é praticar um bom design de classe; portanto, coisas como design, coesão e acoplamento orientados a responsabilidades são aspectos importantes. Assim, quero que seja o mais simples, reutilizável e independente possível.

  • Ter que codificar cada evento para que um item ou sala simplesmente chama um método específico na classe de evento.

O que estou pensando no momento:

Criando algumas subclasses para que eu pudesse, por exemplo, criar novos eventos (e associá-los) usando: ItemObject.Setevent (novo evento (nova pergunta ("Introtext", "Outrotext", "CorrectAnswer")));

Por favor, deixe -me saber se mais informações são necessárias! Obrigado!

Foi útil?

Solução

Os livros de gemas de programação de jogos são ótimos ... embora um pouco caros.

Você provavelmente pode encontrar um artigo ou dois relevantes sobre Lista de artigos de Gamedev, e provavelmente há algumas coisas boas enterradas em seus fóruns

Quanto a uma aula de eventos, você quase certamente deseja uma classe base com um número de subclasses (MoveEvent, InventoryEvent, etc.). E se você verdade Deseja evitar coisas de codificação, você deve definir seu jogo em arquivos de dados. Quartos, itens e eventos ... além de qualquer outra coisa que você tivesse mais tarde. O formato que você usa para definir coisas depende de você. Eu recomendo algo que lhe dará uma experiência prática, pois este é um exercício de aprendizado: um analisador XML que você não usou, por exemplo. Não é o formato mais eficiente para analisar, mas este é um jogo de console, então esse não é um problema.

Uma sugestão que tenho para uma subclasse de eventos seria uma que pode encadear outros eventos. A interface não muda e permite que você faça coisas como "Adicione isso ao inventário do jogador, retire -o e mova -as aqui".

Outras dicas

Uma coisa que eu consideraria é separar a análise do texto de entrada e a geração de texto de saída do modelo de domínio subjacente. Sua pergunta parece misturar os dois, enquanto eu consideraria a parte do texto do problema como a camada de apresentação.

Por exemplo, seu domínio pode consistir nas seguintes interfaces:

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 { }

Além disso, você pode definir uma classe TextParser que processaria a string de entrada e fazer chamadas resultantes para a camada de domínio ou retornaria uma resposta padrão: "Eu não entendo". Por exemplo, a frase de entrada "Use Key on Door" resultaria na chamada do método:

key.applyAction(Action.USE, door);

Ao falar em eventos, o Padrão de observador vem à mente. Você pode pensar no seu jogo para ser apresentado internamente por várias máquinas estaduais (você também pode procurar isso na Wikipedia, não posso adicionar o segundo link por ser novo para ser novo). Cada transição de um estágio para outro é um evento que pode ser comunicado aos Oberservers registrados desse evento.

No exemplo:

Use a chave na trava: gatilhos remoção da chave e abertura da porta; Implicly "Cascading" para o próximo evento sem interação do usuário adicional (abertura da porta): desencadeia a sala com saída adicional etc.

Recentemente, implementei algo semelhante ao que você está descrevendo. Comecei criando uma classe EventManager que possui um método de "publicação" e "assinar". Quando o sistema é iniciado, ele digitaliza todos os conjuntos carregados (bibliotecas) para classes que implementam a interface iEventListener:

/// <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);
}

... e chama o método RegisterSubscriptions em cada um deles. (Existe apenas uma instância do EventManager que é usado em todos os lugares; eu uso a injeção de dependência para vinculá -la como uma instância singleton.)

O RegisterSubScriptions simplesmente chamará o método de inscrição para cada tipo de evento e manipulador que a classe especificada se destina a lidar. (Estou usando .NET, então eventos e manipuladores são um pouco mais fáceis de trabalhar, mas você pode fazer a mesma coisa em Java usando subclasses anônimas.)

Um evento típico pode ser algo parecido com o espaço, e os argumentos associados a este evento incluiriam o ID da sala e talvez algumas outras propriedades sobre a sala. O mecanismo de jogo publica este evento quando o usuário entra em uma sala, fornecendo os argumentos de evento apropriados para essa sala, e a classe EventManager é responsável por invocar cada manipulador que se inscreveu nesse tipo de evento. Um manipulador para este evento pode ser "HandleEnterroomWithmonsters", que verifica se a sala tem monstros e executa uma ação de acordo.

Isso faz sentido em geral? Você tem alguma dúvida sobre essa abordagem?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top