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]
SOLUCIONCita 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]
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.
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 (http://es.wikipedia.org/wiki/Cifrado_XOR).
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 (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.
@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.
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.