1

我正在学习 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 <-- 老板,以及子弹线。

我的期望:

\|/  
-0-  
/|\

我所看到的:

\  
 0-  
 |\  

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

我希望一切都说得通。如果没有,请告诉我。我会尽力澄清。在此先感谢您的帮助。

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

4

1 回答 1

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 

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

于 2013-01-11T23:15:17.137 回答