2017-09-23 62 views
0

我有一個pygame平臺遊戲,玩家可以跳轉和左/右移動。爲了測試玩家是否與平臺發生衝突,我使用pygame.rect.colliderect()函數。我遇到的問題是,當玩家在一個同時殺死他的平臺和一個平臺上時,如果殺戮塊位於平臺的左邊,他將會死亡。如果在平臺的右側,他會活下去。 我想知道是否有更好的方法來測試碰撞,或者我是否必須自己做出這樣的功能。更好的方式來做pygame.rect.colliderect()

球員是粉紅色的,平臺是白色的,死亡塊是紅色的。玩家不會在第一張照片中死亡,但會在第二張照片中死亡。

enter image description hereenter image description here

這是我當前的代碼:

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 
+0

如果出現與任何平臺不相鄰的「死亡區塊」會發生什麼情況? –

+0

如果玩家在不與平臺相鄰的死亡街區或2個死亡街區上,他會死亡。 – SnootierBaBoon

回答

0

一般的答案是,你必須做兩遍。首先收集所有colliderect標識的對象(或所有rect.top值標識爲在播放器下的對象)。然後立即對所有對象作出反應。

在這裏,存儲玩家所站的最左邊的塊可能就足夠了(這可能會隨着您考慮更多entities而改變)。考慮所有候選人後,對保存的塊的類型作出反應。

+0

如果我在移動後獲得了與玩家碰撞的所有實體,那麼如果他同時碰到牆壁和死亡區塊,玩家將會死亡,這很奇怪。我只是通過說如果玩家同時跑進平臺和死亡區塊來解決這個問題,它並不會死亡。 – SnootierBaBoon

+0

也許如果'self.lost ==真和(檢查它是否與相同方向上的平臺相撞):self.lost = False' – SnootierBaBoon

+0

@SnootierBaBoon:我已經說過,你可能只想考慮那些在播放器下。至於重新設置'self.lost',請考慮不要錯誤地設置它(類似於'如果nDeath而不是nPlatform:self.lost = True'),以避免愚蠢的事情,比如「如果你碰觸一堵牆。」。 –