我正在研究一個簡單的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
所以這真的是莫名其妙的我,特別是因爲該塊落在量是不一致的。如果有人可以給我一個關於如何解決這個問題的想法,我會非常感激。
用最親切的問候,
德里克
所以我拋棄了一個調試軌跡,而且似乎正在發生的是關於玩家速度的說法。它距離該塊只有4個像素,但它的速度爲9,因此它將5個像素分成塊。我不確定如何處理代碼,以便它在碰到塊時將速度更改爲0,或以速度0調整塊的速度。任何想法?在此先感謝 –
好吧,我做到了這樣,當玩家與平臺發生碰撞時,我將玩家rect.bottom設置爲平臺的矩形頂端。接下來發生的事情是,這兩個精靈顯然沒有碰撞。爲了解決這個問題,我將玩家rect.bottom設置爲平臺的矩形頂部加上1個額外像素以確保兩個精靈發生碰撞。感謝您的想法!對此,我真的非常感激。 :D –
很高興有幫助。 請記住「接受」答案,以便SO能妥善歸檔問題。 – Prune