私は 2 つのスプライトを持っています (うーん... 3)。1 つのスプライトがランダムな角度 (ラジアン単位) で一定の速度で直線的に移動しています。もう一方のスプライトは、動いているスプライトを撃っています。現在、発射物のスプライトはターゲットのわずかに後ろに着地します。これは、発射物が発射されたときにターゲットの中心に基づいて目的地が与えられるためです。常に更新することもできますが、発射体がホーミング ミサイルのように方向を変えた場合、それはばかげているように見えます。
では、いったいどうすればいいのでしょうか。
class Projectile (pygame.sprite.Sprite):
container = pygame.sprite.Group()
def __init__ (self, pos, target):
pygame.sprite.Sprite.__init__ (self, self.container)
self.image = FIREBALL
self.rect = self.image.get_rect()
self.rect.center = pos
self.true_loc = self.rect.center
self.destination = target.rect.center
self.speed = 200
diffx = self.destination[0]-self.rect.center[0]
diffy = self.destination[1]-self.rect.center[1]
self.angle = math.atan2(diffx, diffy)
def combineCoords (self, coord1, coord2):
return map(sum, zip(*[coord1, coord2]))
def update (self, time_passed):
new_move = (math.sin(self.angle) * time_passed * self.speed,
math.cos(self.angle) * time_passed * self.speed)
self.true_loc = self.combineCoords(self.true_loc, new_move)
self.rect.center = self.true_loc
ターゲットは、必要な特定のクラス属性を持つ基本的に同じものであるクラス インスタンスです。具体的には、発射物がそこに到達するために移動しなければならない距離に基づいて、ターゲットの角度と速度に基づいてターゲットが移動する距離を計算する方法がわかりません。どちらも速度と角度が異なります。数学の授業で注意を払うべきだった...
編集: プレイヤーのフレームレートに基づいてスプライトを動的に移動するため、最初に予想したよりも少しトリッキーになることがわかりました。発射物と target.center の間の距離を計算し、その数を目的地に到達するまでに通過するフレーム数で割り、ターゲットの角度で移動して self.destination を更新し、その動きとフレームを乗算しようとしました。 . ただし、この方法では、プレイヤーの画面が何らかの理由でヒッチした場合 (これはよくあることです)、発射物は完全に外れます。よかった…振り出しに戻ったよ、はは。