この説明は、Pygame でマウスの位置に向かって弾丸を発射するときに発生する一般的な問題に対処することを目的としています。
発砲時には、弾丸の位置とマウスに向かう方向ベクトルを決定する必要があります。ただし、提供されているコードでは方向ベクトルが正しく設定されていないため、弾丸が予期せず移動したり、静止したままになったりします。
この問題を修正するには、方向ベクトルを計算して、次のように正規化 (単位ベクトルに変換) します:
開始位置とマウス位置を取得します:
<code class="py">self.pos = (x, y) mx, my = pygame.mouse.get_pos()</code>
方向ベクトルを計算します:
<code class="py">self.dir = (mx - x, my - y)</code>
ベクトルを正規化します:
<code class="py">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>
ベクトルの角度を計算します:
<code class="py">angle = math.degrees(math.atan2(-self.dir[1], self.dir[0]))</code>
方向が決定したら、その速度に応じて弾丸を回転および更新できます。
弾丸:
<code class="py">self.bullet = pygame.Surface((7, 2)).convert_alpha() self.bullet.fill((255, 255, 255)) self.bullet = pygame.transform.rotate(self.bullet, angle)</code>
弾丸の位置を更新します:
<code class="py">self.pos = (self.pos[0]+self.dir[0]*self.speed, self.pos[1]+self.dir[1]*self.speed)</code>
正しく表示するには回転した弾丸の場合、その境界四角形を使用して正しい位置の中央に配置します:
回転した弾丸の境界四角形を取得します:
<code class="py">bullet_rect = self.bullet.get_rect(center = self.pos)</code>
箇条書きを描画します:
<code class="py">surf.blit(self.bullet, bullet_rect)</code>
以上がPygame の弾丸がマウスに向かって動かないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。