Hola amigos, tengo un problema con mi juego "Super Hanoi". El usuario debe colocar unos discos sobre de otros. Todo iba bien hasta que cambie la velocidad de los discos.

Cuando cambio por ejemplo
[gml]disco1.vspeed = 10;[/gml] a otro n?mero, la colision ocurre como a 20 p?xeles de distancia de manera que los discos ya no hacen contacto, quedan separados y no entiendo qu? ocurre.

* Los steps del room los tengo a 30, ya intent? modificando esto y nada
* Snap X est? en 7, Snap Y est? en 10, ya modifiqu? y nada.
* Ya intent? usando "Precise collision cheking" en los sprites y nada.
* Tama?o del room: Width: 639, Heihgt 477. Prob? cambiando esto y nada.
* Los Sprites son archivos png pero ya intent? otro formato y nada.

Vean la imagen adjunta, el disco2 deber?a hacer contacto con el disco3. Esto sucede cuando disco1.vspeed = 10; pero con una velocidad diferente, sea cual sea la colisi?n es totalmente imperfecta.

* Tama?o de los discos: disco1 57x20, disco2 70x20, disco3 84x20. Como podr?n ver la altura es la misma en todos los discos, ya intent? cambiando esto y no consigo que funcione, los discos quedan muy separados los unos de los otros y no entiendo por qu?!!!

?Alguien tiene alguna idea de qu? puedo estar haciendo m?l? Se lo voy a agradecer mucho. 
:-[

Lo que ocurre es que el GM calcula las colisiones justo antes de que ocurran, y luego las impide, de manera que si en el step actual la instancia va a entrar en colisi?n, el GM coloca la instancia justo en la posici?n previa y ejecuta el evento colisi?n. Para solucionarlo debes usar el evento colisi?n para colocar el objeto en la posici?n que quieres y prevenir que se produzcan mas colisiones.

Ya que no haz puesto como estas manejando el evento colisi?n, no puedo darte un c?digo espec?fico, pero b?sicamente lo que tienes que hacer es cambiar vspeed a 0 y mover la instancia al lado de la otra manualmente.

Gracias Killer. Tengo 8 objetos que son los 8 discos. Pero en estos objetos no utilizo c?digo gml, tan solo agrego eventos collision, para con los otros discos como puedes ver en la figura.

Todo el c?digo lo tengo en el evento steep de otro objeto, un objeto s?lido que no se mueve.

En el siguiente trozo de c?digo, lo que hago es desaparecer la instancia del disco1 y aparecerla en otro lugar, y que inmediatamente se mueva hacia abajo, pero deber?a detenerse al colisionar con el disco que est? m?s abajo y s? se detiene pero se detiene muy antes, es decir, no hace contacto con el objeto como ves en la figura de mi mensaje anterior.


[gml]if mouse_button {with (disco1) instance_destroy(); instance_create(84,140,disco1); disco1.vspeed = 10;[/gml]

Si no encuentro una soluci?n pr?ctica creo que voy a tener que mover la instancia manualmente como me dijiste.

Gracias!

Puedes agregar Move to contact position en los eventos colisi?n justo despues de detener el movimiento, con eso deber?a bastar.



Por cierto, podr?as ponerle un padre a los objetos para usar un solo evento colisi?n para todos los discos.

No funcion? eso tampoco Killer.
Lo que hice fu? duplicar los steps del room a 60, mi m?quina es lenta y hacer esto no present? ningun problema, al contrario ahora los discos se mueven un poco mas r?pido (pense que iba a ser al revez) y adem?s el movimiento se v? mucho m?s fino.


CitarPor cierto, podr?as ponerle un padre a los objetos para usar un solo evento colisi?n para todos los discos.

No lo sab?a, lo voy a hacer.
?Gracias!