Mayo 27, 2011, 01:15:56 PM Ultima modificación: Mayo 30, 2011, 07:15:46 AM por Xiven Corp
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]

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]
Vim.

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]

S?, es exactamente lo mismo. Yo quise hacerlo un poco m?s legible :P.
Vim.

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]


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.
Vim.

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]

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, despues esto 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.

@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.
Vim.

Wadk: gracias por prestarme tu tiempo con esta extensa y clara explicaci?n para resolver mi duda! +1

brunoxzx: gracias por colaborar!

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.