Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Maniarts en Mayo 27, 2011, 01:15:56 PM

Título: Verificar posicion del mouse en un cuadrante [SOLUCIONADO]
Publicado por: Maniarts en Mayo 27, 2011, 01:15:56 PM
Hay alguna forma de verificar la posicion de mouse en varios cualdrante mas optima o editable que esta?

Cuadrante A: x10,y10,x20,y20
Cuadrante B: x30,y10,x40,y20
[gml]if mouse_x>10 and mouse_y>10 and mouse_x<20 and mouse_y<20//DENTRO DEL CUADRANTE A

if mouse_x>30 and mouse_y>10 and mouse_x<40 and mouse_y<20//DENTRO DEL CUADRANTE B[/gml]

SOLUCION
Cita de: Wadk en Mayo 27, 2011, 08:33:30 PM
Yo crear?a un script.
Este deber?a funcionar siempre:
[gml]// point_in_rectangle(x, y, x1, y1, x2, y2);
var x, y, x1, y1, x2, y2;
x = argument0;
y = argument1;
x1 = argument2;
y1 = argument3;
x2 = argument4;
y2 = argument5;

if (x2 > x1) {
   x2 = x1 ^ x2;
   x1 = x1 ^ x2;
   x2 = x1 ^ x2;
}
if (y2 > y1) {
   y2 = y1 ^ y2;
   y1 = y1 ^ y2;
   y2 = y1 ^ y2;
}

return x > x1 && y > y1 && x < x2 && y < y2;[/gml]

Despu?s har?as:
[gml]if (point_in_rectangle(mouse_x, mouse_y, 10, 10, 20, 20)) {
   // Mouse en cuadrante A.
}

if (point_in_rectangle(mouse_x, mouse_y, 30, 10, 40, 20)) {
   // Mouse en cuadrante A.
}[/gml]
Título: Re: Verificar posicion del mouse en un cuadrante
Publicado por: Wadk en Mayo 27, 2011, 08:33:30 PM
Yo crear?a un script.
Este deber?a funcionar siempre:
[gml]// point_in_rectangle(x, y, x1, y1, x2, y2);
var x, y, x1, y1, x2, y2;
x = argument0;
y = argument1;
x1 = argument2;
y1 = argument3;
x2 = argument4;
y2 = argument5;

if (x2 > x1) {
    x2 = x1 ^ x2;
    x1 = x1 ^ x2;
    x2 = x1 ^ x2;
}
if (y2 > y1) {
    y2 = y1 ^ y2;
    y1 = y1 ^ y2;
    y2 = y1 ^ y2;
}

return x > x1 && y > y1 && x < x2 && y < y2;[/gml]

Despu?s har?as:
[gml]if (point_in_rectangle(mouse_x, mouse_y, 10, 10, 20, 20)) {
    // Mouse en cuadrante A.
}

if (point_in_rectangle(mouse_x, mouse_y, 30, 10, 40, 20)) {
    // Mouse en cuadrante A.
}[/gml]
Título: Re: Verificar posicion del mouse en un cuadrante
Publicado por: brunoxzx en Mayo 28, 2011, 01:03:56 AM
Tambi?n podr?as hacerlo as?.

[gml]return argument0 > min(argument2,argument4) && argument1 > min(argument3,argument5) && argument0 < max(argument2,argument4) && argument1 < max(argument3,argument5);[/gml]
Título: Re: Verificar posicion del mouse en un cuadrante
Publicado por: Wadk en Mayo 28, 2011, 01:18:00 AM
S?, es exactamente lo mismo. Yo quise hacerlo un poco m?s legible :P.
Título: Re: Verificar posicion del mouse en un cuadrante
Publicado por: brunoxzx en Mayo 28, 2011, 02:58:15 AM
Ciertamente es mucho mas legible tu script  XD, aunque me gustar?a preguntarte ?como se te ocurri? ese m?todo?, yo solo tengo experiencia usando game maker y la verdad no suelo usar ninguna operaci?n a nivel de bits, debido a que nunca se me ha ocurrido alg?n uso para ellas, de echo aveces me pregunto ?sera que cuando usas C# o C++ lo ?nico que usas son operaciones a nivel de bits?. Recordare este m?todo que me ahorrara crear una nueva variable en varios casos.

[gml]
//Yo lo har?a as?
var a;
a=x1
x1=x2
x2=a

//Y tu m?todo me parece mejor
x2 = x1 ^ x2;
x1 = x1 ^ x2;
x2 = x1 ^ x2;
[/gml]

Título: Re: Verificar posicion del mouse en un cuadrante
Publicado por: Wadk en Mayo 28, 2011, 06:32:52 AM
Por favor, no me hables de C# :(. No me gusta jaja.
En C/C++ no es que se trabaje siempre a nivel de bits, para nada, pero saber c?mo funcionan y aprovechar ese conocimiento ayuda mucho. Dos de las mayores ventajas de C y C++ son la velocidad y la ligereza de recursos. Es por eso que generalmente se usan para proyectos en los cuales cada bit de memoria ahorrado es importante, como sistemas operativos (e.g. Unix) o videojuegos en tres dimensiones que pongan mucha tensi?n a la tarjeta gr?fica (e.g. Overgrowth :P), etc. Como C y C++ son lenguajes de bajo nivel (se ejecutan a nivel de hardware, a diferencia del GML que es de alto nivel y se ejecuta a nivel de software), las operaciones de bits son rapid?simas, por eso se toma m?s provecho de ellas :).

Ese m?todo se me ocurri? hace tiempo, estudiando el cifrado xor (http://es.wikipedia.org/wiki/Cifrado_XOR).
Título: Re: Verificar posicion del mouse en un cuadrante
Publicado por: Maniarts en Mayo 28, 2011, 08:43:47 AM
ya solucione de otra forma mas estatica, pero estas que ustedes me presentan me parecen mas funcionables.

Solo tengo 2 preguntas:

que funcion hace este simbolo "^"?

porque repetir 2 veces "x2 = x1 ^ x2;"

[gml]//de esta manera no basta?
x2 = x1 ^ x2;
x1 = x1 ^ x2;[/gml]
Título: Re: Verificar posicion del mouse en un cuadrante
Publicado por: brunoxzx en Mayo 28, 2011, 07:51:09 PM
Uff eso no funcionaria, si quieres aprender el porque  XD tendras que averiguarlo tu mismo, o talvez wadk te diga como lo que pase primero, lo que significa este signo "^" es o exclusivo a nivel de bits o xor a nivel de bits, si quieres averiguar lo que es primero debes de checar esto http://es.wikipedia.org/wiki/Puerta_l%C3%B3gica (http://es.wikipedia.org/wiki/Puerta_l%C3%B3gica), despues esto http://www.elguille.info/net/dotnet/operar_con_bits.aspx (http://www.elguille.info/net/dotnet/operar_con_bits.aspx) y si quieres mas busca en google.

@Wadk: Gracia por la info y intentare no volver hablar de C# :P, a y no conoc?a ese cifrado gracias.
Título: Re: Verificar posicion del mouse en un cuadrante
Publicado por: Wadk en Mayo 28, 2011, 09:54:56 PM
@brunoxzx: De nada.

@Xiven Corp: Como bien dijo brunoxzx, el s?mbolo ^ es un xor, tambi?n llamado "o exclusivo", a nivel de bits. Seguramente ya conozcas las operaciones and y or:
0 and 0 = 0
0 and 1 = 0
1 and 0 = 0
1 and 1 = 1

0 or 0 = 0
0 or 1 = 1
1 or 0 = 1
1 or 1 = 1

La operaci?n xor es as?:
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0

En GM la operaci?n xor se usa con ^^ (and con && y or ||, aunque en esos casos tambi?n se puede poner simplemente and y or), pero haci?ndolo as? no se trabaja a nivel de bits:
0 ^^ 0 = 0
0 ^^ 1 = 1
-5 ^^ 2 = 1
-923 ^^ 42 = 1
El GM toma los n?meros positivos como true (1) y los negativos y el 0 como false (0).
Al usar ^ en vez de ^^, se trabaja a nivel de bits. Por ejemplo:
23 ^ 19 = ...
En vez del GM tomar el 23 y el 19 como 1, se convierten a binario, y se realiza la operaci?n con cada bit (d?gito):
    10111
xor 10011
    -----
    00100

Y el resultado se convierte a decimal:
23 ^ 19 = 4

La operaci?n xor tiene dos propiedades interesantes. Primero, el orden de los factores no altera el producto (igual que con and y or): 1 xor 0 es lo mismo que 0 xor 1. Y en segundo lugar, para cualquier n?mero natural "x" y cualquier n?mero natural "y":
x xor y xor y = x
x xor y xor x = y

Este c?digo:
[gml]x = x ^ y;
y = x ^ y;
x = x ^ y;[/gml]
aprovecha esas dos propiedades para dejar a "x" con el valor de "y" y a "y" con el valor de "x".
Por ejemplo, con los valores que us? antes:
[gml]x = 23;
y = 19;
x = x ^ y;  // Ahora x es 4.
y = x ^ y;  // Ahora y es 23 (4 xor 19).
x = x ^ y;  // Ahora x es 19 (4 xor 23).[/gml]
Est? claro que si sac?s cualquiera de las l?neas, aunque sea una repetida, el c?digo queda incopmleto y deja de funcionar :P.
Título: Re: Verificar posicion del mouse en un cuadrante
Publicado por: Maniarts en Mayo 30, 2011, 07:01:24 AM
Wadk: gracias por prestarme tu tiempo con esta extensa y clara explicaci?n para resolver mi duda! +1

brunoxzx: gracias por colaborar!
Título: Re: Verificar posicion del mouse en un cuadrante [SOLUCIONADO]
Publicado por: brunoxzx en Mayo 30, 2011, 07:40:09 AM
Por nada Xiven Corp, aun que en realidad esto tambi?n me sirvi? a mi, ya que Wadk me ense?o algo.

P.D: Ya no escriban mas creo que ya son suficientes respuestas.