Pré-requisito: possuir Python 3 instalado, com seu gerenciador de pacotes, pip, funcionando.
- Instalar o TKinter, pela linha de comando
sudo apt-get install python3-tk
- Pronto. Já temos tudo necessário para executar o projeto.
- No terminal, executar make start
- Para construir um jogo com o atual mapa de jogo, clicar em BUILD.
- Para executar o jogo gerado, clicar em RUN.
- Para criar um jogo nesta versão do Padloper, é necessário editar o arquivo map.json
- Há modelos de jogos na própria pasta do projeto que contemplam todos os casos de uso da ferramenta. No entanto, é possível criar muitos estilos diferentes de jogos com aquelas poucas funcionalidades.
- Para mais informações, consultar Game Map (Mapa de Jogo)
Este repositório foi criado para o meu projeto de conclusão de curso pelo CEFET/RJ, no curso de Sistemas de Informação.
Conteúdo:
- O que é o Padloper?
- Por que Game Engine por Subtração?
- Glossário
- Como funciona um jogo no Padloper?
- Como o Padloper é construído?
Padloper é uma game engine construída como um framework, uma camada acima da biblioteca gráfica Turtle Graphics, para o Python. O objetivo final do projeto é possibilitar a um usuário sem qualquer conhecimento em programação a experiência de ser um game designer e desenvolver um jogo arcade simples, de apenas uma tela e poucos elementos, como o jogo Frogger. A ferramenta tem como principal meta ser uma opção viável para o primeiro contato de alguém com o desenvolvimento de jogos e game designing.
O nome Padloper vem da menor tartaruga terrestre do mundo, cujo nome científico é Homopus signatus, e condiz com o escopo do projeto, que visa ser uma game engine pequena, enxuta e diminuta, e que usa os Turtle Graphics para atingir seus objetivos.
O termo 'por subtração' surge de 'design por subtração', atribuído ao game designer Fumito Ueda, diretor dos jogos Ico e Shadow of The Colossus, e se refere à retirada de tudo que não for essencial à forma, tornando o produto final mais enxuto, simples e de escopo bem reduzido.
Tal filosofia se encaixa perfeitamente na proposta do Padloper, que foi pensada com foco total no primeiro contato de alguém com a construção de jogos, e por isso muitas das funcionalidades mais "comuns" de game engines mais tradicionais são removidas - subtraídas - para que a linha de aprendizado seja a mais suave possível.
Uma pergunta importante a se fazer para garantir que um elemento é passível de subtração é: "Caso um jogo não possua tal elemento, ele ainda é um jogo?". Em casos como a interação do usuário, a resposta é certamente não. Um jogo sem interação do usuário é uma outra coisa, mas não um jogo. Já em casos como o áudio, no entanto, a resposta pode ser sim. Um jogo sem som ainda é um jogo. E é aqui que a subtração age.
- Ator : Elemento de jogo que possui componentes e comportamentos. Regras podem ser aplicadas a um ator e este poderá ser parte das consequências destas regras.
- Tela : Espaço onde o jogo é executado.
- Ciclo de jogo: Espaço de tempo no qual o jogo é executado. Pode-se dizer que uma 'volta' neste ciclo corresponde a um frame do jogo. Um ciclo de jogo possui os métodos Input, Update e Render, e também é dentro deste ciclo que as regras do jogo são checadas.
- Classe-Gerente: Em construção
Em construção
Um jogo construído pelo padloper possui 4 componentes principais: Tela, Ciclo de Jogo, Atores e suas Classes-Gerentes. Durante a execução do ciclo de jogo, as classes-gerentes checam as regras e executam suas ações, eventualmente interagindo entre si, ou com a tela.
stateDiagram-v2
[*] --> Setup
Setup --> Input
Input --> Update
Update --> Render
Render --> Input
Render --> [*]
O ciclo de jogo compreende os métodos após o Setup (configuração inicial das classes-gerentes de jogo).
Cada um destes métodos do ciclo de jogo possui um correspondente nas classes-gerentes dos atores. Isto permite que se chame cada um dos métodos próprios e que se personalize estes métodos dentro das classes-gerentes.
sequenceDiagram
Padmain.Update()->>+AtorGerente.Update(): Realize o método Update!
AtorGerente.Update()->>+Ator: Atualize sua posição!
Ator-->>-AtorGerente.Update(): Posição atualizada!
AtorGerente.Update()-->>-Padmain.Update(): Ator Atualizado!
No exemplo, o método Update, inserido dentro do Padmain, chama seu correspondente dentro da classe ator-gerente, que atualiza a posição do ator, e retorna o ator já atualizado, que será renderizado na próxima atualização de tela.
A ferramenta é construída em algumas partes, que compõem o todo do software. Abaixo estão descritas as ferramentas e suas funções:
O mapa de jogo é um arquivo JSON que será o guia, ou a planta do jogo. O software está preparado para ler o arquivo e usar as informações nele contidas para construir o jogo.
Um mapa de jogo típico do Padloper é assim construído:
{
"name" : "Padloper Game",
"screen" : {},
"scoreboard" : {},
"rules" : [
{}
],
"actors" : [
{}
]
}
Cada um dos elementos do mapa possui em si uma série de outros elementos, e além do "name", que é o título do jogo, são eles:
O Objeto de Tela de um jogo executado com Turtle é o espaço no qual os objetos são desenhados, ou seja, é o espaço onde o jogo realmente acontece. Um elemento de tela num mapa de jogo construído pelo Padloper é como descrito abaixo:
"screen" : {
"width" : 1000,
"height" : 1000,
"color" : "green"
}
Elementos:
Width: Largura da tela em pixels;
Height: Altura da tela em pixels;
Color: Cor do background, que pode ser informada em hexadecimal;
Um elemento de Scoreboard no mapa de jogo Padloper é como disposto abaixo:
"scoreboard": {
"position" : "top"
"color" : "black"
"font" : "Courier"
"size" : "18"
}
Elementos:
Position: Posição do placar na tela (top|bottom);
Color: Cor das letras do placar, que pode ser informado em hexadecimal;
Font: Fonte da escrita do placar;
Size: Tamanho da escrita do placar;
O array 'Actors' do jogo é uma lista dos atores que estarão presentes na execução do jogo, incluindo tanto atores que o jogador controla quanto os inimigos ou outros assets não controlados pelo jogador.
Um ator é possui dentro de si alguns objetos, como descrito abaixo:
{
"name" : "player",
"components" : {
"size" : 2,
"speed" : 10,
"heading" : 0,
"collision_field": 3
},
"spawn" :
{
"type" : "multiple",
"max_num" : 300,
"screen_update_count" : 12,
"positions" : [
{"x" :0, "y" : 470}
],
"colors" : [
"red"
]
},
"behaviors" :
{
"inputs" : [
{"key" : "w", "action" : "forward", "param" : "10"},
{"key" : "s", "action" : "backward", "param" : "10"},
{"key" : "a", "action" : "strife_left", "param" : "10"},
{"key" : "d", "action" : "strife_right", "param" : "10"}
]
},
{
"updates": [
{ "action" : "strife_left", "param" : "10"}
]
},
}
Elementos:
Name: Nome do ator;
Components: Atributos estáticos do ator;
- Speed: Atributo de velocidade do ator na tela ( 1 - 10 );
- Size: Dimensão do ator. ( 1 - 10 );
- Heading: Direção com a qual o ator vai ser gerado. ( 0 - 359 )
- Collision Field: Campo de colisão quadrado, gerado à partir do centro do ator. ( 1 - 10 )
Spawn: Objeto com os parâmetros de geração do ator na tela;
- Type: Tipo de geração ( unique | multiple );
- Positions : Array de posições que o ator pode assumir ao ser gerado. o ator será gerado numa destas coordenadas, aleatoriamente.
- x: Posição x onde o ator será gerado;
- y: Posição y onde o ator seŕa gerado;
- Colors : Array de cores que o ator pode assumir ao ser gerado. o ator escolherá uma cor aleatoriamente.
Behaviors: Comportamentos que o ator pode possuir. Há dois tipos de ações que se encaixam dentro de "Behaviors": os inputs e os updates.
-
Inputs: lista de ações que o ator tomará ao pressionar de uma tecla. Um input possui:
- Key: Tecla que, quando pressionada, executará a ação definida (a-z0-9) ;
- Action: Ação executada ao pressionar a tecla;
- "forward" - move o ator para a frente em pixels (baseado no heading);
- "backward" - move o ator para trás em pixels (baseado no heading);
- "right" - vira o ator para a direita em graus (baseado no heading);
- "left" - vira o ator para a esquerda em graus (baseado no heading);
- "strife_left" - move o ator para a esquerda em pixels (baseado no heading);
- "strife_right" - move o ator para a direita em pixels (baseado no heading);
- Param: Parâmetro com o qual a ação será executada, que pode ser, por exemplo, o número de pixels que um ator andará, quantos graus ele se voltará, etc;
-
Updates: lista de ações que serão executadas pelo ator a cada novo frame, sem necessidade de uma interação do usuário.
- Action: Ação executada ao pressionar a tecla.
- "forward" - move o ator para a frente em pixels (baseado no heading);
- "backward" - move o ator para trás em pixels (baseado no heading);
- "right" - vira o ator para a direita em graus (baseado no heading);
- "left" - vira o ator para a esquerda em graus (baseado no heading);
- "strife_left" - move o ator para a esquerda em pixels (baseado no heading);
- "strife_right" - move o ator para a direita em pixels (baseado no heading);
- Param: Parâmetro com o qual a ação será executada, que pode ser, por exemplo, o número de pixels que um ator andará, quantos graus ele se voltará, etc;
- Action: Ação executada ao pressionar a tecla.
Esta lista contém os objetos que descrevem as regras do jogo. Regras são condições a serem atingidas e suas consequências, bem como o ator ou atores envolvidos nesta regra. Abaixo estão alguns exemplos de objeto de regras incluído no mapa de jogo:
- Condições-Gatilho:
- "collision" - checa a colisão entre o ator1 e o ator2;
- "position" - checa a posição do ator1 baseado nos eixos x e y;
- "score" - checa a pontuação;
Exemplo de regra de colisão:
{
"trigger" : "collision",
"actor1" : "player",
"actor2" : "enemy",
"consequences" : []
}
Elementos da Regra de Colisão:
Trigger: Tipo de condição-gatilho para a regra ser ativada; ( collision | position | score )
Actor1: Primeiro ator a ser checado; (ator)
Actor2: Segundo ator a ser checado; (ator)
Consequences: Lista de consequências a serem executadas assim que a condição-gatilho for atingida;
Importante: a condição-gatilho 'collision' checa apenas colisões entre dois tipos de atores, e não é possível checar colisão entre três tipos de atores nesta versão do Padloper.
Exemplo de regra de posição:
{
"trigger" : "position",
"x_pos" : "",
"x_cond" : "",
"y_pos" : "480",
"y_cond" :"greater",
"actor1" : "player",
"consequences" : []
}
Elementos da Regra de Posição:
Trigger: Tipo de condição-gatilho para a regra ser ativada; ( collision | position | score)
Actor1: Ator cuja posição será checada; (ator)
X_pos: Posição no eixo X para que o a regra seja ativada; ( number | "" )
X_cond: Condição relacionada ao eixo X para que a regra seja ativada; ( lesser | equal | greater )
Y_pos: Posição no eixo Y para que o a regra seja ativada; ( number | "" )
Y_cond: Condição relacionada ao eixo Y para que a regra seja ativada; ( lesser | equal | greater )
Consequences: Lista de consequências a serem executadas assim que a condição-gatilho for atingida;
Importante: a condição-gatilho 'position' poderá checar se um ator passou de uma coordenada na tela, no eixo x ou y caso apenas uma das coordenadas sejam informadas, ou se este ator atingiu um certo ponto da tela, caso as duas coordenadas sejam fornecidas.
Exemplo de regra de pontuação:
{
"trigger" : "score",
"win_score" : 10
"consequences" : []
}
Elementos da Regra de Pontuação:
Trigger: Tipo de condição-gatilho para a regra ser ativada; ( collision | position | score)
Win_Score: Pontuação a ser atingida para que a regra seja ativada. ( number > 0 )
Consequences: Lista de consequências a serem executadas assim que a condição-gatilho for atingida;
- Consequências:
- "remove_actor" - remove o ator2 da tela;
- "set_heading" - muda a direção que o ator1 está apontado;
- "bounce_x" - faz o ator1 'quicar' no eixo x, em 45 graus;
- "bounce_y" - faz o ator1 'quicar' no eixo y, em 45 graus;
- "game_won" - finaliza o jogo com condição de vitória;
- "point" - acrescenta um ponto ao placar;
- "game_over" - finaliza o jogo com condição de derrota;
- "move_to" - move o ator1 para uma nova posição;
O Padloper Game Builder é o motor primordial da ferramenta. Esta peça do Padloper é o interpretador do mapa de jogo e o construtor do jogo de fato.
Cada um dos elementos descritos do Mapa de Jogo possui um construtor próprio, e opera sob regras específicas para cada um dos objetos.
Quais são as peças do Game Buider?
Em construção
Em construção
Em construção
Em construção
Em construção
Em construção