ホームページ >バックエンド開発 >Python チュートリアル >Pygame の衝突検出が常に True になるのはなぜですか?また、スプライトが (0, 0) に配置されるのはなぜですか?

Pygame の衝突検出が常に True になるのはなぜですか?また、スプライトが (0, 0) に配置されるのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-16 19:52:28294ブラウズ

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

衝突検出とスプライト配置のトラブルシューティング

コード内で 2 つの問題が発生しています。 collide_rect 関数は、たとえスプライトを表す四角形の位置が (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)

四角形の左上属性を設定することで、明示的に

スプライトの位置が間違っている点については、不要な 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)

グループをそのまま使用する場合、Ball.update() メソッドと Obstacle.update() メソッドは削除できることに注意してください。スプライトの位置の更新とディスプレイへの画像の描画を処理します。

以上がPygame の衝突検出が常に True になるのはなぜですか?また、スプライトが (0, 0) に配置されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。