| Logado como Visitante | Grupo "Visitantes" Está vendo: Forum | Sábado, 21/12/2024, 7:36 AM | RSS |
Anime Mugen


[ Novas Mensagens · Membros · Regras · Buscar · RSS ]
  • Página 1 de 1
  • 1
Moderador do fórum: lMDl  
[Dica] Expressões 2
ThunderbertData: Terça, 29/03/2011, 11:55 AM | Mensagem # 1
Criador Iniciante
Grupo: Usuários
Mensagens: 343
Awards: 0
Reputação: 19
Status: Offline
YO pessoal!
Hoje vim aqui falar um pouco mais sobre expressões!
Vou começar falando sobre os valores assumidos pelos triggers!
Os triggers podem assumir dois valores diferentes!
O primeiro é o valor boleano, também conhecido como verdadeiro ou falso, onde verdadeiro é 1 e falso é 0
Esse primeiro valor vem quando você compara o trigger com alguma coisa!
Por exemplo:
Trigger1 = Time = 48
Quando Time for 48, o valor do Trigger vai ser 1 e ele vai se ativar!
Do contrário, o valor do Trigger será 0 e ele não vai se ativar!
O segundo valor é o valor do Trigger em sí, ele vem quando você não compara ele com algo, mas sim, usa ele como parte do cálculo!
Por exemplo:
Trigger1 = Time
Nesse caso, o Trigger vai valer exatamente o tempo, ou seja, quando Time for 30, o valor por ele assumido será 30!
Então, nesse caso, o Trigger somente não irá ser ativado quando Time for 0...

Mas algo que muitas pessoas não sabem, é q é possível usar o valor do trigger em cálculos fora do Trigger!
Por exemplo, suponhamos q eu quero girar o char ou um helper de acordo com o tempo:

Code
[State X, AngleDraw]
Type = AngleDraw
Trigger1 = 1
Value = 5*Time

Nesse caso, o ângulo será 5 vezes o Time, então, quando Time for 10, o ângulo será 50!

Agora, algo que menos pessoas ainda sabem, é q é possível usar também o valor boleano nos cálculos, afinal, eles valem 1 e 0!

Então, podemos fazer algo do tipo:

Code
[State X, ChangeState]
Type = ChangeState
Trigger1 = AnimTime = 0
Value = 205+(Command = "holdfwd")
Ctrl = 0

Nesse caso, se o player não estiver apertando o comando "holdfwd", o char vai para o state 205, se estiver segurando, vai pro 206!

Enfim, é possível combinar ambos os valores em cálculos mais elaborados ^^

Agora, quero falar sobre algo que pouquíssima gente conhece!
A maioria aqui sabe dos operadores lógicos básicos do MUGEN que são &&, ||, ^^ e !
Esses os 4 operadores lógicos básicos mesmo.
Mas agora que eu to fazendo faculdade, aprendi que existem mais dois valores lógicos!
Eles são chamados de Condicional (→) e Bicondicional (↔)
Nenhum dos dois existem especificamente no MUGEN, mas é possível usá-los no MUGEN e logo vou dizer como.
A condicional é algo do tipo "se então"
Se alguma coisa, então isso
Partindo para o que interessa para o MUGEN, a condicional analisaria duas expressões e resultaria em valor falso apenas quando a primeira expressão for falsa e a segunda verdadeira!
Por exemplo, se existisse esse operador no MUGEN, seria algo do tipo:
Trigger1 = Time = 48 → Command = "holdfwd"
Então, o trigger estaria sempre ativado a menos que o Time não seja 48 e o commando "holdfwd" esteja sendo apertado
Lembrando q esse símbolo → não existe no MUGEN, só estou explicando a teoria dessas operações lógicas!

A bicondicional é algo do tipo "se e somente se"
Alguma coisa se e somente se isso
Partindo para o que interessa para o MUGEN, a bicondicional analisaria duas expressões e resultaria em valor falso caso uma das expressões seja verdadeira e outra falsa, não importando a ordem!
Por exemplo, se existisse esse operador no MUGEN, seria algo do tipo:
Trigger1 = Time = 48 ↔ Command = "holdfwd"
Então, o trigger estará ativado enquando o Time não for 48 e o commando "holdfwd" não estiver sendo apertado ou quando as duas condições forem verdadeiras!
Lembrando q esse símbolo ↔ não existe no MUGEN, só estou explicando a teoria dessas operações lógicas!

Agora vamos partir para o que realmente interessa!
Como utilizar a Condicional e Bicondicional no MUGEN?
Eu vou pular os cálculos e teorias e passar para vocês apenas a fórmula pronta ^^
Condicional:
p → q = !p || q
Exemplo:
Time = 48 → Command = "holdfwd" seria a mesma coisa que Time != 48 || Command = "holdfwd"

Bicondicional:
p ↔ q = (p || q) && (q || p)
Exemplo
Time = 48 ↔ Command = "holdfwd" seria a mesma coisa que (Time != 48 || Command = "holdfwd") && (Command != "holdfwd" || Time = 48)

Parece meio confuso, mas é algo que pode vir a ser útil ^^
Espero que essas informações lhe sejam úteis!

Flws!

Edit:
Só pra avisar que a fórmula da Bicondicional tava errada xD
Mas já arrumei!
Abrax ^^




Vlw MD ²
Vlw Baka-Sennin
Vlw FM ²
 
FMitData: Terça, 29/03/2011, 12:11 PM | Mensagem # 2
Criador
Grupo: Usuários
Mensagens: 706
Awards: 3
Reputação: 18
Status: Offline
eu tinha razão, você é um monstro :l
depois do primeiro code eu nunca tinha visto nada do tipo D:
fico muito bem explicado, e fico foda também, gostei cara, parabéns...
você sempre se superando ^^'


 
Roobin-KData: Terça, 29/03/2011, 2:33 PM | Mensagem # 3
Iniciante
Grupo: Usuários
Mensagens: 18
Awards: 0
Reputação: 2
Status: Offline
Bem interessante, dá uma olhada nos DOCS acho q ja vi algo sobre Bicondição por lá.
No mais méritos pra você, me ajudou bastante quando eu tava começando a programar e ta ajudando outros ainda, otimo professor e me ensinou algo que na minha opinião é essencial um bom programar saber, LÓGICA ! bomUp


 
Phonix2000Data: Terça, 29/03/2011, 7:39 PM | Mensagem # 4
Criador Iniciante
Grupo: Usuários
Mensagens: 323
Awards: 2
Reputação: 12
Status: Offline
legal e fácil, nada complicado, eu uso condicional sem saber :P

outra coisa, o "meio" do tutorial fico muito junto e enrolado e usar emoticon ( ^^ ) nesse tutorial não ajuda muito,
pois existe um comando semelhante e pode confundir leigos.



 
OIlusionistaData: Sexta, 22/04/2011, 7:23 PM | Mensagem # 5
Editor
Grupo: Usuários
Mensagens: 180
Awards: 0
Reputação: 7
Status: Offline
posso fazer um comentário?

Repare na linha em bold.

Quote
[State X, ChangeState]
Type = ChangeState
Trigger1 = AnimTime = 0
Value = 205+(Command = "holdfwd")
Ctrl = 0

É melhor utilizar esse trigger como:

Quote
trigger1 = !AnimTime

Basicamente, quer dizer a mesma coisa (o ! é um símbolo de negação): quando o tempo da animação (AnimTime) for zero.
A diferença é que utilizando como !AnimTime torna esse trigger booleano ao passo que AnimTime = 0 é do tipo string.

Pode parecer besteira, mas não é:

Um trigger booleano funciona checando se algo é verdadedeiro(true) ou falso(false). Valores diferente de 0 são TRUE, ao passo que o valor zero é FALSE.
Então, no nosso caso, ele checa se é falso e "triga" (aciona) o código em questão.

Mas pq é melhor usar booleano?

Pq triggers booleanos são mais rápidos do que do tipo string e são executados primeiro.

Comparando ambos, percebemos o pq:

Trigger1 = AnimTime = 0

Quer dizer: Cheque o Tempo da Animação (digamos "n") e veja se "n" for igual a 0, então execute.

Trigger1 = !AnimTime

Quer dizer: Cheque se o Tempo de Animação é falso.

trigger (gatilho) Booleano é mais rápido pq apenas checa se é falso ou verdadeiro, pra ele tanto faz o valor se for verdadeiro. Se for 1, ou se for 81768237126837123, será verdadeiro do mesmo jeito. Se não, é falso.

Ao passo que trigger por string :

tem que checar o valor do que vc pede,
armazenar o valor,
comparar se o valor armazenado é igual (já que estamos usando "=") ao valor que passamos.

Isso não vale só para Mugen, vale par toda linguagem de programação que trabalhar com booleano.

Espero ter ajudado.


Beeing here since 1999
 
SonSon3000Data: Sexta, 22/04/2011, 7:27 PM | Mensagem # 6
Aprendiz Destaque
Grupo: Mugen News
Mensagens: 100
Awards: 0
Reputação: 4
Status: Offline
hey ilu, então:
trigger1 = !(StateNo = [5000,5999])

seria executado mais rápido que:
trigger1 = StateNo != [5000,5999]

???

eu sempre levei em conta isso, pq além de deixar mais rápida a execução de leitura, tbm fica mais "exótico" e bonito o código =).


Visitem o meu cantinho do mugen: SonSon3000 - NEWS

*Projetos, Lançamentos, Tutoriais, News e outros*
 
OIlusionistaData: Sexta, 22/04/2011, 7:37 PM | Mensagem # 7
Editor
Grupo: Usuários
Mensagens: 180
Awards: 0
Reputação: 7
Status: Offline
Então, vc precisa tomar cuidado com isso:

1- O mais rápido estamos falando em linguagem de máquina. Entao o tempo é muito rápido, não será coisa que vc conseguirá ver. Mas ajuda o processamento.

2- Precisa tomar cuidado com malformação de triggers. Seu trigger:

Quote
trigger1 = !(StateNo = [5000,5999])

Funciona. Mas se vc utilizar isso num helper:

trigger1 = root,!(StateNo = [5000,5999])

Não funciona, pois está mal formado.

O certo seria:

trigger1 = !(root,StateNo = [5000,5999])

pq aí eu nego tudo que está dentro do parenteses.

3- O Mugen tem um bug bobo no controle de triggers booleanos.
Se vc usar:

Quote
trigger1 = !Ctrl && Time = [0,40]

Ele acusa erro, pois vc está checando um valor booleano e um intervalo (no time) na mesma linha.
Mas se vc fizer isso:

Code
trigger1 = !ctrl
trigger1 = Time =[0,40]

Funciona. E quer dizer a mesma coisa*

*vou fazer um post em breve sobre isso.


Beeing here since 1999
 
SonSon3000Data: Sexta, 22/04/2011, 8:22 PM | Mensagem # 8
Aprendiz Destaque
Grupo: Mugen News
Mensagens: 100
Awards: 0
Reputação: 4
Status: Offline
sim, ele tem esse erro tbm por causa dos valores de intervalo
tipo: time = [0,10]
ou: time [0,10)
etc

dae se tu botar ele junto com outro argumento unidos por && (e), dá esse erro :)
dai pra concertar, usasse os parenteses para deixar de forma booleana \o/

e sim, sobre helper eu ja sabia disso, mas é ótimo vc dizer isso, daí quem ler esse tópico não comete esses errinhos básicos né?? =D

ah, imagina quando tu quer dizer que a var(0) é igual a 5, em booleano??
trigger1 = (var(0)=5)

ou:
trigger1 = !(var(0)!=5)

HUEHUEHHE


Visitem o meu cantinho do mugen: SonSon3000 - NEWS

*Projetos, Lançamentos, Tutoriais, News e outros*
 
OIlusionistaData: Sexta, 22/04/2011, 10:54 PM | Mensagem # 9
Editor
Grupo: Usuários
Mensagens: 180
Awards: 0
Reputação: 7
Status: Offline
Code
dae se tu botar ele junto com outro argumento unidos por && (e), dá esse erro :)  
dai pra concertar, usasse os parenteses para deixar de forma booleana \o/

Na verdade, basta vc usar duas linhas como trigger1 que funciona :) Estranho, não?

Code
trigger1 = !(var(0)!=5)

Nao testei, mas nao deve funcionar, pq vc ta usando uma logica recurssiva (ou eliptica).
Veja:

Var(0)!=5 : a var 5 tem qualquer valor que não seja 5.

!(var(0)) está negando a var(0).

Ou seja: vc está negando que a var(0) seja diferente de 5....entao ela é 5 :)


Beeing here since 1999
 
SonSon3000Data: Sexta, 22/04/2011, 11:44 PM | Mensagem # 10
Aprendiz Destaque
Grupo: Mugen News
Mensagens: 100
Awards: 0
Reputação: 4
Status: Offline
Quote (OIlusionista)
Na verdade, basta vc usar duas linhas como trigger1 que funciona :) Estranho, não?

é, bem estranho =p
uma coisa que poderia ser simples.
mas se for tipo:
trigger1 = (time = [0,10]) && p2movetype != L
tbm funciona :)

Quote (OIlusionista)
Ou seja: vc está negando que a var(0) seja diferente de 5....entao ela é 5 :)

sim, essa foi a intenção =p
acho q daria certo sim, mas não sei se levaria mais tempo ou menos, para o mugen processar essa informação :)


Visitem o meu cantinho do mugen: SonSon3000 - NEWS

*Projetos, Lançamentos, Tutoriais, News e outros*
 
OIlusionistaData: Sábado, 23/04/2011, 0:08 AM | Mensagem # 11
Editor
Grupo: Usuários
Mensagens: 180
Awards: 0
Reputação: 7
Status: Offline
vou fazer um post em breve sobre otmização. Vc verá que nem sempre "codigos exoticos" quer dizer um bom código.

Beeing here since 1999
 
SonSon3000Data: Sábado, 23/04/2011, 0:45 AM | Mensagem # 12
Aprendiz Destaque
Grupo: Mugen News
Mensagens: 100
Awards: 0
Reputação: 4
Status: Offline
hehe
vai ser de grande valia.
=D


Visitem o meu cantinho do mugen: SonSon3000 - NEWS

*Projetos, Lançamentos, Tutoriais, News e outros*
 
  • Página 1 de 1
  • 1
Buscar:

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