Я хочу создать такую игру, как Doodle Jump. Я использую libgdx и Box2d. Мне нужен совет о том, как заставить мой мяч подпрыгивать постоянно и с одинаковой высотой.
Я попытался установить восстановление тела шара на 1, чтобы он мог постоянно прыгать, но когда я прыгаю на блок, «импульс» меньше. Я также пытался обнаружить столкновение, а затем применить импульс, но это тоже не сработало.
Как я могу заставить мяч отскочить на одну и ту же высоту каждый раз?
Ответы:
Когда шар (красная кривая траектории) попадает на блок выше (синий прямоугольник), он будет двигаться медленнее, чем когда он попадает на блок внизу (зеленый прямоугольник). Следовательно, почему он не подпрыгивает выше, чем откуда он пришел.
Физически это имеет смысл.
Doodle Jump явно не физически точен. Если вам нужен такой эффект, как в Doodle Jump, когда импульс от столкновения всегда одинаков, вы должны установить вертикальную скорость на какое-то значение самостоятельно, когда происходят столкновения, с
ball.speed.y = 7;
или аналогичными.источник
Миры Box2D используют демпфирование и трение, учтите, что мир может применять демпфирование к вашим объектам, когда они моделируются.
источник
Я также хотел бы добавить, что для этого может не потребоваться физический движок. В зависимости от того, как обрабатываются ваши игровые коллизии (в частности, реакция на коллизию), вы можете обнаружить, что можете создать очень простую ограничивающую систему, над которой у вас есть полный контроль. На самом деле, в играх в стиле "Doodle Jump" это даже проще. Вместо того, чтобы беспокоиться об обнаружении коллизий в box2d и о том, следует ли отключить коллизию или нет (например, вы попали в платформу снизу), сценарий каракули-прыжка на самом деле намного проще. Если ваш шар движется «вниз» (у уменьшается) и он проходит значение у платформы, и он находится в пределах левой / правой границ платформы, то он сталкивается. Единственная действительно «сложная» вещь - это параболическая траектория полета, по которой вы пойдете,http://en.wikipedia.org/wiki/Parabola#Equation_in_Cartesian_coordinates ).
Столкновения с другими предметами в мире, которые не требуют ответа (например, получение бонуса), могут быть легко решены с помощью просто ограничительных рамок.
Box2D феноменален, но часто излишним, если у вас есть простые требования .. ИМО.
источник
Запомните (значение с плавающей точкой = скорость.y) скорость мяча, прежде чем он столкнется с платформой, и установите после отскока: ball.velocity.y = значение * (-1)
Может быть, вам будет интересно посмотреть в этом
посте : первый пост,
второй пост
PS Я не могу отправить код здесь, пожалуйста, посмотрите "первое сообщение" в последнем комментарии. Есть код, как я решил подобную проблему.
источник