TUTORIAL 12 - CRIANDO UM DIALOGO

        Neste tutorial aprenderemos como exibir mensagens de dialogo usando o 3D Game Builder.

        Primeiramente crie um novo projeto utilizando MD2 como formato do ator principal ou use um anterior, em seguida crie um pequeno cenário com uma base sólida para que o ator principal possa andar sobre ela, e em uma das extremidades dessa base sólida adicione um Ator MD2, utilize o padrão que já vem juntamente com o 3D Game Builder, ou crie um novo ator acessando o menu “Banco de Dados -> Atores MD2”. Para adicionar o ator a cena selecione a categoria de objetos “Atores MD2” e de um duplo clique no ator desejado no nosso caso o ator “Default”. Em seguida abaixo do ator MD2 adicionado posicione um cubo do tipo “Event Area”, a categoria de objetos do tipo “Event Area” possui objetos que não são visíveis durante a execução do jogo, são visíveis apenas durante a criação dos cenários, e são utilizados para a criação de alguns eventos. Após concluir o cenário deverá estar parecido com este:

        Agora vamos criar um evento do tipo “OnCollision” para cubo do tipo “Event Area” que foi posicionado abaixo do ator MD2, selecione-o e acesse a aba eventos, clique em “OnCollision”, será exibido a editor de scripts. O script que criaremos vai exibir uma conversa entre os atores no momento em que o ator principal tocar no cubo do tipo “Event Area” e a tecla “Enter” será a tecla avançara o dialogo.

      Mas antes de começarmos o nosso script vamos cadastrar duas texturas, estas texturas serão as faces dos dois atores e serão exibidas na caixa de dialogo. No meu caso utilizarei as seguintes imagens:


FaceAtor

FaceMainActor

      Acesse o meu “Banco de Dados -> Materiais” e crie os dois materiais com estas imagens e com os nome de “FaceAtor” e “FaceMainActor”.

      Agora vamos ao script que exibirá o dialogo entre os atores, lembre-se de alterar o nome dos objetos conforme o seu cenário, o “Objeto3” é o cubo do tipo “EventArea” do cenário, caso o seu cubo possua outro nome altere-o no script ou no seu objeto.

var Dialogo:Integer;
Dialogo:=ReadGlobalVarDef('Dialog', 0);
if Dialogo = 0 then
begin
   ShowGameDialog('FaceMainActor',
                  'Olá',
                  150,
                  GetScreenWidth()-100,
                  50,
                  GetScreenHeight()-180,
                  110,
                  110,
                  115,
                  (GetScreenHeight()-180)+87,
                  175,
                  (GetScreenHeight()-180)+35,
                  (GetScreenWidth()-230),
                  true);
   WriteGlobalVar('Dialog', Dialogo+1);
   SetWaitKeyUp(13);
   SetKeyUpOK(true);
   DisableMainActorControl();
   SetObjectAnimation('MainActor', 'stand');
   SetObjectPosition('Objeto3',
   GetObjectPositionX('Player'),               
   GetObjectPositionY('Objeto3'),
   GetObjectPositionZ('Player'));
end;         
if (IsKeyPress(13))and((GetWaitKeyIsUp)) then
begin
   if Dialogo = 1 then
   begin
      ShowGameDialog('FaceActor',
                     'Olá!',
                     150,
                     GetScreenWidth()-100,
                     50,
                     GetScreenHeight()-180,
                     110,
                     110,
                     115,
                     (GetScreenHeight()-180)+87,
                     175,
                     (GetScreenHeight()-180)+35,  
                     (GetScreenWidth()-230),
                     true);
      WriteGlobalVar('Dialog', Dialogo+1);
   end
   else if Dialogo = 2 then
   begin
      ShowGameDialog('FaceMainActor',
                     'Porque você tem essa cabeça de abóbora???',
                     150,
                     GetScreenWidth()-100,
                     50,
                     GetScreenHeight()-180,
                     110,
                     110,
                     115,
                     (GetScreenHeight()-180)+87,
                     175,
                     (GetScreenHeight()-180)+35,
                     (GetScreenWidth()-230),
                     true);
      WriteGlobalVar('Dialog', Dialogo+1);
   end
   else if Dialogo = 3 then
   begin
      ShowGameDialog('FaceActor',
                     'Não sei...',
                     150,
                     GetScreenWidth()-100,
                     50,
                     GetScreenHeight()-180,
                     110,
                     110,
                     115,
                     (GetScreenHeight()-180)+87,
                     175,
                     (GetScreenHeight()-180)+35,
                     (GetScreenWidth()-230),
                     true);
      WriteGlobalVar('Dialog', Dialogo+1);
   end  
   else
   begin
      HideGameDialog();
      EnableMainActorControl();
      WriteGlobalVar('Dialog', Dialogo+1);
      SetObjectScript('Objeto3', 'OnCollision', '');
   end;
   SetWaitKeyUp(13);
end;

      Eu imagino que você não tenha entendido muita coisa do que está acontecendo no script, então vou explicar linha por linha. Um conceito importante de lembrar sobre os scripts no 3D Game Builder é sobre a maneira como eles são executados, por exemplo um evento do tipo “OnCollision” será executado no momento em que o ator principal tocar no objeto que possuir o evento, e após o termino do script, caso o ator continue colidindo com o objeto o script será executado novamente, até o momento que ator deixe de colidir com o objeto. Por isso para exibirmos um dialogo entre personagens não basta usar o comando “ShowGameDialog”, é necessário fazer o controle de etapas do dialogo, como foi feito no script acima.

   var Dialogo:Integer;

(Declara uma variável do tipo Integer que servira como controle para as etapas do dialogo)

   Dialogo:=ReadGlobalVarDef('Dialog', 0);

(Utiliza o comando “ReadGlobalVarDef” para ler o valor da variável global “Dialog”, caso ela não exista o valor retornado é 0)

   if Dialogo = 0 then

(Caso o valor de “Dialogo” seja 0, significa que é a primeira vez que o script está sendo executado)

   ShowGameDialog('FaceMainActor',
                  'Olá',
                  150,
                  GetScreenWidth()-100,
                  50,
                  GetScreenHeight()-180,
                  110,
                  110,
                  115,
                  (GetScreenHeight()-180)+87,
                  175,
                  (GetScreenHeight()-180)+35,
                  (GetScreenWidth()-230),
                  true);

(O comando está divido em diversas linhas para ficar visível aqui, na realidade ele pode estar em apenas uma linha. O comando exibe a primeira caixa de dialogo com a frase “Olá” e utilizando o material “FaceMainActor” como imagem de quem está falando. Os outros parâmetros são referentes ao tamanho, a posição da caixa de dialogo, a posição da textura e do texto, os valores utilizados são para deixar a caixa de diálogo sempre centralizada na parte inferior da tela. E o ultimo parâmetro define se o texto será formatado para caber na caixa de dialogo automaticamente)

   WriteGlobalVar('Dialog', Dialogo+1);

(Utiliza o comando “WriteGlobalVar” para alterar o valor da variável global “Dialog”, incrementando-a em 1, insta significa que o nosso dialogo avançou uma etapa)

   SetWaitKeyUp(13);

(Define ao sistema que deve aguardar a tecla 13 (Enter) não estar pressionada para tornar a flag “WaitKeyUp” verdadeira. Isto é utilizado para evitar que o usuário simplesmente segure a tecla “Enter” para avançar o dialogo, utilizando a flag “WaitKeyUp” é necessário que a tecla “Enter” seja liberada antes do dialogo avançar)

   SetKeyUpOK(true);

(Altera manualmente o valor da flag “WaitKeyUp” para true, isto evita que seja necessário pressionar “Enter” duas vezes na primeira caixa de dialogo)

   DisableMainActorControl();

(Desativa o controle do ator principal pelo usuário, isto impede que jogador ande com o personagem enquanto o dialogo esta sendo exibido)

   SetObjectAnimation('MainActor', 'stand');

(Altera a animação atual do ator)

   SetObjectPosition('Objeto3',
                     GetObjectPositionX('Player'),               
                     GetObjectPositionY('Objeto3'),
                     GetObjectPositionZ('Player'));

(Altera a posição do “Objeto3”, o nosso cubo do tipo “Event Area” que acabamos de colidir para que ele fique exatamente embaixo do ator principal, para evitar que o ator saia do evento antes do dialogo acabar)

   if (IsKeyPress(13))and((GetWaitKeyIsUp)) then

(Verifica se a tecla 13 (Enter) esta pressionada e se a flag “WaitKeyUp” esta verdadeira, caso as duas premissas sejam verdadeiras será exibido o próximo dialogo)

   if Dialogo = 1 then

(Caso o próximo dialogo seja o de valor 1)

   ShowGameDialog('FaceActor',
                  'Olá!',
                  150,
                  GetScreenWidth()-100,
                  50,
                  GetScreenHeight()-180,
                  110,
                  110,
                  115,
                  (GetScreenHeight()-180)+87,
                  175,
                  (GetScreenHeight()-180)+35, 
                  (GetScreenWidth()-230),
                  true);

(Exibe o dialogo com a frase “Olá!” a textura de face “FaceAtor”, os outros parâmetros já foram explicados anteriormente)

   WriteGlobalVar('Dialog', Dialogo+1);

(Utiliza o comando “WriteGlobalVar” para alterar o valor da variável global “Dialog”, incrementando-a em 1, insta significa que o nosso dialogo avançou uma etapa)

   else if Dialogo = 2 then

(Caso o próximo dialogo não tenha sido o de valor 1 e seja o de valor 2)

   ShowGameDialog('FaceMainActor',
                  'Porque você tem essa cabeça de abóbora???',
                  150,
                  GetScreenWidth()-100,
                  50,
                  GetScreenHeight()-180,
                  110,
                  110,
                  115,
                  (GetScreenHeight()-180)+87,
                  175,
                  (GetScreenHeight()-180)+35,
                  (GetScreenWidth()-230),
                  true);

(Exibe o dialogo com a frase “Porque você tem essa cabeça de abóbora???” a textura de face “FaceMainAtor”, os outros parâmetros já foram explicados anteriormente)

   WriteGlobalVar('Dialog', Dialogo+1);

(Utiliza o comando “WriteGlobalVar” para alterar o valor da variável global “Dialog”, incrementando-a em 1, insta significa que o nosso dialogo avançou uma etapa)

   else if Dialogo = 3 then

(Caso o próximo dialogo não tenha sido o de valor 1 e nem o de 2 e seja o de valor 3)

   ShowGameDialog('FaceActor',
                  'Não sei...',
                  150,
                  GetScreenWidth()-100,
                  50,
                  GetScreenHeight()-180,
                  110,
                  110,
                  115,
                  (GetScreenHeight()-180)+87,
                  175,
                  (GetScreenHeight()-180)+35,
                  (GetScreenWidth()-230),
                  true);

(Exibe o dialogo com a frase “Não sei...” a textura de face “FaceAtor”, os outros parâmetros já foram explicados anteriormente)

   WriteGlobalVar('Dialog', Dialogo+1);

(Utiliza o comando “WriteGlobalVar” para alterar o valor da variável global “Dialog”, incrementando-a em 1, insta significa que o nosso dialogo avançou uma etapa)

   Else

(Caso o próximo dialogo não tenha sido o de valor 1 e nem o de 2 e nem o de 3 significa que o dialogo acabou.)

   HideGameDialog();

(Esconde a caixa de dialogo)

   EnableMainActorControl();

(Habilita novamente o controle do ator principal para o jogador)

   WriteGlobalVar('Dialog', Dialogo+1);

(Incrementa pela ultima vez valor da variável global “Dialog”)

   SetObjectScript('Objeto3', 'OnCollision', '');

(Remove o script “OnCollision” do objeto “Objeto3”)

   SetWaitKeyUp(13);

(Sempre que a tecla 13 (Enter) for pressionada o comando “SetWaitKeyUp” é utilizado para aguardar que ela seja liberada novamente)

      Finalmente colocando o script acima no 3D Game Builder no evento “OnCollision” do “Objeto3” (cubo do tipo “Event Area”) , salvando-o e executando o projeto você terá o seguinte resultado:

      É possível alterar o visual da caixa de dialogo alterando o GUI Layout utilizando no projeto, para isso acesse o menu “Projeto -> GUI Layout”. Este foi mais um exemplo do que pode ser feito utilizando a linguagem script, nos próximos tutoriais aprenderemos a fazer outras coisas utilizando scripts.