[Dica] Expressões 2
| |
Thunderbert | Data: 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 ²
|
|
| |
FMit | Data: 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-K | Data: 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 !
|
|
| |
Phonix2000 | Data: 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.
|
|
| |
OIlusionista | Data: 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
|
|
| |
SonSon3000 | Data: 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*
|
|
| |
OIlusionista | Data: 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
|
|
| |
SonSon3000 | Data: 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*
|
|
| |
OIlusionista | Data: 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
|
|
| |
SonSon3000 | Data: 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*
|
|
| |
OIlusionista | Data: 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
|
|
| |
SonSon3000 | Data: 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*
|
|
| |
|