Quarta-feira, 26/04/2017, 7:53 AM
Bem vindo Visitante | RSS
Menu
Chat
Globo de Vísitas
Estatísticas
Total Online: 1
Visitantes: 1
Usuários: 0
Login
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:

Code
x-x₀ = V₀t + ½at


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:

Code
x-x₀ = V₀t

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:

Code
[Statedef -2]

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:

Code
x-x₀ = V₀t

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:

Code
V₀t = x-x₀

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:
Code
V₀ = (x-x₀)/t

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)
Pesquisar
Hospedagem
Deseja ter seu trabalho hospedado aqui?
Clique aqui.
Calendário
«  Abril 2017  »
STQQSSD
     12
3456789
10111213141516
17181920212223
24252627282930
Link Us
Clique na imagem para ver o código.
Thunder Mugen
Thunder Mugen
Parceiros

Valeuzão Deus
Mugen Full
Kazushi
Lab's Mugen

Copyright MyCorp © 2017Thunderbert