ホームページ >バックエンド開発 >Python チュートリアル >PyGame で弾丸をマウス カーソルに追従させるにはどうすればよいですか?

PyGame で弾丸をマウス カーソルに追従させるにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-03 18:53:29850ブラウズ

How to Make Bullets Follow the Mouse Cursor in PyGame?

PyGame でカーソルに向かって弾丸を発射する

PyGame では、マウス カーソルの方向に従う発射体の作成が課題となる場合があります。提供されたコードを調べて、その欠点に対処しましょう。

既存のコード分析

現在のコードの目的は次のとおりです。

  • Bullet クラスを作成する
  • 弾丸の生成を処理するために Game クラスを初期化し、

ただし、この実装にはいくつかの欠陥があります。

  • pygame.transform.rotate が誤って使用されており、元のオブジェクトを変換する代わりに、新しい回転したサーフェスを返します。
  • 移動方向と回転角度を動的に計算しようとするため、予測不可能な弾丸が発生します

修正されたアプローチ

これらの問題を解決するには、別のアプローチを採用します:

  1. Bulletパラメータを初期化します作成:

    • 新しい弾丸を作成するとき、その開始位置とマウス カーソルに向かう方向ベクトルを計算します。
    • 方向ベクトルを正規化して単位ベクトルを作成します。
  2. 事前回転Bullet:

    • 計算された方向ベクトルに合わせて弾丸の表面を回転します。
  3. 連続位置更新:

    • 段階的に追加して箇条書きの位置を更新します現在の位置へのスケールされた方向ベクトル。

実装例

<code class="python">import pygame
import math

# Bullet Class
class Bullet:
    def __init__(self, x, y):
        # Calculate initial position and direction
        self.pos = (x, y)
        mx, my = pygame.mouse.get_pos()
        self.dir = (mx - x, my - y)
        # Normalize direction vector
        length = math.hypot(*self.dir)
        self.dir = (self.dir[0]/length, self.dir[1]/length)
        
        # Create bullet surface and rotate it
        self.bullet = pygame.Surface((7, 2)).convert_alpha()
        self.bullet.fill((255, 255, 255))
        angle = math.degrees(math.atan2(-self.dir[1], self.dir[0]))
        self.bullet = pygame.transform.rotate(self.bullet, angle)
        self.speed = 2  # Adjust bullet speed as desired

    def update(self):
        # Update position based on scaled direction vector
        self.pos = (self.pos[0]+self.dir[0]*self.speed, self.pos[1]+self.dir[1]*self.speed)

    def draw(self, surface):
        # Draw bullet aligned with the correct direction
        bullet_rect = self.bullet.get_rect(center=self.pos)
        surface.blit(self.bullet, bullet_rect)

# PyGame Main Loop
pygame.init()
window = pygame.display.set_mode((500, 500))
clock = pygame.time.Clock()
bullets = []  # List to store bullet objects

while True:
    clock.tick(60)  # Set desired frame rate
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.MOUSEBUTTONDOWN:
            # Create a new bullet and add it to the list
            bullets.append(Bullet(*pygame.mouse.get_pos()))

    # Update and draw bullets
    for bullet in bullets[:]:
        bullet.update()
        if not window.get_rect().collidepoint(bullet.pos):
            # Remove bullets that leave the window boundary
            bullets.remove(bullet)
        else:
            # Draw bullet at its current position
            bullet.draw(window)

    # Render the updated display
    pygame.display.update()</code>

以上がPyGame で弾丸をマウス カーソルに追従させるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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