我正在学习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/
答案 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
应该清楚的是,每次加倍角度而不是增加角度。