問題ステートメント
弾丸クラスを作成したにもかかわらず、弾丸はマウスカーソルの意図した方向に移動します。弾丸を回転および移動しようとすると、不安定な動作が発生しました。
解決策
1.回転と初期化:
pygame.transform.rotate は元のオブジェクトを変更しませんが、新しい回転サーフェスを作成します。弾丸を正しく回転して初期化するには、次のコードを使用します:
<code class="python">angle = math.degrees(math.atan2(-self.dir[1], self.dir[0])) self.bullet = pygame.Surface((7, 2)).convert_alpha() self.bullet.fill((255, 255, 255)) self.bullet = pygame.transform.rotate(self.bullet, angle)</code>
2.方向と単位ベクトル:
から方向ベクトルを計算するプレーヤーをマウスの位置に合わせて正規化し、単位を取得しますベクトル:
<code class="python">mx, my = pygame.mouse.get_pos() self.dir = (mx - x, my - y) length = math.hypot(*self.dir) if length == 0.0: self.dir = (0, -1) else: self.dir = (self.dir[0]/length, self.dir[1]/length)</code>
3.位置の更新:
速度で方向をスケーリングし、現在の位置に追加することで弾丸の位置を更新します:
<code class="python">self.pos = (self.pos[0]+self.dir[0]*self.speed, self.pos[1]+self.dir[1]*self.speed)</code>
4.弾丸の描画:
回転した弾丸を正しい位置に描画するには:
<code class="python">bullet_rect = self.bullet.get_rect(center = self.pos) surf.blit(self.bullet, bullet_rect) </code>
コード例:
<code class="python">import pygame import math class Bullet: def __init__(self, x, y): # Calculate direction and rotation ... # Create the bullet surface ... def update(self): # Update bullet position ... def draw(self, surf): # Draw the rotated bullet ... bullets = [] pos = (250, 250) run = True while run: # Game loop ... for bullet in bullets[:]: # Update bullets ... # Draw the scene ...</code>
以上がPyGameでマウス座標を使用して弾丸の狙いを定める方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。