Hola amigos, tengo un grave problema de colisiones, estoy haciendo un juego estilo arkanoid, la bola rebota infinitamente y la tabla o bloque se mueve con el mouse pero tengo el problema de que cuando muevo la tabla la bola queda encajada, o sea, si pega en la parte superior de la tabla rebota pero si muevo algo rápido la tabla es como si la clavara y queda en medio de la tabla encajada, realmente es algo horrible, ¿alguien sabe como lo puedo arreglar?
Una solución sería detectar las colisiones realizando una "proyección" de la forma de los objetos móviles, pero requiera mucha álgebra. http://www.gamedev.net/page/resources/_/technical/game-programming/swept-aabb-collision-detection-and-response-r3084 (http://www.gamedev.net/page/resources/_/technical/game-programming/swept-aabb-collision-detection-and-response-r3084)
La otra opción sería expulsar la bola, para salir de la colisión, en base a las velocidades de los dos objetos. El primer paso sería desactivar la propiedad solid. También sería muy conveniente que la tabla tuviese una velocidad límite, ya que con el ratón se pueden hacer movimientos muy rápidos, en algunas situaciones parecería que la tabla se teletransporta.
Otra opción sería utilizar Box2D y marcar a los objetos rápidos bomo "bullet", de esa forma las colisiones se detectarían automáticamente.
Gracias por responder Clamud, justamente me encuentro haciendo pruebas acerca de usar el motor físico, aquí la dificultad se me representa con como mover la tabla con las funciones de fuerza física, estoy probando con apply_force pero todavía no logro que actúe correctamente. También en el modo sin física probé en vez de mover con el mouse, mover con 2 botones a una velocidad de 5 -5 que es bastante lenta pero igual cuando golpea de costado se encaja la bola
con físicas logré que la tabla tenga un mejor comportamiento, ahora mi problema es que las bolas (son varias) tienden a rebotar en línea recta, sin física era más fácil controlar que las bolas vayan siempre a la misma velocidad y reboten, con respecto al comportamiento de las bolas necesitaría que fuese como en el famoso juego jezzball donde las bolas rebotaban a una velocidad estable constantemente con los bordes y entre sí, no sé como lograr esto con físicas, tiende a rebotar en línea recta y no sé como estabilizar la velocidad ya que pueden ir muy rápido o quedarse quietas
que te parece si tu codigo que cambia direccion y velocidad,imagino dentro del evento colision lo metes dentro de un condicional?
algo como esto
[gml]
//dentro del create
colisionado = 0
//en el evento colision con la barra
if colisionado = 0
{
//tu codigo
colisionado = 1
alarm[0]=30//pongo 30 pasos, pero pueden ser menos o mas, eso depende de lo que tu pienses que quede mejor, este es por decirlo asi, el tiempo minimo entre rebotes contra la barra
}
//dentro de la alarm[0]
colisionado = 0//reseteamos para que pueda volver a golpearse con la barra
[/gml]
Reeditando el ejemplo similar:
http://www.comunidadgm.org/preguntas-y-respuestas/hacer-botar-una-pelota/msg119829/#msg119829
Para simular un arkanoid
http://www.mediafire.com/download/ddx8orjaa2xyg7e/rebote_arkanoid.gmz
El ejemplo apenas tiene código. Todo gracias a la función move_bounce_all(). Obvio que se debe pulir, pero el rebote parece que funciona bastante bien (las bolas van más rápido de lo que se ve en el gif):
(http://i.imgur.com/yHA1mYW.gif)
Como dijo Clamud, es necesario limitar la velocidad de la tabla, porque moverla a la velocidad del puntero es muy fácil.
Gracias a todos por responder, en el ejemplo de arkanoid que dejo penumbra pasa exactamente lo mismo, si observan se aprecia, en este caso hay que esperar ya que no controlamos las cosas, pero cuando las tablas tocan la bola de costado esta se detiene y queda encajada hasta que en un momento se desprende, queda horrible eso. Hasta ahora el mejor resultado obtenido lo logré con fìsicas, pero todavía tego que mejorarlo.
Sí, por eso mencioné que el ejemplo necesitaba pulirse.
Estuve probando y nunca vi que la pelota quedara pegada al borde de la pala. El único momento en que la pelota queda quieta (en mis intentos) es cuando queda atrapada entre la pared y un borde de la tabla, pero esto a mi me parece normal, ya que la pelota no tiene espacio a dónde moverse.
Realicé cambios al ejemplo: en el evento de colisión se detecta si la pelota contacta en uno de los bordes de la tabla, y de ser así, se afecta su movimiento mediante la función motion_add(). Forcé más rebotes, y no he apreciado que se haya quedado pegada a un borde alguna vez.
https://www.dropbox.com/s/jo154pcugvf072r/arkano.avi?dl=0