저는 컴퓨터 과학 입문 과정을 밟았습니다. 그러나 잠시 후에 다시 시도하고 게임을 만들기로 결정했습니다. 충돌 감지에 문제가 있습니다. 내 생각은 물체를 움직이는 것이었고, 충돌이 있다면 충돌이 없어 질 때까지 물체를 되돌려 놓습니다. 여기에 내 코드는 다음과 같습니다.초보자에서 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 할 때 벽 바로 바깥쪽으로 이동해야했기 때문입니다.
내 방법에 문제가 있습니까? 아니면 문제가 실행됩니까?
음, 이상합니다. 내가 게시하기 전에 실제로 버그를 잡았습니다. 그 버그가 어떻게 브라우저에 들어 왔는지 나는 모른다. 원래는 hitBox를 새 위치로 투영 한 다음 확인하는 방법으로 제안했던 작업을 수행하려고했으나 아무런 변화가 없다면 전혀 움직이지 않고 이동하려고했습니다. 나는 벽을 향해 움직이는 과정이 밖으로 나가는 과정과 거의 동일하다는 것을 두려워하며, 내가이 변화를 만들 때 나는 똑같은 문제를 가질 것이다. 그래도 그 동안 시도해 볼게. – Kevin
첫 코멘트를 무시하십시오. 이 두 라인의 인스턴스가 두 개 있습니다. 나는 첫 번째가 아니라 두 번째 것을 바로 잡았다. 이제 완벽하게 작동합니다. 감사합니다! – Kevin
@ Kevin, 나는 당신이 여러 위치에서 그것을 바꿀 필요가 없도록 동시에 위치를 변경하고 핫 박스를 업데이트하는 기능을 만들 것을 제안한다. 또한, 내 앞을 내다 보니 깜박임없이 벽에 맞춰 캐릭터를 움직일 수 있습니다. 오버 슛에서 빼는 대신 투사에서 점진적 거리를 더하십시오. –