Hola, tengo un problemilla que de momento no sé solucionar.
Tengo un objeto que sale volando bastante alto, al que le afecta la gravedad, y al caer va muy deprisa y traspasa el suelo por unos instantes (ya que en step le pongo que si Y es > que 600 por ejemplo, y=600).
Pero claro, al hacer eso, se ve como el objeto traspasa el suelo y luego vuelve a ponerse a ras del suelo.
¿Cómo se podría solucionar?
Gracias!
Tu problema puede deberse a varios factores pero, conociendo un poco el funcionamiento de Game Maker, apostaría que es por la comprobación.
Si tu le indicas a tu objeto avanzar y, seguidamente, compruebas si es mayor o igual, es obvio que traspasará el suelo pues, antes de comprobarlo, le indicaste que se mueva, esté o no chocando.
Creo que una forma sencilla de solucionarlo es creando un evento de colisión donde le indicas que, en caso de que chocase contra otro objeto, pare.
Ya que tu, según entiendo, lo estás haciendo según coordenadas directamente (ya sea porque no hay un objeto en el suelo con el que colisionar o porque no quieres usar el evento colisión que, por cierto, hace lo mismo que intentas hacer "a mano"), lo que deberías hacer es un cálculo de distancias antes del movimiento. Te explico.
- Antes de mover el objeto, comprueba que esté a una distancia mayor o igual a X de la coordenada que no deba traspasar. Por ejemplo, si se mueve 10px en cada step (X = 10), comprueba que la distancia desde la base del objeto hasta la coordenada sea mínimo 10px. En caso de ser menos, se moverá solamente los pixeles que lo separan del suelo.
- En caso de que la comprobación anterior (distancia del objeto hasta el suelo es mayor o igual que la X que representa su movimiento) sea verdadera, le indicarás que se mueva 10px.
Concluyendo, lo que se hace es una excepción de que, en caso de que la distancia sea menor al módulo de velocidad, solamente se mueva lo que le quede.
algo tambien es limitar la vspeed usando una comprobacion.
if (vspeed > 16) {vspeed=16;}
Cita de: elviskelley en Junio 01, 2014, 04:17:17 PM
algo tambien es limitar la vspeed usando una comprobacion.
if (vspeed > 16) {vspeed=16;}
Aun así seguirá traspasando el objeto, pues no es por la velocidad, es por el orden de las comprobaciones.
Gracias por las respuestas :)
El tema es, hay un suelo y un objeto (vista lateral)
Al objeto le doy un ángulo y un speed, luego dejo que la gravedad haga su trabajo. Así que la solución que me has dado, Alex, no me sirve (o no sé aplicarla, que también puede ser XD) ya que es un movimiento libre. Ya había probado con la colisión con el objeto suelo, pero tampoco funciona bien.
Y lo de limitar la velocidad, me pasa lo mismo, además de que no quisiera limitarla a ser posible :P
A ver si con los nuevos datos se le ocurre a alguien algo, porque de momento a mí na de na :/
¿Podrías adjuntar el código del movimiento y el sistema de colisiones, por favor? Así mismo, indica en qué evento está cada cual.
Vale, había probado antes la colisión y no funcionaba... porque tenía puesto otro código en el step que modificaba varias cosas y hacía que no funcionara correctamente la colisión.
He vuelto a probar con sólo el código de colisión y funciona perfectamente, incluso con velocidades de 80. Puto melón que soy XD
Gracias de nuevo :)
igualmente si estudias un poquito la funcion collision_rectagle,en tu caso te podria servir muchisimo