c++ math physics sfml

c++ - Problema de fisica pong



math physics (5)

Tengo un problema, pero no sé cómo describirlo, así que lo he dibujado.

Como se puede ver, la bola rebota cuando se detecta una colisión. No importa el ángulo, acabo de dibujarlo de esa manera. Pero a veces la pelota pasa por el remo dejándolo de otra manera.

¿Por qué sucede eso? Cuando detecto la colisión, cambio vx a -vx. ¿Qué debo hacer en ese caso? Cambiar también y? Pero, ¿cómo comprobar qué lado de la bola de paletas golpea?

Tal vez otras ideas?


Este es un problema bastante común para las personas que escriben clones de pong. La solución es, al detectar una colisión, no solo invertir la velocidad, sino también alterar la posición de la bola para que no se cruce con la paleta.

De lo contrario, es posible que la bola se atasque dentro de la paleta, negando constantemente vx = -vx = vx = -vx en cada cuadro. No dejará la paleta hasta que su ímpetu lo mueva lo suficiente hacia arriba o hacia abajo para escapar.


Esto generalmente es causado por el movimiento demasiado rápido de una pelota. Cuando un cuadro se desplaza hacia una pared y el cuadro siguiente ya está colocado detrás de la pared. La colisión re simplemente no sucede. Puedes negarlo mirando más a lo largo de la trayectoria de las bolas y buscando obstáculos.


Tu impresionante dibujo me muestra que no estás detectando una colisión vertical. Debes hacer lo mismo que haces para las coordenadas x para las coordenadas y.


Un número de cosas podría estar causando el problema.

En particular, si la bola puede viajar más de un píxel por "tic" o "marco", puede cruzar la paleta en más de varios píxeles en el momento en que se detecta la colisión.

Luego, hace retroceder el balón para que rebote de la paleta modificando su velocidad, pero dependiendo del nuevo ángulo, puede tomar varios cuadros para que la pelota abandone completamente la paleta. Entonces, en el siguiente tick, todavía se está intersectando y estás invirtiendo la velocidad nuevamente . Una ocurrencia anormal de esto puede conducir a que la pelota finalmente deje la paleta en el otro lado, pareciendo volar directamente a través de ella.

Es posible que desee colocar una bandera de "No chocar durante un tiempo" en esa combinación de paddle-ball, cuando la intersección se detecta por primera vez.

Como una cuestión relacionada, si la bola avanza lo suficientemente rápido (especialmente cuando su componente x es el más alto, como cuando la bola se desplaza casi completamente horizontalmente, de modo que queda la menor cantidad de paleta para que la atraviese), puede de hecho no habrá cuadros donde la bola esté físicamente intersectando la pala.

Todo esto depende de su código, que no podemos ver. Esperemos que lo anterior le dé algunas ideas, sin embargo.


Una solución que encontré al hacer pong fue usar vx = abs (vx) cuando se detecta una colisión con la paleta izquierda y vx = -abs (vx) cuando se detecta una colisión con la paleta derecha. esto asegura que la pelota rebote solo una vez, eliminando el recorrido dentro de la paleta causado por múltiples rebotes.