Quiero crear un juego como Doodle Jump. Estoy usando libgdx y Box2d. Necesito asesoramiento sobre cómo hacer que mi pelota rebote constantemente y con la misma altura.
He intentado establecer la restitución del cuerpo de la pelota a 1 para que pueda saltar constantemente, pero cuando salto en un bloque, el "impulso" es menor. También intenté detectar la colisión, luego apliqué un impulso pero tampoco funcionó.
¿Cómo puedo hacer que la pelota rebote a la misma altura cada vez?
Respuestas:
Cuando la pelota (curva de trayectoria roja) golpea un bloque más arriba (rectángulo azul), se moverá más lentamente que cuando golpea un bloque más abajo (rectángulo verde). Por lo tanto, por qué no rebota más alto de donde vino.
Físicamente, esto tiene sentido.
Doodle Jump obviamente no es físicamente exacto. Si desea un efecto como en Doodle Jump, donde el impulso de una colisión es siempre el mismo, debe establecer la velocidad vertical en algún valor usted mismo cada vez que ocurran colisiones, con
ball.speed.y = 7;
o similar.fuente
Los mundos Box2D usan amortiguación y fricción, tenga en cuenta que el mundo puede estar aplicando una amortiguación a sus objetos a medida que se simulan.
fuente
También me gustaría agregar a la mezcla que puede no ser necesario usar un motor de física para esto. Dependiendo de cómo se manejen las colisiones de su juego (específicamente, la respuesta de colisión), puede encontrar que puede crear un sistema de cuadro de límite muy simple sobre el que tiene control total. De hecho, en los juegos de estilo "doodle jump" es aún más fácil. En lugar de preocuparse por detectar colisiones en box2d y determinar si la colisión se debe desactivar o no (por ejemplo, golpear una plataforma desde abajo), el escenario de salto de doodle en realidad es mucho más simple. Si su bola viaja "hacia abajo" (y está disminuyendo) y pasa el valor y de una plataforma, y está dentro de los límites izquierdo / derecho de una plataforma, entonces colisiona. Lo único realmente "complejo" es la trayectoria de vuelo parabólico que tomarías después,http://en.wikipedia.org/wiki/Parabola#Equation_in_Cartesian_coordinates ).
Las colisiones con otros elementos en el mundo que no requieren una respuesta (por ejemplo, golpear una bonificación) se pueden resolver fácilmente con solo cuadros delimitadores.
Box2D es fenomenal, pero a menudo es excesivo si tiene requisitos simples. OMI.
fuente
Recuerde (valor flotante = velocidad.y) la velocidad de la pelota antes de que choque con la plataforma, y establezca después del rebote: ball.velocity.y = valor * (-1)
Tal vez sea interesante mirar en estas publicaciones:
primera publicación
segunda publicación
PD: No puedo enviar el código aquí, mira en la "primera publicación" en el último comentario. Hay un código de cómo resolví un problema similar.
fuente