我有一個pygame平臺遊戲,玩家可以跳轉和左/右移動。爲了測試玩家是否與平臺發生衝突,我使用pygame.rect.colliderect()函數。我遇到的問題是,當玩家在一個同時殺死他的平臺和一個平臺上時,如果殺戮塊位於平臺的左邊,他將會死亡。如果在平臺的右側,他會活下去。 我想知道是否有更好的方法來測試碰撞,或者我是否必須自己做出這樣的功能。更好的方式來做pygame.rect.colliderect()
球員是粉紅色的,平臺是白色的,死亡塊是紅色的。玩家不會在第一張照片中死亡,但會在第二張照片中死亡。
這是我當前的代碼:
class Player(Entity):
(other things in the Player class that are irrelevant)
def update(self):
self.xvel = 0
keys = pygame.key.get_pressed()
if keys[pygame.K_w] and self.onfloor: self.yvel = -2
if keys[pygame.K_a]: self.xvel = -1
if keys[pygame.K_s]: pass
if keys[pygame.K_d]: self.xvel = 1
if not self.onfloor and self.yvel < 10:
self.yvel += .05
self.move(self.xvel, 0)
self.move(0, self.yvel)
def move(self, xvel, yvel):
self.rect.x += xvel
self.rect.y += yvel
self.onfloor = False
for thing in entities: # entities is a list of all entities, thing.rect is the pygame.rect.Rect instance for that entity
if thing != self:
if self.rect.colliderect(thing.rect):
if isinstance(thing, End): self.won = True
if isinstance(thing, Death): self.lost = True
if yvel < 0:
self.rect.top = thing.rect.bottom
self.yvel = 0
if xvel < 0: self.rect.left = thing.rect.right
if yvel > 0:
self.rect.bottom = thing.rect.top
self.onfloor = True
if xvel > 0: self.rect.right = thing.rect.left
我試圖使我自己的功能,但沒有奏效。這是我做的:
def entitycollide(self, entity):
sx1, sx2, sy1, sy2 = self.rect.left, self.rect.right, self.rect.top, self.rect.bottom
ex1, ex2, ey1, ey2 = entity.rect.left, entity.rect.right, entity.rect.top, entity.rect.bottom
if ((sx1 < ex1 < sx2) or (sx1 < ex2 < sx2)) and ((sy1 < ey1 < sy2) or (sy1 < ey2 < sy2)):
return True
else: return False
如果出現與任何平臺不相鄰的「死亡區塊」會發生什麼情況? –
如果玩家在不與平臺相鄰的死亡街區或2個死亡街區上,他會死亡。 – SnootierBaBoon