Esse tutorial irá ensinar a usar um pouco da física no MUGEN! Yo pessoal, hoje vim falar sobre alcance horizontal de um movimento que possui uma trajetória em forma de parábola!
Primeiramente, vamos falar pra que serve isso, para que vocês não
precisem ler o tutorial inteiro para só depois descobrir para que serve
xD
Bom, o que esse tutorial faz é descobrir a velocidade
horizontal com a qual um helper ou o char vai até o alvo tendo uma
velocidade vertical inicial e com gravidade constante.
Veja o exemplo nas imagens:
Ou seja, a velocidade horizontal do meu helper está mudando de
acordo com a distância entre mim e o P2, de forma que ele vai chegar na
posição onde o P2 está quando o helper atingir a altura da qual ele se
iniciou!
Por exemplo, esse helper aparece na posição vertical -70, a
posição diminui por causa da velocidade vertical inicial e depois
aumenta por causa da gravidade.
Quando a altura do helper chegar
novamente em -70, ele vai estar na posição em que o P2 estava no momento
do lançamento do helper.
Agora vamos aprender a fazer isso:
Primeiramente, vamos considerar a trajetória parabólica de um objeto onde a atmosfera não interfere (ou seja, não há atrito):
A equação que define o movimento horizontal é a seguinte:
Onde "x-x₀" é a distância entre o objeto (char ou helper) e o P2, "V₀" é
a velocidade inicial, "a" é a aceleração e "t" é o tempo.
Como a atmosfera não está interferindo, a aceleração é 0, assim, a parte "½at" é zerada, restando:
Agora, precisamos obter os valores para preencher essa equação!
Para obtermos a distância é muito simples, basta usar o trigger "P2Dist X"
Mas nós precisamos encontrar dois outros valores, são eles:
Tempo que o objeto demora para voltar a posição vertical de início;
Velocidade inicial do objeto. Como nós estamos variando a velocidade, então temos que encontrar o tempo!
Para isso, primeiro vamos começar a bolar o state, vou estar usando o que eu fiz como exemplo:
Code
[Statedef 6201]
Type = A
MoveType = A
Physics = N ;<- Atmosfera não interfere em nada
Anim = 6200
Ctrl = 0
SprPriority = 9
[State 6201, VelSet]
Type = VelSet
Trigger1 = !Time
X = 0 ;<-- Essa velocidade encontraremos depois
Y = -6 ;<-- Velocidade vertical será sempre a mesma e é ela que determina o tempo
[State 6201, VelAdd]
Type = VelAdd
Trigger1 = 1
Y = Const(Movement.YAccel) ;<-- Aplica a gravidade
[State 6201, ChangeState]
Type = ChangeState ;<-- ChangeState da forma que você quer
Trigger1 = MoveContact
Trigger2 = Pos Y >= 0
Value = 6202
Ctrl = 0
Pronto, montei o básico do state, agora, precisamos descobrir o tempo que o objeto leva para voltar a posição de início!
Para fazermos isso, precisaremos de uma variável que irá armazenar o
valor do tempo e iremos modificar o changestate para mudar de state
quando o objeto voltar a posição y de origem!
Então iremos acrescentar o seguinte VarSet no state:
Code
[State 6201, VarSet]
Type = VarSet ;<- Caso você esteja fazendo isso em um helper, use ParentVarSet ao invés de VarSet
Trigger1 = 1
V = 23 ;<- Variável que você deseja usar
Value = Time ;<- Estamos armazenando o tempo
Agora, vou modificar meu ChangeState:
Code
[State 6201, ChangeState]
Type = ChangeState
Trigger1 = Pos Y >= -70 ;<- Posição Y inicial
Trigger1 = Time ;<- Garante que o helper não mude de state assim que lançado
Value = 6202
Ctrl = 0
O code inteiro agora ficou:
Code
[Statedef 6201]
Type = A
MoveType = A
Physics = N
Anim = 6200
Ctrl = 0
SprPriority = 9
[State 6201, VelSet]
Type = VelSet
Trigger1 = !Time
X = 0
Y = -6
[State 6201, VelAdd]
Type = VelAdd
Trigger1 = 1
Y = Const(Movement.YAccel)
[State 6201, VarSet]
Type = VarSet
Trigger1 = 1
V = 23
Value = Time
[State 6201, ChangeState]
Type = ChangeState
Trigger1 = Pos Y >= -70
Trigger1 = Time
Value = 6202
Ctrl = 0
Pronto, agora que temos a variável armazenando o tempo, precisamos mostrar o tempo!
Para isso, usamos um DisplayToClipboard no statedef -2, caso você não tenha o statedef -2, basta criá-lo com a seguinte linha:
O DisplayToClipboard vai ficar assim:
Code
[State -2, DisplayToClipboard]
Type = DisplayToClipboard
Trigger1 = 1
Text = "Tempo = %d"
Params = Var(23) ;<- Variável utilizada pelo objeto
Após isso, salve e teste o char...
Com o MUGEN aberto, aperte ctrl+d para entrar no modo debug e veja o valor do Tempo e anote-o
Com o tempo em mãos, podemos apagar o DisplayToClipboard, o VarSet e retornar o ChangeState ao original, retornando ao código:
Code
[Statedef 6201]
Type = A
MoveType = A
Physics = N
Anim = 6200
Ctrl = 0
SprPriority = 9
[State 6201, VelSet]
Type = VelSet
Trigger1 = !Time
X = 0
Y = -6
[State 6201, VelAdd]
Type = VelAdd
Trigger1 = 1
Y = Const(Movement.YAccel)
[State 6201, ChangeState]
Type = ChangeState
Trigger1 = MoveContact
Trigger2 = Pos Y >= 0
Value = 6202
Ctrl = 0
Agora que temos o tempo em mãos, vamos voltar para a fórmula:
Agora nós temos a distância e o tempo, para calcular a velocidade teremos que mexer na fórmula!
Primeiramente, trocamos os membros da equação de lado:
Agora, como o tempo está multiplicando a velocidade inicial, passaremos ele para o outro lado, mas dividindo:
Agora, como o tempo está multiplicando a velocidade inicial, passaremos ele para o outro lado, mas dividindo:
Pronto, temos agora a fórmula que acha a velocidade, temos a distância e temos o tempo!
Basta então mexermos no VelSet!
Lembrando:
"x-x₀" = P2Dist X
"t" = Tempo encontrado (no meu caso, 27)
O code vai ficar:
Code
[Statedef 6201]
Type = A
MoveType = A
Physics = N
Anim = 6200
Ctrl = 0
SprPriority = 9
[State 6201, VelSet]
Type = VelSet
Trigger1 = !Time
X = (P2Dist X)/27.0 ;<- Velocidade inicial
Y = -6
[State 6201, VelAdd]
Type = VelAdd
Trigger1 = 1
Y = Const(Movement.YAccel)
[State 6201, ChangeState]
Type = ChangeState
Trigger1 = MoveContact
Trigger2 = Pos Y >= 0
Value = 6202
Ctrl = 0
Pronto!
Agora é só testar, ver o resultado e acrescentar o que quizer no code,
como HitDef, AfterImage ou seja lá o que vc precisa colocar xD!
Lembrando que, caso você deseje alterar a velocidade Y ou a gravidade, terá que calcular o tempo de novo xD
Espero que esse tutorial ajude o pessoal ai ^^
Créditos:
Professor Aldo Job (meu professor de física da faculdade xD)
Gnuplot (programa para desenhar gráficos)
GIMP (editor de imagens)