ISEL | DEETC | LERCM
Computação Gráfica e Ambientes Virtuais
1.19 Motor de Jogo.

Como 1ª abordagem ao Motor de Jogo do Blender (Blender Game Engine (GE)), vamos ver como fazer um jogo 3D muito simples. Iremos progressivamente desenvolver jogos mais atractivos graficamente e mais complexos, quer na sua interface com o utilizador quer na sua lógica interna. Os princípios básicos aqui introduzidos serão complementados em módulos posteriores, após a apresentação de técnicas de modulação avançadas, técnicas de construção de objectos articulados, técnicas de texturização e iluminação específicas para jogos e introdução à programação em Python.


Game Engine - Locic Panel.

O GE pode ser activado a partir e qualquer janela 3D. Note no entanto que o executável que poderá criar reflectirá sempre o ponto de vista da câmara activa.

Para activar o GE coloque o rato sobre uma janela 3D e pressione a tecla [P]. Para sair do GE pressione [Esc].

O GE pode ainda ser activado a partir do menu que surge ao seleccionar a opção Game da barra da Janela de Preferências, figura 1.19.1.

O conjunto de acções a desencadear durante o jogo é definido nos painéis do ambiente Logic Panel.

Para ter acesso ao conjunto de funcionalidades do GE seleccione (Logic) na barra da Janela de Botões, figura 1.19.2 , ou pressione [F4].

 

Figura 1.19.1

Figura 1.19.2


Blocos Lógicos.

O Blender utiliza um sistema click-and-drag de Blocos Lógicos para definir a interacção entre si, e com o utilizador, dos objectos em cena. Veremos, em próximos módulos, como recorrer à linguagem de programação Python para desencadear acções cuja complexidade não esteja ao alcance dos blocos lógicos disponíveis.

Há 3 tipo diferentes de blocos lógicos: Sensores; Controladores e Actuadores, figura 1.19.3.

Figura 1.19.3


Sensores.

Os sensores são os blocos de entrada do sistema e destinam-se a detectar um qualquer sinal que aí seja presente, figura 1.19.4. O sinal de entrada poderá ser de origem externa, por exemplo proveniente do teclado, do rato etc., ou de origem interna, por exemplo resultante de um acontecimento como a proximidade ou colisão entre dois objectos etc., ou tão simplesmente um impulso enviado aos controladores em cada uma das frames do jogo. Num próximo módulo faremos a sua descrição exaustiva.


Controladores.

Os controladores são os blocos intermédios do sistema. Recebem os sinais provenientes dos sensores, fazem o seu tratamento e enviam-nos para os controladores. Na sua forma mais simples poderão ser um simples AND ou OR, ou uma qualquer expressão lógica combinatória de vários sinais que lhes sejam passados pelos sensores. Para tratar situações mais complexas, os sinais dos sensores poderão ser utilizados num script escrito em Python. Figura 1.19.5.


Actuadores.

Os actuadores são os blocos de saída do sistema. Recebem os sinais provenientes dos controladores e desencadeiam as acções desejadas enviando sinais a sistemas externos ou internos, como sejam recomeçar o jogo, enviar uma mensagem a um qualquer objecto do jogo (cujos sensores receberão e consequentemente irá desencadear uma qualquer acção), modificar uma qualquer propriedade interna, fazer mover um objecto, emitir um sinal sonoro, iniciar uma animação, etc.

Para criar um bloco lógico pressione o botão Add à direita de cada um dos tipos. Se desejar eliminar um bloco criado pressione o botão X presente à esquerda, figura 1.19.7.


Cadeia de Acção.

Cada uma das acções a desencadear está associada a uma cadeia Sensor/Controlador/Actuador, figura 1.19.7. Após criar um bloco de cada tipo pode estabelecer a sequência pressionando [LB ] sobre uma das pequenas "anilhas metálicas" e arrastando o rato, com o botão pressionado, até à anilha adjacente, figura 1.19.7. Para eliminar uma ligação coloque o rato sobre o pequeno fio, que mudará a sua cor para branco, e pressione [X].

Figura 1.19.4

Figura 1.19.5

Figura 1.19.6

Figura 1.19.7


Exemplo 1.

• Abra o Blender. Seleccione o cubo padrão (aliás, ao abrir o Blender, o cubo encontra-se já seleccionado).

• Pressione [F4] . Note que os blocos lógicos têm o nome do objecto seleccionado (pertencem ao objecto) .

• Pressione [Add] em cada um dos tipos. Verá surgir um sensor Always, um controlador AND e um actuador Motion.

• Pressione [LB ] sobre a anilha à direita do sensor e arraste o rato com o botão pressionado até à anilha à esquerda do controlador. Proceda de igual modo para as anilhas entre o controlador e o actuador.

• No painel do actuador, pressione [LB ] sobre o campo imediatamente à direita de dLoc (correspondente a deslocamentos sobre o eixo dos xx) e escreva o valor 0.1. Neste momento deverá ter uma cadeia de acção idêntica à figura 1.19.7.

• Seleccione a visão de câmara na janela 3D e, com o rato sobre a janela, pressione [P] para accionar o motor de jogo. Verá o cubo movimentar-se continuamente ao longo do eixo dos xx. Pressione [Esc] para sair do motor de jogo.

O sensor Always envia ao controlador AND um sinal em cada uma das frames do jogo. Tendo apenas uma entrada, o controlador AND transfere o sinal para a saída, activando o actuador em cada uma das frames. O actuador Motion, com dLoc=[0.1 0.0 0.0], altera, em cada frame, o valor da coordenada x da posição do centro do Cubo em 0.1 unidades Blender (BU). É assim criada a ilusão de movimento contínuo do cubo ao longo do eixo dos xx.

Num próximo módulo explicar-se-á em detalhe cada um dos blocos lógicos disponíveis.


Exemplo 2.

Vamos agora, através do exemplo de um jogo clássico de plataformas, ver alguns dos blocos lógicos disponíveis. Começemos por ver como movimentar um objecto recorrendo ao teclado.

• Abra o Blender, elimine o cubo e, em TopView, insira um cone e um plano.

• Coloque o cone na origem e rode-o de 90º sobre o eixo dos yy: xyz[0 0 0], RxRyRz[0 90 0], figura 1.19.8. Note que os eixos coordenados locais e globais não têm agora correspondência directa.

• Na barra da Janela 3D seleccione [Object>Clear/ Apply>Apply Scale/ Rotation to OBData], ou preesione [Ctrl]+[A]>[1], figura 1.19.9, de modo a alinhar o sistema de eixos locais com o sistema global, apagando qualquer registo de que o objecto tenha sido rodado (e escalado, se fosse o caso.

Figura 1.19.8

Figura 1.19.9

No exemplo 1 o cubo move-se incessantemente devido ao facto do sensor Always enviar ao actuador Motion um sinal por cada uma das frames. Vamos agora ver como controlar o movimento de um objecto em cena por recurso ao teclado.

• Com o cone seleccionado, pressione [F4], pressione [Add] em cada um dos tipos de blocos lógicos e interligue-os, criando assim uma cadeia de acção.

• No painel do sensor pressione os cursores à direita do tipo de sensor (por defeito Always quando cria um novo), para ter acesso à lista de sensores disponíveis, e seleccione Keyboard. O painel do sensor passa a ter a configuração da figura 1.19.10. Este novo tipo de sensor vai-nos permitir seleccionar uma tecla que será necessário pressionar para que o sensor envie um sinal ao controlador.

• Seleccione a caixa Key e pressione [A]. A caixa em cima à direita é referente ao nome do sensor. Deve escrever um nome sugestivo que permita identificar o sensor facilmente nos casos em que a malha lógica se torne muito complexa.

• No painel actuador pressione [LB ] sobre o 3º campo à direita de Rot (correspondente a rotações em torno do eixo dos zz) e escreva o valor 0.1, figura 1.19.11. No botão L, imediatamente à direita, podemos especificar se a acção é referente ao sistema de eixos global (botão não pressionado), ou ao sistema de eixos local (botão pressionado (por defeito)). Dê um nome sugestivo ao actuador na caixa respectiva.

Figura 1.19.10

Figura 1.19.11

Seleccione a visão de câmara na janela 3D e, com o rato sobre a janela, pressione [P] para accionar o motor de jogo. Pressione [A]. Verá o cubo rodar sobre (o seu) eixo dos zz enquanto a tecla estiver pressionada e manter-se imóvel assim que deixar de pressionar a tecla. Pressione [Esc] para sair do motor de jogo.

• Adicione 3 novas cadeias de acção e repita o procedimento para fazer rodar o cone à direita, agora com a tecla [D] e Rot[0.0 0.0 -0.10]; fazer mover o cone em frente (eixo local xx), tecla [W] e Loc[0.1 0.0 0.0]; e fazer mover o cone para trás (eixo local -xx), tecla [S] e Loc[-0.1 0.0 0.0].

A malha lógica deve agora ter a configuração que se mostra na figura 1.19.12. É conveniente, para uma melhor interpretação e maneabilidade, simplificar o aspecto visual da malha. Pressione o triângulo invertido a amarelo do topo direito de cada um dos blocos lógicos, de modo a esconder a representação de cada um deles, figura 1.19.13. Pode esconder/mostrar todos em simultâneo seleccionando a respectiva acção no menu disponibilizado ao seleccionar a caixa em cima à esquerda de cada um dos blocos lógicos.

Pressione [P] para accionar o motor de jogo e movimente o cone livremente sobre o plano.

Figura 1.19.12

Figura 1.19.13


Leis da Mecânica.

Em muitos jogos é importante que os intervenientes estejam sujeitos às leis da física. Uma das características importantes do motor de jogo do Blender, designado por Bullet, é a simplicidade de integração das leis da mecânica clássica no ambiente de jogo, que possibilitam a simulação de colisões, forças de atrito, resistência do ar, etc.

• Seleccione o cone, pressione o botão Actor (topo esquerdo do Logic Panel), figura 1.19.3, e seguidamente o botão Dynamic, figura 1.19.14.

Com estas duas simples acções, o cone passou a estar integrado num Mundo sujeito às leis da mecânica, ficando sujeito à força da gravidade (com valor padrão 9.8, dirigida segundo o eixo global -zz (ver Worls Buttons, figura 1.19.15)) e sendo portador de uma massa (com valor padrão 1.0), figura 1.9.14. Verifique que no painel do actuador Motion apareceram novas opções: Força, Torque (momento estático), Velocidade angular, etc.


Exemplo 3.

Vamos agora ver como fazer saltar um objecto que entre em contacto com uma superfície.

 

Figura 1.19.14

Figura 1.19.15

Figura 1.19.16

• Seleccione o cone e adicione uma nova cadeia de acção. Modifique o sensor para Keyboard e associe-lhe a tecla [Space]. No actuador Motion aplique uma força 50 segundo zz, Force[0.0 0.0 50]. Pressione o botão L para que a força fique referida ao sistema de eixos global.

Pressione [P] para accionar o motor de jogo e pressione [Space]. Note que, em resultado da aplicação da força, o cone é impulsionado segundo o eixo dos zz sempre que se pressiona [Space], mesmo que não esteja assente sobre o plano. Para resolver este problema vamos recorrer a um sensor Touch.

• Seleccione o cone, adicione um novo sensor e modifique o tipo para Touch. Ligue a saída deste sensor e o sensor da tecla espaço ao mesmo controlador AND, figura 1.19.17. Pressione [P] para accionar o motor de jogo. Verifique que agora o cone só é sensível à actuação da força quando está em contacto com o plano.

Figura 1.19.17

Vamos agora ver como fazer desaparecer objectos.

• Introduza 3 cubos e duas esferas em cena, e dê-lhes um enquadramento idêntico ao da figura 1.19.18.

• Seleccione uma das esferas. Pressione [F4>Actor>Ghost], figura 1.19.19.

Um objecto imerso num Mundo sujeito às leis da física mas caracterizado como Ghost não tem influência sobre a dinâmica desse Mundo, ou seja, comporta-se como um "fantasma". Qualquer objecto que entre no seu espaço não sofre qualquer força. Vamos utilizar as esferas como objectos a coleccionar. O objectivo será fazer o cone alcançar as esferas, resultando dai consequências a nível da lógica do jogo mas não a nível do comportamento físico do cone.

• Com a esfera seleccionada, crie uma cadeia de acção. Escolha um sensor Near e um actuador Edit Object>End Object, figura 1.19.20.

O sensor Near envia um sinal ao controlador sempre que um objecto (do tipo Actor) é detectado a uma certa distância (especificável no respectivo painel).

Figura 1.19.18

Figura 1.19.19

Por sua vez, o sinal do controlador é, neste caso, enviado ao próprio objecto que, por ter um actuador do tipo End Object, desaparece de cena.

Figura 1.19.20

Vamos ainda ver como associar um sinal sonoro ao desaparecimento de um objecto.

• Crie um actuador do tipo Sound e ligue-o à saída do controlador AND em paralelo com o actuador End Object.

• Pressione [F10], para ter acesso aos painéis do ambiente Scene, seguido de Sound Block Buttons, para ter acesso aos botões de controle de ficheiros áudio, e seleccione um ficheiro apropriado, figura 1.19.21. Uma vez seleccionado o ficheiro, encapsule-o no ficheiro Blender, para tornar o seu *.blend mais portável, pressionando o botão com o pequeno símbolo semelhante a uma "prenda", figura 1.19.23.

• Pressione [F4] de novo e, no painel do actuador Sound, seleccione o ficheiro áudio que agora se encontra disponível, figura 1.19.22.

Vamos também ver como enviar uma mensagem de um acontecimento (desaparecimento da esfera) a todos os objectos em cena (que fizerem parte da Lógica do Jogo).

• Com a esfera seleccionada, crie um novo actuador, agora do tipo Message, e, no campo Subject, dê-lhe um nome sugestivo, figura 1.19.24.

Figura 1.19.21

Figura 1.19.22

Figura 1.19.23

Ligue o actuador Message à saída do controlador AND, em paralelo com os actuadores End Object e Sound. A cadeia de acção da esfera está agora completa, como se mostra na figura 1.19.24.

Figura 1.19.24

• Crie uma cadeia de acção idêntica para a segunda esfera.

Nota: O modo mais prático de criar uma cadeia de acção idêntica para a segunda esfera é duplicar a primeira pressionando [Shift]+[D] e arrastando a esfera duplicada para a posição desejada ([Shift]+[D] acciona de imediato o Modo de Translação (G)).

Finalmente vamos ver como coleccionar objectos e desencadear uma acção quando a tarefa estiver concluída.

Seleccione o cubo mais à esquerda da cena, figura 1.19.18. Pressione [F4] e o botão Add Property, figura 1.19.25.

A função desta propriedade será acumular o número de esferas eliminadas, ou seja, o número de vezes que este objecto (o cubo) recebe a Mensagem "Bola Amarela".

• Dê à propriedade um nome sugestivo, "ContadorBA", modifique o tipo de contador para Inteiro, e pressione o botão D, de "Debug", que permite ver o valor da propriedade enquanto o jogo se desenrola (para além disso, na barra da Janela de Preferências seleccione Show Debug Properties, figura 1.19.26).

• Crie uma cadeia de acção com um sensor Message e um actuador Property.

Figura 1.19.25

Figura 1.19.26

• Na caixa Subject do sensor escreva o nome da mensagem enviada pelas esferas amarelas (para que não haja engano é preferível fazer [Ctrl]+[C]>[Ctrl]+[V] entre as duas caixas), figura 1.19.27.

• Na caixa Prop do actuador Property escreva o nome do contador, figura 1.19.27.

Figura 1.19.27

Figura 1.19.28

Vamos agora forçar a que, desde que as 2 esferas amarelas tenhas sido eliminadas, quando o cone se aproxima do 3º cubo o jogo acabe e seja emitido um sinal sonoro.

• Com o 3º cubo seleccionado crie uma nova cadeia de acção, com um sensor Near e um sensor Property ligados em paralelo a um controlador AND, e ligue à saída deste um actuador Sound e um actuador Game, figura 1.19.28.

• Na caixa Prop do sensor Property escreva o nome da propriedade que acumula o número de esferas amarelas eliminadas, seleccione o tipo Equal e faça Value igual a 2.

• No actuador Game seleccione Quit this game.

Pressione [P] para accionar o motor de jogo. Note a informação sobre a propriedade do 3º cubo, ContadorBA, no canto superior esquerdo da janela do jogo.


Criação de um Executável.

O Blender permite criar uma versão executável stand-alone do jogo, isto é uma versão que pode ser executada independentemente do Blender estar instalado.

Na barra da Janela de Preferências seleccione [File>Save Game As Runtime] , figura 1.19.30, e salve o jogo na directoria que desejar. Abra a directoria onde colocou o ficheiro *.exe e execute-o. Recerá uma mensagem de erro assinalando a falta de um ficheiro *.dll (por exemplo zlib.dll, xvidcore.dll, etc.). Pode encontrar este ficheiros na directoria onde tem instalado o Blender. Repita o procedimento, copiando todos os ficheiros *.dll para a directoria onde tem o executável do jogo.

Figura 1.19.29

Figura 1.19.30


Explore os conceitos básicos sobre o Motor de Jogo do Blender aqui apresentados até se familiarizar com a sua utilização. Explore a utilização dos diversos sensores e actuadores criando novos cenários de jogo.