2010-07-29 6 views
1

저는 컴퓨터 과학 입문 과정을 밟았습니다. 그러나 잠시 후에 다시 시도하고 게임을 만들기로 결정했습니다. 충돌 감지에 문제가 있습니다. 내 생각은 물체를 움직이는 것이었고, 충돌이 있다면 충돌이 없어 질 때까지 물체를 되돌려 놓습니다. 여기에 내 코드는 다음과 같습니다.초보자에서 2D 충돌 감지에 문제가 있습니다

class Player(object): 
    ... 
    def move(self): 
     #at this point, velocity = some linear combination of (5, 0)and (0, 5) 
     #gPos and velocity are types Vector2  
     self.hitBox = Rect(self.gPos.x, self.gPos.y, 40, 40) 
     self.gPos += self.velocity 
     while CheckCollisions(self): 
      self.gPos -= self.velocity/n #see footnote 
      self.hitBox = Rect(self.gPos.x, self.gPos.y, 40, 40) 
    ... 
def CheckCollisions(obj): 
    #archList holds all 'architecture' objects, solid == True means you can't walk   
    #through it. colliderect checks to see if the rectangles are overlapping 
    for i in archList: 
     if i.solid: 
      if i.hitBox.colliderect(obj.hitBox): 
       return True 
    return False 

* 플레이어가 뒤로 이동하는 증가량을 변경하려면 정수, 부동 소수점 n에 대해 여러 가지 다른 값을 대체했습니다. 큰 float을 시도해 보면 한 번에 한 픽셀 씩 움직일 것입니다.

프로그램을 실행하면 벽을 댈 때마다 플레이어의 스프라이트가 약 5 픽셀 범위 내에서 매우 빠르게 진동합니다. 화살표 키를 놓으면 스프라이트가 벽에 영구히 붙어 있습니다. Sprite가 처음부터 벽 안쪽에있는 이유는 무엇인가 궁금합니다. 왜냐하면 스프라이트를 화면에 blit 할 때 벽 바로 바깥쪽으로 이동해야했기 때문입니다.

내 방법에 문제가 있습니까? 아니면 문제가 실행됩니까?

답변

1

위치를 업데이트하기 전에 히트 박스를 설정하는 것처럼 보입니다. 수정은 간단 해 보입니다.

찾기 :

self.hitBox = Rect(self.gPos.x, self.gPos.y, 40, 40) 
    self.gPos += self.velocity 

바꾸기 :

self.gPos += self.velocity 
    self.hitBox = Rect(self.gPos.x, self.gPos.y, 40, 40) 

다른 제안 :은 당신이 할 일은 당신이 이동하기 전에 위치를 확인하고,이 점유 않다면, 이동하지 않습니다. 이것은 테스트되지 않았으므로 요점을 설명하기위한 목적 코드로 사용하십시오.

class Player(object): 
    ... 
    def move(self): 
     #at this point, velocity = some linear combination of (5, 0)and (5, 5) 
     #gPos and velocity are types Vector2  
     selfCopy = self 
     selfCopy.gPos += self.velocity 
     selfCopy.hitBox = Rect(selfCopy.gPos.x, selfCopy.gPos.y, 40, 40) 
     if not CheckCollisions(selfCopy)  
      self.gPos += self.velocity 
    ... 
def CheckCollisions(obj): 
    #archList holds all 'architecture' objects, solid == True means you can't walk   
    #through it. colliderect checks to see if the rectangles are overlapping 
    for i in archList: 
     if i.solid: 
      if i.hitBox.colliderect(obj.hitBox): 
       return True 
    return False 
+0

음, 이상합니다. 내가 게시하기 전에 실제로 버그를 잡았습니다. 그 버그가 어떻게 브라우저에 들어 왔는지 나는 모른다. 원래는 hitBox를 새 위치로 투영 한 다음 확인하는 방법으로 제안했던 작업을 수행하려고했으나 아무런 변화가 없다면 전혀 움직이지 않고 이동하려고했습니다. 나는 벽을 향해 움직이는 과정이 밖으로 나가는 과정과 거의 동일하다는 것을 두려워하며, 내가이 변화를 만들 때 나는 똑같은 문제를 가질 것이다. 그래도 그 동안 시도해 볼게. – Kevin

+0

첫 코멘트를 무시하십시오. 이 두 라인의 인스턴스가 두 개 있습니다. 나는 첫 번째가 아니라 두 번째 것을 바로 잡았다. 이제 완벽하게 작동합니다. 감사합니다! – Kevin

+0

@ Kevin, 나는 당신이 여러 위치에서 그것을 바꿀 필요가 없도록 동시에 위치를 변경하고 핫 박스를 업데이트하는 기능을 만들 것을 제안한다. 또한, 내 앞을 내다 보니 깜박임없이 벽에 맞춰 캐릭터를 움직일 수 있습니다. 오버 슛에서 빼는 대신 투사에서 점진적 거리를 더하십시오. –

관련 문제