Obtener flags sin un if.

Discusión en general sobre Gemix.
Post Reply
User avatar
shao
Posts: 6048
Joined: Wed Jun 17, 2009 4:51 pm

Obtener flags sin un if.

Post 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.
User avatar
CicTec
Posts: 16590
Joined: Thu Jul 31, 2008 10:18 pm

Re: Obtener flags sin un if.

Post 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.
User avatar
shao
Posts: 6048
Joined: Wed Jun 17, 2009 4:51 pm

Re: Obtener flags sin un if.

Post by shao »

Ya pero no se me había ocurrido antes, si no, creo que siempre lo habría hecho así.
User avatar
shao
Posts: 6048
Joined: Wed Jun 17, 2009 4:51 pm

Re: Obtener flags sin un if.

Post 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.
User avatar
CicTec
Posts: 16590
Joined: Thu Jul 31, 2008 10:18 pm

Re: Obtener flags sin un if.

Post 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]
User avatar
shao
Posts: 6048
Joined: Wed Jun 17, 2009 4:51 pm

Re: Obtener flags sin un if.

Post by shao »

Ok, es poco usual ese modo pero es más rapido de escribir.
Gracias.
User avatar
CicTec
Posts: 16590
Joined: Thu Jul 31, 2008 10:18 pm

Re: Obtener flags sin un if.

Post by CicTec »

De verdad en C/C++/Java es mas usual esto en istrucciones de este tipo que no un IF.

De nada.
User avatar
shao
Posts: 6048
Joined: Wed Jun 17, 2009 4:51 pm

Re: Obtener flags sin un if.

Post by shao »

Seguramente, como la mayoría de código que veo es Gemix, no estoy muy acostumbrado a verlo así.
Post Reply

Return to “General”