2013-02-20 4 views
0

Я пытаюсь реализовать 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 выдержка из моего журнала терминалов. Я распечатываю соответствующие переменные из своей программы.

+0

Используете ли вы фиксированный временной интервал? В противном случае скачки timestep могут вызывать нестабильность. Значение, если оно проникает в границу, может перемещаться на 800 единиц, а в следующем кадре он перемещается только на 600. Заставляя его сталкиваться после того, как он уже находится внутри. Поэтому замена меняет заставку и отскок. – ninMonkey

+0

@monkey Я еще не учитываю timestep. Я не совсем уверен, что это связано с самим столкновением, так как корабль может столкнуться, путешествовать в течение некоторого времени, а затем, когда применяется «тяга», проблема все же возникает. – KNova

+0

Может быть несвязанным, но cos для x, а синус - для y. – ninMonkey

ответ

0

Попробуйте это:

DirDict = { "left" : (-speed, 0) , "right" :    (speed, 0), "up" : (0, -speed), "left" : (0,    speed) } 

If w: 
    Direction = DirDict["left"] 

//etcetera 

Я думаю, что это будет более стабильным; это всегда сработало для меня.

+0

Извините Формат, ответ на мой телефон –

Смежные вопросы