1

我有 2 个精灵(嗯...... 3)。一个精灵以随机角度(以弧度为单位)以稳定的速度沿直线行进。另一个精灵正在向移动的精灵射击。目前,射弹精灵落在目标的稍微后面,因为射弹在发射时是根据目标的中心来确定其目的地的。我可以让它不断更新,但如果弹丸像寻的导弹一样改变方向,那看起来会很傻。

那么,我到底该怎么呢?

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,并将其移动和帧相乘. 然而,使用这种方法,如果玩家的屏幕由于某种原因(这很常见)而卡住,弹丸将完全错过。太好了...我回到第一方,哈哈。

4

1 回答 1

1

If you fix your timestep, you will have stability in your physics. You can keep a variable video framerate, but a constant timestep for physics.

The famous fix-your timestep link http://gafferongames.com/game-physics/fix-your-timestep/ and a pygame example: http://www.pygame.org/wiki/ConstantGameSpeed?parent=CookBook

Theres's a bunch of info and sublinks at https://gamedev.stackexchange.com/questions/4995/predicting-enemy-position-in-order-to-have-an-object-lead-its-target

于 2013-05-14T21:03:07.767 回答