Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Chrom en Diciembre 07, 2014, 08:20:11 PM

Título: Rebotar en una caja
Publicado por: Chrom en Diciembre 07, 2014, 08:20:11 PM
Hola Una pregunta amigos de comunidadgm  ;D como hago para que cuando mi player caiga por arriba de la caja rebote y salga una animacion de la caja rota y si no cae por arriba solo colisiona.
Mi codigo es este
if(y+8<other.y){self.vspeed-=7;
with(other){instance_change(object10,false)};}else{break;}

se rompe la caja y sale la animacion pero no rebota y hay algunos errores de colision,aveces paso por el lado y salta,etc
Me podrian ayudar Por favor :(
Título: Re:Rebotar en una caja
Publicado por: Zela en Diciembre 08, 2014, 04:48:22 AM
Hola Chrom

Intentaré desglosar lo que dices:

- el objeto "Player" al tocar un objeto "Caja" por arriba, le implique "Rebotar verticalmente hacia arriba"
- El objeto "Caja" después del rebote desaparezca por medio de una animación de ruptura.
- si el objeto "Player" no toca el objeto "Caja" por arriba, solo Colisiona.

Viendo su código.

- Supongo que esta mirado desde el objeto "Player", lo cual entiendo que : si en los pies del player esta arriba de una caja (No hay restricción adicional lo cual podría estar al infinito por arriba y la condición seguiría siendo verdadera), él se impulsa verticalmente hacia arriba y "TODAS LAS INSTANCIAS" (with) "Caja" hacen la animación de ruptura. lo cual que si hay más de una caja se romperían todas ellas.

Pues se me ocurre que una solución seria.

Mirarlo desde el objeto "Caja":
- Colocando una condición de "Colision" Y "Posición" con respecto al player (que de antemano es único en la mayoría de los casos), dando a conocer el "rebote" del player y la animación de ruptura respectivamente.

Pienso que así, no ocurrirían casos extraños. ya que si colisionan y no ocurre la condición de posición solo colisionaría.

un error a futuro que tendrías, será que la condición de "posición" no te servirá por sea cual sea tu estrategia. el problema es que TODOS los objetos que se "mueven" se "Teletransportan" por cada "step", y la mayoría de los casos no te servirá dar una condición especifica, porque no se daría casi nunca, a menos que, uses "colisiones telescópicas" ( analizas un step antes de pasar un punto especifico) pero es complicado a simple vista.
Lo mas simple y sano para el cerebro es saber cuando el player "Cae" o "Sube" eso lo consigues con la variable del player "vspeed" si es negativa "SUBE" y en caso contrario "BAJA". en tanto, viendo la condición de "colisión" y su "velocidad" sea positiva cumples lo mínimo para dar paso al rebote  :)

- suele pensar que que con la opción "other" se soluciona todo mirándolo desde el objeto player, pero, usas la función "instance_change()" que tiene efecto desde la instancia invocada, lo cual justificaría su uso del "with" que ejecuta un código como si estuviésemos en esa instancia en particular, pero el "with" hace un bucle por todas las familias del objeto, lo cual influyen en todas las instancias que son creadas desde la estructura del objeto "Caja" (la familia que menciono)

Saludos.
Título: Re:Rebotar en una caja
Publicado por: TheSandBoxMKG en Diciembre 08, 2014, 06:47:15 AM
Aquí te mando un ejemplo
el objeto de la caja es importante.
Título: Re:Rebotar en una caja
Publicado por: Chrom en Diciembre 08, 2014, 08:34:52 PM
Me parecio muy bien las dos respuestas.Arregle y modifique un poco el codigo hice esto aqui les dejo mi juego y ven como quedo y si notan problemas avisenmelos  ;D Gracias por sus respuestas.
Título: Re:Rebotar en una caja
Publicado por: TheSandBoxMKG en Diciembre 09, 2014, 04:56:43 PM
Cita de: Chrom en Diciembre 08, 2014, 08:34:52 PM
Me parecio muy bien las dos respuestas.Arregle y modifique un poco el codigo hice esto aqui les dejo mi juego y ven como quedo y si notan problemas avisenmelos  ;D Gracias por sus respuestas.

al colisionar a lado de la caja sin saltar sobre ella, se rompe automáticamente. También problema de colisión con los pisos.

PD: en mi ejemplo use colisiones cuadradas.