Tengo este juego de "estilo de ruptura".
Tengo un cañón en el centro, bloques alrededor del cañón y almohadillas alrededor de los bloques. Así es como se ve el juego:
Me las arreglé para obtener la colisión por píxel y mi bola "se refleja " en contacto con los bloques con las siguientes matemáticas:
Ball.Direction = 2 * (Block.Direction - Ball.Direction) + 180;
Donde la línea azul es la dirección de la bola, y la línea negra (línea base) es la superficie del bloque.
La dirección es un ángulo expresado en radianes (que se puede convertir a grados, por supuesto).
La pelota es movida por:
// Event.ENTER_FRAME
x += Math.sin(Direction) * Velocity;
y -= Math.cos(Direction) * Velocity;
Hasta aquí todo bien.
Mi problema viene ahora, con las almohadillas (los 3 bloques oscuros y grandes alrededor de los pequeños bloques de colores).
A medida que giran, el ángulo de la superficie cambia.
Más que eso, la pelota también debe golpear los lados, entonces, ¿cómo puedo medir la dirección del golpe y la nueva dirección de movimiento de la pelota?
ps : si es necesario, puedo proporcionar código y un swf jugable.
Editar
Ok, el problema con los ángulos se resolvió con vectores , pero todavía tengo el problema con los lados y la colisión trasera.
Abriré otra pregunta para eso y la vincularé aquí.
fuente
Respuestas:
No estoy seguro si entendí tu problema correctamente, pero asumí que lo que quieres hacer es encontrar la dirección resultante de tu bola después de una colisión.
Aquí hay un dibujo rápido en mi pizarra que muestra una posible solución para eso:
Las flechas verdes representan la velocidad de la pelota (como un vector), los bloques azules representan sus grandes bloques negros y la flecha roja es el vector resultante.
En el primer caso, el bloque azul tiene una inclinación de 30 grados. Una de las formas de solucionar el problema de colisión es llevar todo de vuelta al eje horizontal. Lo que debe hacer es rotar todo 30 grados (la inclinación del bloque) (puede usar matrices para eso).
Luego, verifica de dónde fue la colisión . Si la colisión fue horizontal, invierta el componente x de la velocidad. Si era vertical (como en este caso), el componente y (
ball.Velocity.Y = -ball.Velocity.Y
). Esto también hará que la pelota actúe correctamente cuando golpee las esquinas (invertirá ambos componentes). Después de eso, solo tiene que volver a la situación real (que no está en el dibujo).En el segundo caso, es lo mismo, excepto que la velocidad de la pelota no es perpendicular al bloque. Gira 70 grados, verifica de dónde fue la colisión e invierte los componentes apropiados. Después, vuelves a tu situación real.
Nota: Noté que estás usando un ángulo para representar la dirección en lugar de un vector. Simplemente podría crear un vector para estos cálculos o mantener la misma idea general pero trabajando con ángulos.
Ciertamente, este no es el mejor camino a seguir y estoy seguro de que puede calcularlo de alguna manera, pero creo que es una posible solución a su problema.
fuente
-block inclination angle
para tener una respuesta de colisión adecuada ... Tonto.Direction
(como un vector) y actualizar la posición de la bola, así:ball.Position += ball.Direction * ball.Speed;
.