2013-11-22 28 views
2

所以首先代碼:馬里奧跨屏跑得太快在pygame的

import pygame, sys 
from pygame.locals import * 

class Person(pygame.sprite.Sprite):  

    def __init__(self, screen): 
     self.screen = screen 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load("images/mariowalking0.png") 
     self.rect = self.image.get_rect() 
     self.rect.center = (320, 220) 
     self.poseNumber = 1 
    def update(self): 
     self.rect.centerx += 1 
     if self.rect.centerx > self.screen.get_width(): 
      self.rect.centerx = 0 
     self.poseNumber = (self.poseNumber + 1) 
     if self.poseNumber == 2: 
      self.poseNumber = 0 
     self.image = pygame.image.load("images/mariowalking" + str(self.poseNumber) +".png") 
    def main(): 
     screen = pygame.display.set_mode((640, 480)) 
     background = pygame.Surface(screen.get_size()) 
     background.fill((255, 255, 255)) 
     screen.blit(background, (0, 0)) 
     boy = Person(screen) 
     allSprites = pygame.sprite.Group(boy) 
     keepGoing = True 
     while keepGoing: 
      for event in pygame.event.get(): 
       if event.type == pygame.QUIT: 
        keepGoing = False 
        pygame.quit() 
      allSprites.clear(screen, background) 
      allSprites.update() 
      allSprites.draw(screen) 
      pygame.display.flip() 
    if __name__ == "__main__": 
     main() 

如果你想運行的代碼,精靈的圖像可以在這裏找到:http://imgur.com/a/FgfAd

馬里奧Sprite以非常快的速度穿過屏幕。儘管我說我要將centerx的價值增加1.任何想法爲什麼會發生這種情況。

順便說一句我對pygame真的很陌生,所以對不起,如果我忽略了一個明顯的事實或事情。

+0

更新被非常頻繁地調用...在每次翻轉後添加一些毫秒的延遲()...我認爲翻轉比更新() –

回答

10

您的程序將以不同的速度在不同的計算機上運行 - 這取決於計算機的速度。您可以使用pygame.time.Clock()在所有計算機上獲得相同的速度(非常慢的計算機除外),也可以降低遊戲速度和馬里奧速度。

clock = pygame.time.Clock() 

while keepGoing: 

    # rest of the code 

    pygame.display.flip() 

    clock.tick(30) 

現在遊戲將在所有計算機上繪製30幀每秒(FPS),馬里奧將每秒繪製30次。 25 FPS足以讓人眼看到漂亮的動畫。如果你需要可以設置更多的FPS - 例如60


此代碼(get_fps()tick()不aguments)告訴你如何快速的遊戲在您的計算機上。在我的電腦上,我獲得了大多數500 FPS(但有時甚至是1400 FPS)。

clock = pygame.time.Clock() 

while keepGoing: 

    # rest of the code 

    pygame.display.flip() 

    clock.tick() 
    print clock.get_fps()    

編輯:如果我minimalize窗口,我得到10 000 FPS :)


編輯:

如果您仍然需要慢下來馬里奧,並至少有30 FPS你必須檢查時間,然後再移動馬里奧。

class Person(pygame.sprite.Sprite):  

    def __init__(self, screen): 
     # rest of code 
     self.next_move = pygame.time.get_ticks() + 100 # 100ms = 0.1s 

    def update(self): 
     if pygame.time.get_ticks() >= self.next_move: 
      self.next_move = pygame.time.get_ticks() + 100 # 100ms = 0.1s 
      # rest of code 

我使用get_ticks()得到在毫秒(ms)當前時間(1000毫秒= 1秒),並計算下一個動作的時間(100毫秒= 0.1秒)。現在馬里奧會每秒做10步。這樣,即使我將FPS更改爲10 000,它也會每秒執行10步。

+0

更加昂貴但是,如果最小化窗口,則看不到圖形,哈哈 – justhalf

+1

是的,我沒有看到圖形 - 但我看到我的電腦有多快,我可以引以爲豪:) – furas

+1

考慮到事實上,Python似乎沒有緩衝'print'語句非常有效地屏幕,印刷聲明實際上可能讓你放慢速度。另一種可能性是直接將'theGameClock.get_fps()'的值繪製到屏幕上,或者甚至考慮使用'pygame.display.set_caption(gameClock.get_fps())'。 – SimonT