ホームページ  >  記事  >  バックエンド開発  >  Pygame の弾丸がマウスに向かって動かないのはなぜですか?

Pygame の弾丸がマウスに向かって動かないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-02 04:48:30233ブラウズ

Why Are My Pygame Bullets Not Moving Towards the Mouse?

Pygame の弾丸の軌道: トラブルシューティング ガイド

この説明は、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 サイトの他の関連記事を参照してください。

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