Page 1 of 1

Obtener flags sin un if.

Posted: Wed Jun 24, 2015 11:15 am
by shao
Puede parecer una tontería pero hasta ahora, para setear la flags a un sprite, dependiendo de su X respecto a la X del personaje, hacía esto:

[Codebox=gemix file=Untitled.gemix]if(idPersonaje.x > x)//si la X del personaje es mayor a la del proceso
flags = 0;

else
flags = 1;

end[/Codebox]

También se podría hacer así y eliminar el else:

[Codebox=gemix file=Untitled.gemix]
flags = 0;

if(idPersonaje.x < x)//si la X del personaje es mayor a la del proceso
flags = 1;

end[/Codebox]

Pero aún se puede simplificar más, comprobando si podría eliminar eso con un XOR e probado algunas cosas hasta llegar a esto:

[Codebox=gemix file=Untitled.gemix]flags = x > idPersonaje.x;[/Codebox]

Funcionó, nunca había pensado en esa forma de utilizar > sin un if, la flags se pone en dirección al personaje cuando corresponde, y no necesitas un if/else para eso.

La flags valdrá 0 cuando la X del proceso sea menor que la del personaje (la comparación/condición, no estoy seguro de qué es exactamente aunque diría que es una condición, devolverá 0, falso) y 1 cuando la X del proceso sea mayor a la X del personaje (devolverá 1, verdadero).
Operador lógico [mayor que] utilizado en condiciones. Debe utilizarse entre dos expresiones numéricas y devuelve un resultado lógico:

Falso - Si la primera expresión NO es mayor que la segunda.

Cierto - Si la primera expresión SI es mayor que la segunda.
Esto te lleva a usarlo de otros modos, por ejemplo, quiero que si un proceso esta ascendiendo en un salto tenga el gráfico 36, y si desciende tenga el 37, entonces se podría usar así:

[Codebox=gemix file=Untitled.gemix]graph = 36 + (gravedad > 0);[/Codebox]

Hay que usar paréntesis ya que el operador + tiene mayor prioridad, si no se usaran paréntesis, entonces primero se sumaría "36 + gravedad" y luego se comprobaría si ese valor es mayor que 0.
El gráfico será 36 cuando la condición sea falsa (devolverá 0), osea, cuando este ascendiendo.
El gráfico será 37, resultado de sumarle 1 al ser la condición verdadera, cuando la gravedad sea mayor que 0 y este descendiendo.

Re: Obtener flags sin un if.

Posted: Wed Jun 24, 2015 12:44 pm
by CicTec
Pues es normal, se trata de una expresion (llamada propriamente expresion condicional) y puede ser utilizada en cualquier punto donde se permita una expresion.

Re: Obtener flags sin un if.

Posted: Wed Jun 24, 2015 1:40 pm
by shao
Ya pero no se me había ocurrido antes, si no, creo que siempre lo habría hecho así.

Re: Obtener flags sin un if.

Posted: Wed Jun 24, 2015 2:31 pm
by shao
Sobre este tema, ¿como puedo conseguir esto?.

[Codebox=gemix file=Untitled.gemix]flags = x > prota.idPersonaje.x;
aumX = 3 * ?¿?¿;[/Codebox]

Quiero que aumX valga -3 si flags vale 1.
Y que aumX valga 3 si flags vale 0.

Creo que tendría que utilizar xor para multiplicar 3 por -1 o por 1 pero no se como se le podría cambiar el signo a un número así.

¿Se puede hacer?, ¿como?.

Podría hacer esto:

if(flags == 0)
aumX = 3;

end

Pero me gustaría saber si es posible de ese otro modo.

Re: Obtener flags sin un if.

Posted: Wed Jun 24, 2015 5:31 pm
by CicTec
Con XOR no puedes, puedes usar el operador ternario si no quieres usar la sentencia IF:
[Codebox=gemix file=Untitled.gemix]
aumX = flags ? -3 : 3;
[/Codebox]

Re: Obtener flags sin un if.

Posted: Wed Jun 24, 2015 6:13 pm
by shao
Ok, es poco usual ese modo pero es más rapido de escribir.
Gracias.

Re: Obtener flags sin un if.

Posted: Wed Jun 24, 2015 6:34 pm
by CicTec
De verdad en C/C++/Java es mas usual esto en istrucciones de este tipo que no un IF.

De nada.

Re: Obtener flags sin un if.

Posted: Wed Jun 24, 2015 7:00 pm
by shao
Seguramente, como la mayoría de código que veo es Gemix, no estoy muy acostumbrado a verlo así.