Fluxograma de estados do personagem no GameMaker

Resumen

Programar um personagem com múltiplos estados em GameMaker Studio fica muito mais simples quando partes de um diagrama de fluxo antes de tocar no código. Esta abordagem ajuda iniciantes em desenvolvimento de jogos a organizar a lógica entre idle, move e attack, e a evitar bugs de animação que aparecem quando os estados não estão bem conectados.

Por que desenhar um diagrama de fluxo antes de programar?

Quando o código cresce, perdes a noção de quando cada estado deve ativar ou desativar. Um diagrama rápido, mesmo no Paint, mostra visualmente as transições e serve de guia tanto para ti como para qualquer pessoa que leia o teu projeto depois.

O esquema da aula define três círculos: idle, move e attack. Cada seta representa uma transição com uma condição clara.

  • De idle para move: ao premir qualquer direção (cima, baixo, esquerda ou direita).
  • De move para idle: quando deixas de premir todas as direções.
  • De idle para attack: ao premir o botão de ataque.
  • De attack para idle: automaticamente, quando a animação termina.

Repara que move e attack nunca se conectam diretamente. Para atacar, o personagem precisa primeiro voltar a idle.

O que é uma máquina de estados num jogo? É um padrão em que o personagem só pode estar num estado de cada vez (idle, move, attack), e as transições entre eles seguem regras definidas. Garante que a lógica seja previsível.

Como traduzir o fluxograma para código no obj_player?

A estratégia é abrir o obj_player e comentar o código antigo com /* */ para o usares como referência sem que execute. Depois, distribuis as transições dentro de cada script de estado [02:30].

Como configurar o script idle

Dentro do script_idle, colas as condições que detetam input. Se o jogador prime uma direção, atribuis state = script_move. Se prime o botão de ataque, atribuis state = script_attack. Assim que a atribuição acontece, o script termina e o seguinte assume o controlo.

Como configurar o script move

No script_move, adicionas um if que verifica se nenhuma das quatro direções está pressionada. Quando essa condição se cumpre, devolves o personagem ao idle com state = script_idle [04:10]. É a forma mais limpa de fechar o ciclo de movimento.

Como configurar o regresso do attack ao idle

O estado de ataque não volta com input, volta com o fim da animação. Para isso, adicionas um novo event no objeto: vais a Other > Animation End. Dentro desse evento escreves uma condição que pergunta se state == script_attack e, se for verdade, atribuis state = script_idle [05:40].

Qual é a diferença entre = e == em GameMaker?

Esta dúvida aparece sempre que começas a programar. Os dois operadores parecem iguais mas fazem coisas opostas.

  • O sinal = atribui um valor a uma variável. Exemplo: state = script_idle guarda o conteúdo de script_idle dentro de state.
  • O sinal == compara dois valores. Exemplo: if state == script_attack verifica se o conteúdo da variável é igual ao valor indicado.

Quando uso = ou == no código? Usas = para guardar informação numa variável e == dentro de condições como if, quando precisas de comparar se algo é igual a outra coisa.

Por que o ataque parece inconsistente e como o corrigir com image_index?

Aqui aparece um detalhe técnico que muda tudo. A variável image_index indica a posição atual da animação dentro do sprite. Se a animação de ataque tem 10 frames, o image_index vai variar de 0 a 9 enquanto corre.

O problema é que essa variável continua a avançar mesmo quando mudas de animação. Imagina que estás em idle (animação de 5 frames) e o image_index está em 4. Premes o ataque nesse instante. A animação de ataque vai começar no frame 4 em vez de começar no 0, e parecerá mais curta do que devia [08:20].

A solução é simples: sempre que transicionas para o estado de ataque, forças image_index = 0. Assim a animação começa sempre do início e mantém duração consistente.

  • Antes da correção: o ataque parece mais curto ou mais longo dependendo do momento em que premes a tecla.
  • Depois da correção: o ataque tem sempre a mesma duração e a animação completa-se inteira.

Como testar o fluxo completo no GameMaker?

Depois de implementar tudo, premes F5 para correr o jogo. O comportamento esperado é claro: começas em idle, mexes-te em qualquer direção e o personagem entra em move, soltas as teclas e volta a idle. Quando premes a tecla J, o personagem ataca e regressa automaticamente ao idle assim que a animação termina [10:15].

Se algum destes comportamentos falha, a primeira coisa a rever é em que script a transição está a acontecer e se usaste == em vez de = nas comparações.

Na próxima aula, vais aplicar este mesmo padrão de diagramas e estados ao primeiro inimigo do jogo. Deixa as tuas dúvidas nos comentários se algum estado não estiver a transitar como esperas.