首先是代码:
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
Mario 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()
没有标记)显示您计算机上的游戏速度有多快。在我的电脑上,我大多获得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步。:)