首頁 > 後端開發 > Python教學 > 為什麼我的 Pygame 碰撞偵測總是 True,為什麼我的精靈位於 (0, 0)?

為什麼我的 Pygame 碰撞偵測總是 True,為什麼我的精靈位於 (0, 0)?

Mary-Kate Olsen
發布: 2024-12-16 19:52:28
原創
289 人瀏覽過

Why is my Pygame collision detection always True, and why are my sprites positioned at (0, 0)?

碰撞偵測與精靈定位故障排除

在您的程式碼中,您遇到兩個問題:collide_rect 函數總是傳回「True ”,甚至當它不應該時,代表精靈的矩形的位置似乎是(0, 0).

讓我們先解決碰撞偵測。 collide_rect 總是回傳「True」的原因是您沒有正確設定矩形的位置。 pygame.Surface.get_rect() 傳回一個具有表面尺寸的矩形對象,但它始終從 (0, 0) 開始。要將矩形放置在精靈的位置,您需要使用以下方法之一:

self.rect = self.image.get_rect(topleft=(self.x, self.y))
登入後複製

self.rect = self.image.get_rect()
self.rect.topleft = (self.x, self.y)
登入後複製

透過設定矩形的topleft 屬性,您可以明確地將其與精靈的位置對齊。

至於不正確的精靈位置,您引入了不必要的 self.x 和 self.y 屬性。更好的做法是直接依賴矩形的位置。這是一個刪除屬性並在 get_rect() 呼叫中設定左上角位置的範例:

class Ball(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("ball.png")
        self.rect = self.image.get_rect(topleft=(280, 475))
        self.col = False

class Obstacle(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("obstacle.png")
        self.rect = self.image.get_rect(topleft=(1000, 483))
登入後複製

此外,您可以選擇利用 pygame.sprite.Group 來處理精靈渲染和更新。這簡化了繪製過程,因為它繪製了群組中的所有精靈:

all_sprites = pygame.sprite.Group([obstacle, ball])

while not crashed:
    # [...]

    gameDisplay.fill((255,255,255))

    all_sprites.draw(gameDisplay)

    pygame.display.flip()
    clock.tick(1000)
登入後複製

請注意,如果您使用Group,則可以刪除Ball.update() 和Obstacle.update() 方法,因為它們將處理更新精靈的位置並將影像繪製到顯示器上。

以上是為什麼我的 Pygame 碰撞偵測總是 True,為什麼我的精靈位於 (0, 0)?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板