Я пытаюсь реализовать 2D-физику в игре типа астероидов. У меня есть границы столкновений, установленные на границах окна.2D Sprite Физика относительно движения
Однако, когда я сталкиваюсь с кораблем спрайтом на границе (и меняю правильную скорость для оси x или y), я иногда получаю сбой, когда я иду, чтобы двигаться. Корабль будет прыгать временно, но если я удерживаю клавишу перемещения достаточно долго, он, как правило, исправляет себя.
Проблема в том, что этот сбой заметен.
Соответствующие разделы Код:
#update velocity
def velocity(self, speed):
self.vx += math.sin(math.radians(self.angle)) * speed
self.vy += math.cos(math.radians(self.angle)) * speed
magnitude = math.sqrt(self.vx*self.vx + self.vy*self.vy)
if magnitude > self.maxvel:
self.vx *= 4/magnitude
self.vy *= 4/magnitude
if self.speed >= self.maxvel:
self.speed = self.maxvel
if self.speed <= -self.maxvel:
self.speed = -self.maxvel
Мой код Движение:
if (key[K_UP]):
newShip.speed += 1
newShip.moving = 1
if (key[K_DOWN]):
newShip.speed -= 1
newShip.moving = 1
if (key[K_LEFT]):
newShip.angle += 4
if (key[K_RIGHT]):
newShip.angle -= 4
Мой полный код здесь: http://pastebin.com/19rHq97R Для запуска есть только два изображения, необходимые, вы действительно можете использовать все, что я думаю.
Я думаю, что проблема имеет какое-то отношение к изменению скорости x или y при обнаружении столкновения, но я не могу прикрепить точную проблему. Любое понимание очень ценится.
EDIT: Я провел еще несколько исследований. Интересно, возникают ли внезапные прыжки, потому что у меня нет какого-либо ускорения, запрограммированного в. http://pastebin.com/vFy9tjyN выдержка из моего журнала терминалов. Я распечатываю соответствующие переменные из своей программы.
Используете ли вы фиксированный временной интервал? В противном случае скачки timestep могут вызывать нестабильность. Значение, если оно проникает в границу, может перемещаться на 800 единиц, а в следующем кадре он перемещается только на 600. Заставляя его сталкиваться после того, как он уже находится внутри. Поэтому замена меняет заставку и отскок. – ninMonkey
@monkey Я еще не учитываю timestep. Я не совсем уверен, что это связано с самим столкновением, так как корабль может столкнуться, путешествовать в течение некоторого времени, а затем, когда применяется «тяга», проблема все же возникает. – KNova
Может быть несвязанным, но cos для x, а синус - для y. – ninMonkey