| Logado como Visitante | Grupo "Visitantes" Está vendo: Forum | Domingo, 02/06/2024, 12:42 PM | RSS |
Anime Mugen


[ Novas Mensagens · Membros · Regras · Buscar · RSS ]
  • Página 1 de 1
  • 1
Moderador do fórum: lMDl  
Encontrar distância real entre player e inimigo mais próximo
TidusData: Domingo, 16/01/2011, 12:13 PM | Mensagem # 1
Criador
Grupo: Administradores
Mensagens: 557
Awards: 0
Reputação: 25
Status: Offline
Yo pessoal!
Eu tava vendo uns codes de MUGEN muito locos ai na net e resolvir fazer um tb xD
Esse código serve para calcular a distância entre o player e o inimigo mais próximo!

Pergunta: Mas não é só usar P2Dist X ou P2BodyDist X?
Resposta: Primeiramente, isso calculária a distância X do player apenas com relação ao P2, e se for uma luta Coop?

Pergunta: Então, eu posso fazer assim (EnemyNear,Pos X) - Pos X?
Resposta: Com isso você irá calcular apenas a distância X!

Pergunta: Mas o que a Distância Real então?

Bom, eu vou tentar explicar mais ou menos como funciona.
Vamos supor que temos 2 players

E temos também suas distâncias X e Y

Mas essas distâncias nem sempre são a verdadeira distância entre um corpo e outro, pois a distância entre um corpo e outro é sempre uma linha reta!
Então a Verdadeira distância seria

Temos então um triângulo retângulo onde a hipotenusa é a distância real e os catetos são as distâncias X e Y!

Como diz o Teorema de Pitágoras:

Quote
Em qualquer triângulo retângulo, o quadrado do comprimento da hipotenusa é igual à soma dos quadrados dos comprimentos dos catetos.

Resumindo: Distância² = Dist X² + Dist Y²

Pergunta: E como vamos escrever isso no MUGEN?

Primeiramente, vamos armazenar a distância X e Y entre o Player e o inimigo mais próximo em variáveis:

Quote
[State -3, Distância X]
Type = VarSet
Trigger1 = 1
FV = 0
Value = ((EnemyNear,Pos X) - Pos X)

[State -3, Distância Y]
Type = VarSet
Trigger1 = 1
FV = 1
Value = ((EnemyNear,Pos Y) - Pos Y)


Pergunta: Mas por que você está usando "FV" ao invés de "V"?
Resposta: V = Var, FV = FVar, as Vars armazenam apenas valores INTEIROS, enquanto as FVars armazenam valores quebrados, com casas decimais, tornando nosso cálculo muito mais preciso!

Pergunta: Ok, nós armazenamos os valores nas variáveis! Fazer um número elevado ao quadrado é só multiplicar por ele mesmo, mas como vamos calcular a raiz quadrada no final?
Resposta: Já q o MUGEN em sí não possui uma ferramente para extração de raiz, usaremos o mesmo cálcua das calculadoras q existem por ai! Elas utilizam o Número de Euler e Logoratmo para extrair a raiz, chegando na seguinte fórmula:

Traduzindo: A raiz de um número é igual ao Número de Euler elevado a 0,5 vezes o logaritmo LN daquele número.

Para nossa felicidade, o MUGEN possui todas as ferramentas q precisamos parar fazer esses cálculos!
O Número de Euler é um trigger e é representado apenas pela letra "E", mas nós não queremos apenas o Número de Euler, nós queremos elevá-lo à alguma coisa, então, podemos usar o Trigger "Exp" q nada mais é do que o Número de Euler elevado a alguma coisa!

Pergunta: Como funciona o trigger "Exp"?
Resposta: Exp(valor), ou seja, é o número de Euler elevado à algum valor!

Pergunta:e o Logaritmo?
Resposta: O logaritmo é calculado no MUGEN com o trigger "Log", mas nós não queremos um logaritmo normal, nós queremos o logaritmo Ln que existe na fórmula, e felizmente o MUGEN possui o trigger "Ln".

Pergunta: E como fica o código para calcular a distância? Pq até agora a gente só armazenou a distância X e Y...

O código para calcular a distância vai ficar assim:

Quote
[State -3, Distância Real]
Type = VarSet
Trigger1 = 1
FV = 2
Value = Exp(0.5*Ln((FVar(0)*FVar(0))+(FVar(1)*FVar(1))))

Pergunta: Não entendi nada daqueles parênteses locos O___O
Resposta: O q acontece é que o MUGEN trabalha apenas com parênteses, mas se quisermos transformar em uma fórmula matemática no papel, ficaria assim:
Exp{0.5*Ln[(FVar(0)*FVar(0))+(FVar(1)*FVar(1))]}
Os cálculos q são realizados primeiro são os q estão dentro dos parênteses, seguidos pelos colchetes e, por fim, a chave, ou seja, a ordem do cálculo ficou:
1º Elevar as distâncias armazenadas ao quadrado
2º Somar os resultados do 1º resultado
3º Tirar o logaritmo do 2º resultado e multiplica-lo por 0,5
4º Elevar o Número de Euler ao 3º resultado

Pergunta: E como eu posso testar pra ver se esse cálculo deu certo?
Resposta: Você pode usar um DisplayToClipboard para escrever os valores das FVars no modo debug!

Quote
[State -3, Valores das FV's]
type = DisplayToClipboard
trigger1 = 1
text = "Dist X = %d || Dist Y = %d || Dist = %d"
params = FVar(0), Fvar(1), Fvar(2)


Se fizermos os cálculos:

Quote
163,452² = 140² + (-84,36)²
26716,556304 = 19600 + 7116,6096
26716,556304 = 26716,6096

Não deu EXATO, mas deu um valor bem aproximado! Pois o MUGEN arredonda algumas casas!
Se você fizer a raiz de 26716,6096, você vai ter o resultado: 163,45216303249...

Pergunta: UIA! Interessante, mas aonde é que eu posso aplicar esse código ai?? .-.
Resposta: Sinceramente, existem poucas apicações para esse código em sí, você pode usá-lo para calcular a distância ao invés de apenas usar a distância X, porque se você quiser fazer um golpe q só é possível se o inimigo estiver perto, normalmente vai usar o P2Dist X, mas e se o inimigo estiver perto mas estiver no ar? Então você pode usar esse código para calcular uma distância mais exata!

Pergunta: Hummm, mas você disse ali em cima "esse códig em sí", o que você quiz dizer com isso?
Resposta: Esse código pode ser melhorado se usarmos trigonometria para calcular os ângulos do triângulo, com isso, poderiamos usar o código em helpers para eles ficarem com o ângulo certinho quando estiver indo na direção do inimigo!

Pergunta: Você vai postar esse código com trigonometria?
Resposta: Não! Apesar de eu gostar muito de matemática, odeio trigonomeria xD

Bom, vou ficando por aqui, espero que esse tutorial seja útil para alguém xD
Flws!




Conhecimento é a única virtude e ignorância é o único vício.

Twitter - Follow Me
www.jgnetwork.com.br | JG Network - Desenvolvimento em Web.


 
-prData: Domingo, 16/01/2011, 12:51 PM | Mensagem # 2
Aprendiz Destaque
Grupo: Usuários
Mensagens: 107
Awards: 1
Reputação: 17
Status: Offline
cara** Tidus!! gostei de ver!
Misturando mugen com matemática, as duas linguagens que eu mais gosto XD

Parece que a electbyte já até previu esse código, colocando um trigger exato para calcular a exponenciação do número de Euler XD
mas eu acho que eles vacilaram... poderiam ter colocado algum trigger pra calcular a exponenciação de qualquer número, assim ao invés de usar essa fórmula complicada poderia simplesmente elevar o número a 0,5 (pra quem não sabe, a raiz de qualquer número é igual a esse número elevado a 0,5).

PS: o nome matemático disso na verdade é "distância z", então no Display poderia ficar "Dist x :: Dist y :: Dist z".



http://PRmugen.ucoz.com
 
TidusData: Domingo, 16/01/2011, 12:59 PM | Mensagem # 3
Criador
Grupo: Administradores
Mensagens: 557
Awards: 0
Reputação: 25
Status: Offline
Quote (Ninguém)
cara** Tidus!! gostei de ver!
Misturando mugen com matemática, as duas linguagens que eu mais gosto XD

Na verdade o mugen utiliza bastante matemática, Tanto é que triggers matemáticos podem ser utilizados no mesmo.




Conhecimento é a única virtude e ignorância é o único vício.

Twitter - Follow Me
www.jgnetwork.com.br | JG Network - Desenvolvimento em Web.


 
-prData: Quarta, 26/01/2011, 2:10 AM | Mensagem # 4
Aprendiz Destaque
Grupo: Usuários
Mensagens: 107
Awards: 1
Reputação: 17
Status: Offline
Gente, desculpe por estar ressucitando esse tópico.
E desculpas principalmente ao Thunderbert, porque eu descobri um jeito mais fácil de fazer isso que ele colocou no tutorial XD

fuçando enciclopédias de mugen eu descobri uma coisa (que pra mim é novidade) sobre expressões do mugen: o sinal ** significa exponenciação (as pessoas que já sabiam disso devem estar pensando "duuh")

Sendo assim:
2**2 = 2² = 4
3**3 = 3³ = 27
etc

outra curiosidade matemática: a raiz de todo número é igual àquele número elevado a 1/2.
Sendo assim:
√9 = 9**(1/2) = 3
√81 = 81**(1/2) = 9
etc

mas no que isso pode ajudar pra calcular a distância real do inimigo?

como o ThunderBert explicou no tutorial, existe uma fórmula pra essa distância, que é o teorema de pitágoras:

Quote
z² = x² + y²

onde:
z = distância real;
x = distância horizontal;
y = distância vertical.

desenvolvendo mais a fórmula, podemos isolar o termo z, na seguinte fórmula:

Quote
z = √(x² + y²)

agora substituindo pela linguagem do mugen que eu citei previamente, podemos calcular a distância z da seguinte forma no mugen:

Quote
z = ((p2dist x)**2 + (p2dist y)**2)**(1/2)

Um código bem mais simples e mais prático, sem muitas vars e números de Euler XD



http://PRmugen.ucoz.com
 
truerockleeData: Quarta, 26/01/2011, 4:24 AM | Mensagem # 5
Editor
Grupo: Usuários
Mensagens: 173
Awards: 0
Reputação: 14
Status: Offline
Ninguém, você me assustou com isso. Eu fritei uns neurônios e entendi isso aí, realmente, mais simples. Mas ainda assim pra mim isso é um saco xD
Matemática me mata .____.
Só gosto de matemática financeira x)
Anyway, vlw pela contribuição tb man, isso deve ajudar um bocado de gnt (ou deveria pelo menos g_g)

Ciao ciao '-'


Se pá, foda-se tudo :]
Ñ gostou? Chupa, é de uva ._.
 
ThunderbertData: Quarta, 26/01/2011, 7:55 AM | Mensagem # 6
Criador Iniciante
Grupo: Usuários
Mensagens: 343
Awards: 0
Reputação: 19
Status: Offline
NUSS PR!
Realmente assim ficou muito mais fácil O_O
E naum precisa pedir desculpas ^^
Simplificar é sem bom *_*




Vlw MD ²
Vlw Baka-Sennin
Vlw FM ²
 
carlos8080Data: Quinta, 27/01/2011, 9:28 PM | Mensagem # 7
Criador
Grupo: Usuários
Mensagens: 480
Awards: 0
Reputação: 11
Status: Offline
lol parece bem dificil =/
mais foi legal vc te postado aqui ^^
flws



------------------------------------Projetos---------------------------------------

C_Itachi - 30%

Hidan Sheet - 5%
 
  • Página 1 de 1
  • 1
Buscar:

Copyright Anime Mugen © 2024 Hospedado por uCoz
Refresh Smileys Manager
Mini-chat