我正在學習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/
這是正確的。 'angle + = angle'最終與'angle * = 2'(或'angle = angle + angle',或'angle = angle * 2')相同,這當然不是預期的行爲。根據你的數字,我們看到前幾個增量是45°,然後是90°,然後是180°,然後是360°的整數倍,然後總是落在相同的位置,可能導致OP提到的「增厚」。 – heltonbiker
哈哈!哦,哇。我怎麼錯過了。非常感謝您指出這一點!然而,我仍然對增速放緩感到好奇。 X平面上的鏡頭比Y平面上的更多。所以,直下/上下變快,左右變慢。有什麼想法嗎? – jtsmith1287
我有一個可能的理論(但它是一個猜測):你的職位寫成「(math.sin(bullet.angle)* bullet.speed)* time_passed」,而不是「orig_pos +(math.sin(bullet.angle )* bullet.speed)* time_passed「是否有可能父母對象的速度影響了鏡頭的速度? – BostonJohn