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, 당신은 정말 생각 아무것도 사용할 수 있습니다 필요한 경우에만 2 이미지가 실행합니다.

나는이 문제가 충돌 탐지시 x 또는 y 속도의 역전과 관련이 있다고 생각하지만 정확한 문제를 해결할 수는 없다. 모든 통찰력이 인정됩니다.

편집 : 더 조사했습니다. 갑작스런 점프가 프로그램 된 가속 기능을 가지고 있지 않기 때문에 궁금합니다. http://pastebin.com/vFy9tjyN 내 터미널 로그에서 발췌되었습니다. 프로그램에서 관련 변수를 인쇄합니다.

+0

고정 시간대를 사용 중입니까? 그렇지 않으면 타임 스텝 건너 뛰기가 불안정을 야기 할 수 있습니다. 의미는 그것이 경계에 침투하면 800 유닛을 움직일 수 있고, 다음 프레임은 600으로 이동하는 것입니다. 이미 안으로 들어가면 충돌하게 만듭니다. 따라서 스와핑으로 인해 스틱이 붙어서 튀어 오릅니다. – ninMonkey

+0

@monkey 아직 타임 스텝을 고려하지 않았습니다. 나는 우주선이 충돌 할 수 있고, 얼마 동안 여행 할 수 있고, '추력'이 적용될 때, 충돌 자체와 관련이 있다는 것을 완전히 확신하지 못한다. 문제는 여전히 그 자체로 나타난다. – KNova

+0

상관 관계가 없지만 cos은 x에 대한 것이고 sine은 y에 대한 것입니다. – ninMonkey

답변

0

이 시도 :이 더 안정 될 것이라고 생각

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

If w: 
    Direction = DirDict["left"] 

//etcetera 

을; 그것은 항상 나를 위해 일했습니다.

+0

죄송합니다. 형식, 전화에서 답변 –

관련 문제