2016-07-14 18 views
0

我正在研究一個簡單的2D平臺變形器,但我在使用我的精靈的hitbox時遇到了一些麻煩。我使用pygame.sprite.spritecollide函數來生成觸摸我的玩家精靈的塊(平臺)列表。Pygame spritecollide hitboxes

這裏是我的播放器類:

class Player(pygame.sprite.Sprite): 

    def __init__(self,x,y,image): 

     super(Player, self).__init__() 

     self.vel_x = 0 
     self.vel_y = 0 
     self.moveSpeed = 3 
     self.jumpPower = 7 

     self.direction = idle 
     self.grounded = False 
     self.falling = True 
     self.jumping = False 
     self.climbing = False 

     self.image = pygame.Surface((50,50))#pygame.transform.scale(image, (50,50)) 
     self.rect = self.image.get_rect() 
     self.rect.x = x 
     self.rect.y = y 
     self.width = 50 
     self.height = 50 
     self.rect.bottom = self.rect.y + self.height 

    def set_position(self,x,y): 

     self.rect.x = x 
     self.rect.y = y 

    def experience_gravity(self, gravity = 0.3): 

     if not self.grounded: 
      self.vel_y += gravity 
      self.falling = True 
     else: 
      self.vel_y = 0 
      self.grounded = True 
      self.falling = False 

    def jump(self): 

     self.grounded = False 
     self.vel_y -= self.jumpPower 

    def update(self, collidable = pygame.sprite.Group()): 

     global collision 

     self.experience_gravity() 

     self.rect.x += self.vel_x 
     self.rect.y += self.vel_y 

     collision_list = pygame.sprite.spritecollide(self, collidable, False) 

     for p in collision_list: 
      if (self.vel_y > 0): 
       self.vel_y = 0 
       self.grounded = True 

在我更新的方法,我查了精靈組之間的碰撞抱着我所有的平臺(參數可碰撞)和播放器。

下面是我的塊類:

class Block(pygame.sprite.Sprite): 

    def __init__(self, x, y, width, height): 

     super(Block, self).__init__() 
     self.image = pygame.Surface((width, height)) 
     self.image.fill(black) 

     self.rect = self.image.get_rect() 

     self.type = platform 

     self.rect.x = x 
     self.rect.y = y 
     self.width = width 
     self.height = height 

不言自明塊類。我的代碼的其餘部分是更新和blit一切到一個白色的背景。我遇到的問題是,當玩家登陸平臺時,它只會在平臺上停止墜落(接地)。更奇怪的是,這個塊沉入平臺的深度並不一致。有時它會下降10個像素,其他連接20個像素。這裏是玩家的截圖被卡住:

​​3210

所以這真的是莫名其妙的我,特別是因爲該塊落在量是不一致的。如果有人可以給我一個關於如何解決這個問題的想法,我會非常感激。

用最親切的問候,

德里克

回答

0

很難不任何調試跟蹤診斷,但我有一個想法或兩個。首先,轉儲調試軌跡:在每個時間步驟打印突出值:玩家塊的位置,碰撞塊的位置和適用的速度。這應該會在涉及的對象的每個時間步驟給你一張表格式的快照。

現在,看看碰撞前最後一步的值。我懷疑你可能有一些像-20的玩家速度,但在平臺上只落在10像素以下。您的更新邏輯需要處理兩個時間步驟之間的着陸,並將玩家停在平臺高度。它看起來好像讓玩家在整個時間段內都能夠下降,這會將他的下肢10個像素嵌入到平臺中。其次,檢查你是否比較近的邊緣:在這種情況下,玩家的下邊緣與平臺的上邊緣。您稍後需要處理玩家的右下角與塊左上角接觸的情況,並且您必須確定玩家是首先碰撞塊的頂部(着陸)還是側面(改變水平速度和落差) 。


我不會改變計算速度;我認爲只需調整最終的位置就容易了。您發佈的最後一個代碼塊是您已經將碰撞作爲特例處理的地方。當您檢測到碰撞時,獲取物體的頂部表面(y值)。如果這高於玩家底部的當前位置,請將該頂部表面指定爲正確的位置。這會讓您的玩家坐在碰撞列表上最高的物體之上。

請注意,只有在您的整個碰撞列表正在下降時,這才起作用;對於側向碰撞,您需要分開列表並根據需要調整每個邊界。如果在同一時間段內有來自多方的碰撞,這可能會變得複雜 - 例如,當玩家同時擊中牆壁和平臺時,goombah從左邊猛擊玩家。

+0

所以我拋棄了一個調試軌跡,而且似乎正在發生的是關於玩家速度的說法。它距離該塊只有4個像素,但它的速度爲9,因此它將5個像素分成塊。我不確定如何處理代碼,以便它在碰到塊時將速度更改爲0,或以速度0調整塊的速度。任何想法?在此先感謝 –

+0

好吧,我做到了這樣,當玩家與平臺發生碰撞時,我將玩家rect.bottom設置爲平臺的矩形頂端。接下來發生的事情是,這兩個精靈顯然沒有碰撞。爲了解決這個問題,我將玩家rect.bottom設置爲平臺的矩形頂部加上1個額外像素以確保兩個精靈發生碰撞。感謝您的想法!對此,我真的非常感激。 :D –

+0

很高興有幫助。 請記住「接受」答案,以便SO能妥善歸檔問題。 – Prune