Python - Pygame - 处理动画的角度和速度

时间:2013-01-11 23:06:05

标签: python animation 2d pygame

我正在学习Pygame,和大多数人一样(我认为)正在写一个小游戏来处理它。话虽这么说,如果它糟透了,请随时回答我的问题并批评其他任何事情。

所以,问题在于我的“老板”对象。它应该从上面进入游戏,然后开始在360度圈内射击随机数量的镜头。它有时会起作用,但我注意到一些我没想到的事情。 1)子弹应该以恒定速度移动,但它们似乎随着时间的推移而减速,并且沿着Y平面比X更快地移动.2)尽管最少8次射击,我经常只看到3-4次(漂亮)确定有些是重叠的,因为我经常看到一个看起来有点大的镜头),有些会向下射击并向右射击,而另一个射向相反方向。它不应该这样做。所以,这是代码。我将发布射击计算,然后是子弹(火球)实例。其余的是我见过的非常典型的。我通过调用它们所在的精灵组来更新和绘制,这些精灵组在我的主循环的底部被调用。

def shoot (self, shots, time_passed):

    angle = (math.pi*2)/shots
    for i in xrange(shots):
        bullet = Fireball("fireball.png", self.direction, 100)
        bullet.angle = angle
        bullet.pos = ((math.sin(bullet.angle) * bullet.speed) * time_passed,
                      (math.cos(bullet.angle) * bullet.speed) * time_passed)
        Fireball.container.remove(bullet)
        EnemyFireball.container.add(bullet)
        bullet.rect.center = self.rect.center
        angle += angle

这就是子弹:

class Fireball (pygame.sprite.Sprite):

    container = pygame.sprite.Group()

    def __init__ (self, image, direction, speed):
        pygame.sprite.Sprite.__init__ (self, self.container)

        self.image = pygame.image.load(image).convert_alpha()
        self.rect = self.image.get_rect()
        self.radias = ((self.rect.width/2 + self.rect.height/2)/2)
        self.speed = speed
        self.direction = direction
        self.angle = -1

    def update (self, time_passed):

        if self.angle != -1:
            self.rect.move_ip(self.pos)
        else:
            self.rect.move_ip(0, (self.speed*time_passed) * self.direction)
        if self.rect.bottom < 0: self.kill()
        if self.rect.top > 2000: self.kill()

如果我可以画一张照片...... 0&lt; - boss,以及子弹线。

我的期望:

\|/  
-0-  
/|\

我所看到的:

\  
 0-  
 |\  

......直接向下的子弹总是看起来更大,所以我认为有一些重叠,但我不明白为什么。 Time_passed只是在Clock.tick(60)之间计算的时间,而shot参数是8-16之间的randint。

我希望一切都有道理。如果没有,请告诉我。我会试着澄清一下。在此先感谢您的帮助。

如果需要更多上下文,这里是源的链接。别担心,没有多少。 http://code.google.com/p/scroller-practice/source/browse/

1 个答案:

答案 0 :(得分:2)

你需要在两个变量中保持角度。

正确的方法是

curr_angle = 0
angle_step = (math.pi*2)/shots

然后在每个循环结束时

curr_angle += angle_step

你的方式,你最终得到角度角,然后2 *角,然后4 *角等等。

如果你带走所有其他部分并且只有一个循环

angle = (math.pi*2)/shots
for i in xrange(shots):
    angle += angle 

应该清楚的是,每次加倍角度而不是增加角度。