python - sprites - Mario corriendo por la pantalla demasiado rápido en pygame
pygame español (1)
Su programa se ejecutará con una velocidad diferente en una computadora diferente, depende de la velocidad de la computadora. Puede usar pygame.time.Clock () para obtener la misma velocidad en todas las computadoras (excepto las muy lentas) y también para disminuir la velocidad de Mario y del juego.
clock = pygame.time.Clock()
while keepGoing:
# rest of the code
pygame.display.flip()
clock.tick(30)
Ahora el juego dibujará 30 cuadros por segundo (FPS) en todas las computadoras y Mario se dibujará 30 veces por segundo. 25 FPS es suficiente para que el ojo humano vea una buena animación. Si lo necesita, puede establecer más FPS, por ejemplo 60.
Este código ( get_fps()
y tick()
sin agudamientos) le muestra qué tan rápido es el juego en su computadora. En mi computadora obtengo casi 500 FPS (pero a veces incluso 1400 FPS).
clock = pygame.time.Clock()
while keepGoing:
# rest of the code
pygame.display.flip()
clock.tick()
print clock.get_fps()
EDITAR: si minimizo la ventana obtengo 10 000 FPS :)
EDITAR:
Si aún necesitas reducir la velocidad de Mario y tener al menos 30 FPS, debes controlar el tiempo antes de mover a Mario.
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
Utilizo get_ticks()
para obtener la hora actual en milisegundos (ms) (1000 milisegundos = 1 segundo) y calcular la hora del siguiente movimiento (100 milisegundos = 0.1 segundo). Ahora Mario hará 10 pasos por segundo. De esta manera, siempre hará 10 pasos por segundo, incluso si cambio el FPS a 10 000 :).
Entonces, antes que nada, el código:
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()
Si desea ejecutar el código, las imágenes de los sprites se pueden encontrar aquí: http://imgur.com/a/FgfAd
El Mario Sprite corre por la pantalla a un ritmo muy rápido. A pesar de que dije que voy a aumentar el valor de centerx en 1. Cualquier idea de por qué esto está sucediendo.
Por cierto, soy nuevo en pygame, así que lo siento si estoy pasando por alto un hecho obvio o algo así.