Como criar um modo tutorial separado?

7

Estou trabalhando em um jogo "social" com cerca de 90% de conclusão. Um dos recursos restantes é o modo tutorial.

Basicamente, o modo tutorial restringe o usuário a acessar algumas partes da interface do usuário e limita os recursos (como itens de loja). O tutorial só progredirá se um determinado evento for acionado, seguindo especificamente o tutorial.

O código está pronto e já temos um jogo "quase" funcionando. O problema é que não previ o modo tutorial enquanto fazia esses 90%. Meu requisito é que não deve haver nenhum carregamento / transição do modo tutorial para o modo normal. Isso significa que eu tenho que acompanhar o progresso do tutorial (sem re-renderização de ativos e outras coisas).

Como devo projetar isso de maneira a não tocar em nada do meu código antigo? Quero que seja tão fácil quanto apenas conectá-lo. Não quero bloquear o tutorial no meu código antigo, pois isso levará a muitos bugs.

Sylpheed
fonte
Você deve fornecer mais detalhes, como se você tiver um suporte para scripts e se esses scripts podem alterar a GUI ... Talvez crie um diagrama de classes. PS: você não pode 'prever' tudo, para que seu código sempre seja refatorável.
Den
2
Vou dizer o óbvio: se você deseja ativar ou desativar os elementos da GUI no jogo, precisará adicionar suporte para ele. Somente você pode saber como implementar isso (ou outras pessoas em sua equipe).
Max
Que idioma (s) você está usando?
John McDonald
Objetivo C. Estou desenvolvendo para iOS. Parece que é a maneira mais limpa de fazer isso. Não poderei postar um diagrama agora desde que o deixei no trabalho. Vou postar se alguma vez eu fiquei preso. Parece que isso já tocou a campainha.
Sylpheed

Respostas:

3

Um pouco mais de informação o ajudaria a obter melhores respostas. Sem saber muito sobre o tipo de jogo que você tem ou como é sua estrutura de nível, só posso fazer uma facada no escuro.

Dito isto, se eu estivesse fazendo algo semelhante ao meu projeto atual, criaria um nível especial que orienta o usuário pelos assuntos em questão. Seus NPCs podem ser criados apenas com os itens que você deseja disponibilizar no tutorial, por exemplo.

Na medida em que impede o acesso a determinados elementos da interface do usuário, se você não pode adicionar ou remover os elementos que deseja / não deseja no seu tutorial, pode ser necessário incorporar um filtro ao código existente para determinar se um elemento deve existir ou não (pense em "restrições de acesso").

entalhe
fonte
Digamos que é como a Sims City. Não sei muito sobre o jogo, mas acho que ele tem um tutorial que orientará o usuário sobre como jogar o jogo. Obviamente, você deseja desativar alguns elementos da interface do usuário e definir limitações enquanto estiver no tutorial. Então, a melhor maneira é fornecer uma interface para minha interface do usuário? Para que eu possa desativá-los e ativá-los quando necessário.
21411 Sylpheed
Você precisará adicionar / remover elementos da interface do usuário do seu tutorial ou criar sua interface do usuário de forma que ela esteja sujeita a "restrições de acesso". Por exemplo, se você possui um botão "salvar jogo" que não deseja que esteja disponível em seu tutorial, você pode agrupá- lo em uma declaração como se (canSaveGame ()) {panel.add (saveButton); } onde canSaveGame () faz parte do seu sistema de restrição de acesso.
notlesh
Não há necessidade de removê-los. Eu só preciso desativá-los. Vou tentar refatorar o código para que ele possa ser desativado / ativado por meio de uma interface. Como você tratará cada evento tutorial? Você sugere que eu crie objetos separados para cada evento? Receio que minha aula de tutorial possa inchar.
21911 Sylpheed
Não sei o que você quer dizer sobre eventos tutoriais. Por que eles precisam de tratamento especial?
notlesh
Digamos que o tutorial seja dividido em diferentes fases (eventos). O usuário só pode passar para a próxima fase se seguir as instruções. Cada "evento tutorial" aguardará que algo interessante aconteça. Uma vez acionado, um novo evento tutorial será instanciado, que escuta uma base de eventos diferente na atual "fase do tutorial". Minha preocupação é que existem cerca de 20 etapas no tutorial. Estou planejando dividir cada etapa em objetos diferentes.
Sylpheed
2

Estou trabalhando em um tutorial para o meu jogo em C # agora. Estou separando o tutorial do jogo usando eventos. No meu jogo, eu tenho vários eventos que são acionados quando o estado do jogo muda de várias maneiras: Entidades se movendo, sendo destruídas, sendo construídas, com atualização completa etc. Meu tutorial ouve os eventos de interesse e tem a capacidade para manipular o HUD. É tudo o que você precisa. Para deixar perfeitamente claro, o jogo não faz ideia de que o tutorial está acontecendo.

Isso também pode ser importante: Meu Tutorial é uma subclasse de Cenário, onde o Jogo está sempre executando um Cenário. Como estou usando o C #, eu poderia pegar qualquer um dos meus cenários e lançá-los em um arquivo de script em C #, mas agora, todos os meus cenários são compilados diretamente no jogo.

A classe está um pouco em andamento no momento, mas aqui está uma versão um pouco desatualizada que você pode ver: http://asteroidoutpost.svn.sourceforge.net/viewvc/asteroidoutpost/trunk/Scenarios/TutorialScenario.cs? view = marcação

John McDonald
fonte
0

Também estou trabalhando em um tutorial para o meu jogo em flash e é assim que eu o configuro. Cada parte do jogo verifica um objeto Tutorial para verificar se uma ação está disponível para o jogador. Se o módulo tutorial não existir ou estiver inativo, podemos assumir que o jogador pode fazer qualquer coisa.

Usando seu jogo Sim City, por exemplo, digamos que quando o tutorial iniciar, você não deseja que o jogador possa fazer nada até o momento apropriado. Você pode ter sinalizadores no seu objeto tutorial, como PLAYER_CAN_USE_TOOLBAR, PLAYER_CAN_SWITCH_VIEWS ou PLAYER_CAN_DESIGNATE_ZONE etc, todos configurados para FALSE. À medida que o player percorre seu tutorial, você pode começar a definir esses sinalizadores como verdadeiros.

Para sua parte da interface do usuário, bloqueie o sinal para o modelo ou controlador que realmente executa a ação se os sinalizadores do tutorial não estiverem definidos:

// If our tutorial module/tracker exists, but the action flag is set to false
// then leave our method early
if (mTutorial.isActive() && !mTutorial.checkFlag(PLAYER_CAN_DESIGNATE_ZONE)) {
  return false;
}
//Do the rest of the action here

Para esperar por eventos específicos, você pode passar o evento de volta ao seu objeto tutorial para validar o que o jogador precisa fazer para continuar a etapa do tutorial. Por exemplo, se você precisava do player para criar uma zona residencial em um X, Y específico:

var evt:GameEvent = new GameEvent(EVENT_CREATE_ZONE, ZONE_TYPE_RESIDENTIAL, startX, startY, endX, endY);
if (mTutorial.isActive()) {
  if (!mTutorial.checkFlag(PLAYER_CAN_DESIGNATE_ZONE)) {
    return false;
  }
  //Check to see if this event is okay
  if (!mTutorial.validateEvent(evt)) {
    //Show why the player can't do this via popup
    return false;
  }
}
//Do the rest of the action here

Espero que tenha ajudado. Infelizmente, você precisará adicionar as verificações do tutorial ao seu código antigo para que isso funcione. Porém, supondo que todas as ações sejam válidas, a menos que exista o objeto tutorial, deve facilitar esse processo de integração e minimizar os erros.

Jelani Harris
fonte
Vou considerar tratar cada evento tutorial como objetos separados. Vou tentar criar o código para o tutorial a partir daqui. Obrigado.
21911 Sylpheed