シンプルなトップダウンシューティングゲームを作成するのにpygame
を使用しています。トップダウンの観点から角度計算をたくさん行っています。のは、簡単な矢印と一例としてボールを使用してみましょう、私は、赤い矢印は関係なく、青いボールが動くところの青いボールを指しておきたい:座標グリッドを上下逆にするための対策?
そして、簡単に十分な、私は必要なように見えましたatan2
:
angle = math.atan2(blue.y - red.y, blue.x - red.x)
しかし、問題は、このような数学的な座標グリッドのatan2
作品です:
どこalpha = math.atan2(blue.y - red.y, blue.x - red.x)
しかし、(少なくともWindows上)pygame
のあるものは、グリッド座標は数学的な座標グリッドのように動作しないということです、それはゲーム画面の左上隅から始まる逆さま実際には:
青いボールが数学的にblue.y
アップし、より高いですように見えながら、そうred.y
よりも大きくする必要があり、これは、逆に、実際にそうではありませんダウンPythonのmath.atan2()
が行うグリッドを、座標私が知っていた元の計算:
angle = math.atan2(blue.y - red.y, blue.x - red.x)
実際に正しい角度の否定が得られます。
今、私が思いついた明白な最初のソリューションだけで符号を反転することで、公正に十分な、それはこれで働いていた:
angle = -math.atan2(blue.y - red.y, blue.x - red.x)
しかし、私は上のベース、さらに計算を行うために必要ないったん問題が再び開始技術的には逆さまになっている、以前に計算された角度。
「永続的に」この問題を解決するにはどうすればよいですか?私はでそれを解決するために管理し、この特定のケースでは
class Zombie(Entity):
def __init__(self, *args, target=None, **kwargs):
super().__init__(*args, **kwargs)
self.target = target
def update(self, dt, app):
if self.target:
# Face towards target
dx = self.target.x - self.x
dy = self.target.y - self.y
self.angle = math.atan2(dy, dx)
# Change velocity towards target
speed = self.get_max_speed()
vel_x = math.cos(angle) * speed
vel_y = math.sin(angle) * speed
self.velocity = (vel_x, vel_y)
else:
self.velocity = (0, 0)
# Moves the zombie based on velocity
super().update(dt, app)
:ここ
が、私はこれを必要とする場所の実際の例ですが、私は何もしませんが、それは与えられた目標を次の「ゾンビ」の実体を持っています後で使用するために別々の変数に角度を格納し、self.angle
の設定時に別途それを否定:
# Face towards target
dx = self.target.x - self.x
dy = self.target.y - self.y
angle = math.atan2(dy, dx)
self.angle = -angle
# Change velocity towards target
speed = self.get_max_speed()
vel_x = math.cos(angle) * speed
vel_y = math.sin(angle) * speed
self.velocity = (vel_x, vel_y)
しかし、これはちょうどより多くのバグのために物乞いされ、私は問題をより一般的な解決策を探しています。
pygameには計算のための 'pygame.math.Vector2'があります。 BTW:「数学」モジュールでも角度に問題はありません – furas
私はこの解決策にも問題はありません。あなたはどういう意味ですか?私は通常 'pygame.math.Vector2'も使用します。 [ここには例があります](https://stackoverflow.com/a/47166984/6220679)、私は角度を得るために 'math.atan2'の代わりに' as_polar'メソッドを使います。 – skrx
さて、前に 'Vector2'について聞いたことはありませんでした。リファクタリングしてみてください...ありがとうございました –