2013-01-11 29 views
1

我正在學習Pygame,和大多數人一樣(我認爲)正在編寫一個小遊戲來處理它。這就是說,如果它很糟糕,請隨時回答我的問題以及批評其他任何內容。Python - 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)之間計算的時間,Shot參數是8-16之間的randint。

我希望一切都有道理。如果沒有,請告訴我。我會盡力澄清。先謝謝您的幫助。

如果需要更多上下文,下面是源代碼的鏈接。別擔心,沒有太多。 http://code.google.com/p/scroller-practice/source/browse/

回答

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 

應該很清楚,你每次加倍的角度,而不是增加了。

+1

這是正確的。 'angle + = angle'最終與'angle * = 2'(或'angle = angle + angle',或'angle = angle * 2')相同,這當然不是預期的行爲。根據你的數字,我們看到前幾個增量是45°,然後是90°,然後是180°,然後是360°的整數倍,然後總是落在相同的位置,可能導​​致OP提到的「增厚」。 – heltonbiker

+0

哈哈!哦,哇。我怎麼錯過了。非常感謝您指出這一點!然而,我仍然對增速放緩感到好奇。 X平面上的鏡頭比Y平面上的更多。所以,直下/上下變快,左右變慢。有什麼想法嗎? – jtsmith1287

+0

我有一個可能的理論(但它是一個猜測):你的職位寫成「(math.sin(bullet.angle)* bullet.speed)* time_passed」,而不是「orig_pos +(math.sin(bullet.angle )* bullet.speed)* time_passed「是否有可能父母對象的速度影響了鏡頭的速度? – BostonJohn