【问题标题】:Mario running across screen too fast in pygame在pygame中马里奥在屏幕上跑得太快了
【发布时间】:2013-11-22 00:53:58
【问题描述】:

所以首先是代码:

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

马里奥精灵以非常快的速度在屏幕上运行。尽管我说过我要将 centerx 的值增加 1。任何想法为什么会发生这种情况。

顺便说一句,我对 pygame 真的很陌生,如果我忽略了一个明显的事实或其他东西,我很抱歉。

【问题讨论】:

  • update 被非常频繁地调用......在每次翻转()之后添加几毫秒的延迟......而且我认为翻转比更新()更昂贵

标签: python animation python-3.x pygame


【解决方案1】:

您的程序将在不同的计算机上以不同的速度运行 - 这取决于计算机的速度。您可以使用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() 不带参数)显示您的计算机上的游戏速度有多快。在我的电脑上,我得到的主要是 500 FPS(但有时甚至是 1400 FPS)。

clock = pygame.time.Clock()

while keepGoing:

    # rest of the code

    pygame.display.flip()

    clock.tick()
    print clock.get_fps()            

编辑:如果我最小化窗口,我会得到 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 步 :)。

【讨论】:

  • 但是如果把窗口最小化就看不到图形了,哈哈
  • 是的,我看不到图形 - 但我看到我的电脑有多快,我可以自豪 :)
  • 考虑到 Python 似乎不能非常有效地将 print 语句缓冲到屏幕上,打印语句实际上可能会减慢您的速度。另一种可能是直接将theGameClock.get_fps() 的值绘制到屏幕上,甚至考虑使用pygame.display.set_caption(gameClock.get_fps())
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2018-12-23
  • 2015-09-05
  • 1970-01-01
  • 2018-10-04
相关资源
最近更新 更多