O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

[RM2000] Mudar animação quando parado

Iniciado por Dr.XGB, 26/02/2017 às 12:52

26/02/2017 às 12:52 Última edição: 26/02/2017 às 13:02 por Dr.XGB
Mudar animação quando parado
by Dr.XGB
Plataforma: RPG Maker 2000
Autor: Dr.XGB
Dificuldade: Fácil (até demais)

Introdução

Este tutorial foi feito a pedido do membro shadow prince, num tópico que ele postou na área de suporte para RPG Maker 2000 e 2003 da finada Mundo RPG Maker.
Este sistema, resumidamente, faz com que o seu personagem mude de animação quando fica muito tempo parado, muito comum em jogos de plataforma. Daí o personagem volta ao normal quando você o move novamente. Daí, este tutorial vai converter esse sistema em eventos sem nenhuma dificuldade.
Aqui dividirei o tutorial em duas etapas: O evento para fazer o contador, detectando se nenhuma tecla será pressionada por um determinado tempo; e como trabalhar com os gráficos do charset para fazer a animação de espera do herói.

Espero que o tutorial ajude não só o shadow prince, mas também a todos que possuem a mesma dúvida que a dele e/ou querem aprender a fazer novos sistemas e que a lógica utilizada neste tutorial ajude você a criar novas coisas em base do que eu farei.


Etapa 1: Apenas eventos e charsets

A primeira etapa é bem simples, faremos com que certo evento comum conte por quanto tempo o jogador ficará sem pressionar nenhuma tecla direcional. Se o jogador pressionar qualquer tecla direcional, o contador voltará ao zero. Para isso, usaremos uma variável para agir como esse contador e outra pra detectar uma entrada de tecla realizada pelo jogador. Como esse evento ocorrerá constantemente, ele será um evento comum em processo paralelo.

Evento Comum: Stand Time
Condição Inicial: Processo Paralelo
Switch de Ativação: 0001: Stand ON
<> Variable Ch. [0001: Stand Time] Set, 0
<> CYCLE
 <> Enter Password: [0002: KEY] (1,2,3,4 - teclas direcionais, Wait key desmarcado)
 <> IF [0002: KEY] - 1 above
  <> IF [0002: KEY] - 4 below
   <> Comment: Zerar contador se uma tecla for pressionada
   <> Stop Parallel Process
   <>
  : END IF
  <>
 : END IF
 <> Variable Ch. [0001: Stand Time] + 1
 <> Wait: 0.1s
 <> Comment: O valor da condição fica a seu critério
 <> Comment: Cada 10 representa 1 segundo
 <> Ex: [0001: Stand Time] = 50 = 5 segundos
 <> IF [0001: Stand Time] - 50 above
  <> BREAK CYCLE
  <>
 : END IF
 <>
: END Cycle
<> Comment: Mudar Animação do herói após o ciclo
<> Change Hero GFX: (à sua escolha)
<> Change Switch: [0002: Stand Animation] - ON
<> CYCLE
 <> Enter Password: [0002: KEY] (a mesma configuração de antes)
 <> IF [0002: KEY] - 1 above
  <> IF [0002: KEY] - 4 below
   <> BREAK Cycle
   <>
  : END IF
  <>
 : END IF
 <>
: END Cycle
<> Comment: Voltar ao normal quando um tecla for pressionada
<> Change Hero GFX: (padrão do seu herói)
<> Change Switch: [0002: Stand Animation] - OFF
<>

O Gráfico do charset do herói, no momento, peço que troque por um outro charset normal para entendermos como funcionará nosso sistema de animação.

A switch de ativação deste evento comum deve ser ativada quando você quiser que a animação ocorra, normalmente quando o jogador começa a controlar o herói. Em caso de cutscenes, ou qualquer cena que você deseja que essa animação não ocorra, é só desativar esta switch e, ativar depois que o herói voltar a ser jogável.

Assim que a switch da animação se torna ativada, chamaremos um outro evento comum onde ocorrerá tal animação.

Evento Comum: Stand Animation
Condição Inicial: Processo Paralelo
Switch de Ativação: [0002: Stand Animation]
<> Move Event: Hero,  Turn 90º Right
<> Move All
<> Comment: Controle aqui a velocidade da animação
<> Wait: 0.1s

Ao testar o seu jogo, verá que o herói sairá girando feito um louco, É justamente essa a intenção, montamos a estrutura da animação do seu personagem. Agora que entendemos como fazer o seu herói mudar o seu gráfico quando fica certo tempo parado, vamos transformar esse Pião do Baú da Felicidade se transformar realmente numa animação. Só que para que essa animação funcione de uma maneira bem redonda, teremos que entender como o RPG Maker trabalha com os frames da direção dos eventos para transformarmos essas direções em frames.

Etapa 2: Animação em Charsets


Agora vamos trabalhar com a manipulação das animações do charset para ser a pose do seu herói.
Baseando-se na técnica utilizada na 1ª etapa, vamos converter essas direções em frames com um ato bem simples.
No RPG Maker, cada direção do evento/herói possui um valor numérico que pode ser facilmente determinado por:

  • 0 - Cima
  • 1 - Direita
  • 2 - Baixo
  • 3 - Esquerda

Aplicando no charset:

ATENÇÃO: Não confunda os valores das direções do charset com os valores das entradas das teclas. As teclas direcionais têm o seu valor de acordo com a entrada do teclado do seu sistema operacional, que pode ser encontrado abrindo o Mapa de Caracteres do seu sistema.
Porém o RPG Maker converteu esses valores de 1 a 4, só que numa ordem diferente das direções do gráfico charset.

Daí quando colocar as poses desejadas seguindo esse padrão, pode-se notar que ao invés de um herói girando, teremos uma animação de espera do herói enquanto você não o move pressionando uma tecla direcional.




Baixe a demonstração deste tutorial

Deixarei uma demo mostrando como foram feitos todos estes procedimentos deste tutorial.
MediaFire - Dropbox

Excelente tuto (só vi agora u.u'). Só discordo de uma coisa "Dificuldade: Fácil (até demais)", principalmente pra quem está iniciando.

É uma pena, no meu projeto tinha um esquema parecido (não era quando o char ficava idle, mas é que o dragão parado fica estranho, ele tinha que ficar batendo as asas mesmo parado u.u) que atualmente está fora do jogo visto que ele está dando problemas absurdos, até tentei a sua versão (uma adaptação dela) pra ver se rolava mas nada. Das duas uma, ou está em conflito com outro evento ou é algum bug do proprio RMK (o projeto foi importado do 2k pro 2K3, daí acontecem coisas estranhas tipo o atribuir uma tecla não reconhecer o shift ou apesar do limite de figuras ser maior, ele só lê até a figura 40.

De qualquer maneira me tira uma dúvida, acho que

IF [0002: KEY] - 1 above
  <> IF [0002: KEY] - 4 below
   <> Comment: Zerar contador se uma tecla for pressionada
   <> Stop Parallel Process
   <>
  : END IF

Esses Ifs não poderiam estar um dentro do outro, ou estou enganado?

Citação de: Vixen online 05/03/2017 às 18:36
É uma pena, no meu projeto tinha um esquema parecido (não era quando o char ficava idle, mas é que o dragão parado fica estranho, ele tinha que ficar batendo as asas mesmo parado u.u) que atualmente está fora do jogo visto que ele está dando problemas absurdos, até tentei a sua versão (uma adaptação dela) pra ver se rolava mas nada. Das duas uma, ou está em conflito com outro evento ou é algum bug do proprio RMK (o projeto foi importado do 2k pro 2K3, daí acontecem coisas estranhas tipo o atribuir uma tecla não reconhecer o shift ou apesar do limite de figuras ser maior, ele só lê até a figura 40.

Será que a opção de animação "Common/With Movement" resolveria esse caso?
Ao menos que ocorra uma troca de sprites quando ele está em movimento, ás vezes teria que mudar o CharFrame dele em movimento ao invés de mudar quando está parado pois será menos "mão de obra" rsrsrs !!

Citação de: Vixen online 05/03/2017 às 18:36
IF [0002: KEY] - 1 above
  <> IF [0002: KEY] - 4 below
   <> Comment: Zerar contador se uma tecla for pressionada
   <> Stop Parallel Process
   <>
  : END IF

Esses Ifs não poderiam estar um dentro do outro, ou estou enganado?
Na verdade é bom que fiquem um dentro do outro pois aí estamos mandando verificar se os valores estão entre 1 e 4. Se eu separá-los, será uma condição quando for maior/igual a 1 e outra menor/igual a 4. Ou seja, 5, 6, 7, -1, 0, etc estariam também dentro da condição e ia acabar bugando o sistema. :XD:

Citação de: Dr.XGB online 08/03/2017 às 18:42
Será que a opção de animação "Common/With Movement" resolveria esse caso?
Ao menos que ocorra uma troca de sprites quando ele está em movimento, ás vezes teria que mudar o CharFrame dele em movimento ao invés de mudar quando está parado pois será menos "mão de obra" rsrsrs !!.

Resolveria se fosse em um evento, mas é no heroi.
Eu geralmente faço num mapa teste em projeto separado, lá funcionou direitinho, problema é na hora de "importar" pro projeto mesmo. Vou tentar implantar e desligar todos os common events, e ir ligando um por um pra ver se é conflito com algum deles.

Citação de: Dr.XGB online 08/03/2017 às 18:42
Na verdade é bom que fiquem um dentro do outro pois aí estamos mandando verificar se os valores estão entre 1 e 4. Se eu separá-los, será uma condição quando for maior/igual a 1 e outra menor/igual a 4. Ou seja, 5, 6, 7, -1, 0, etc estariam também dentro da condição e ia acabar bugando o sistema. :XD:

Nossa, deleta o que eu perguntei kkkkkkkk eu nem li que estava "above" e "below", ainda pensei, pow ele só está testando pra baixo e pra cima. XD

09/03/2017 às 00:03 #4 Última edição: 09/03/2017 às 00:12 por Dr.XGB
Tente fazer isso:
<> Key Input: [0001: Key] (1, 2, 3 e 4)
// ---------------------------------------------------------------
// Se pressionar tecla, voltar ao gráfico normal
<> IF [0001: Key] - 1 Above
  <> IF [0001: Key] - 4 Below
     <> Variable Ch. [0002: Animation Frame] Set, 0
     <> Change Hero GFX: Hero, chara1-1
     <> Stop Parallel Process
     <>
  : END
  <>
:END
// ---------------------------------------------------------------
// Mudar gráfico do herói parado
<> IF [0002: Animation Frame] - 0
  <> Change Hero GFX: Hero, chara1-1
  <>
:END
<> IF [0002: Animation Frame] - 1
  <> Change Hero GFX: Hero, chara1-2
  <>
:END
<> IF [0002: Animation Frame] - 2
  <> Change Hero GFX: Hero, chara1-3
  <>
:END
// ---------------------------------------------------------------
// Mudar Frame da animação
<> IF [0002: Animation Frame] - 3 Above
  <> Variable Ch. [0002: Animation Frame] Set, 0
  <>
:ELSE
  <> Variable Ch. [0002: Animation Frame] Add, 1
  <>
:END
<> Wait: 0.1 sec
<>

Lembre-se que cada frame será o CharFrame do gráfico. É só adaptar o gráfico do seu charset, que nem eu fiz em um gráfico de um projeto onde atualmente estou mexendo:

No caso da imagem acima, é uma animação que eu separei em cada CharFrame.

Show de bola! Muito bom mesmo.
O que eu gostaria é de ter tempo pra editar meus sprites com todas as animações necessárias.

Dr. XGb, solução simples, porém elegante. Gostei.

Testei e funcionou que é uma beleza. Aliás curiosamente enquanto testava essa sua ideia descobri onde estava o erro na minha, é tão ridículo que chega a ser vergonhoso, eu retirava o heroi do grupo, adicionava o segundo heroi mas mudava os gráficos do primeiro, como ficava dentro do ciclo verificando a direção do heroi para mudar o gráfico da animação respectiva, ele acabava travando e obviamente não mudava os gráficos corretamente. =o

De qualquer maneira, exceto pela parte da edição de imagens nos charset que eu teria que fazer, a sua ficou bem mais simples, curta, prática e leve, se não se importar gostaria de usá-la (com os devidos créditos óbvio).

Valeu pela dica, espero contar com seu conhecimento em alguns outros problemas =p

Opa! Pode usar sim. Fico feliz que tenha conseguido resolver seu problema. Qualquer coisa estamos aí! o/