2016-07-22 8 views
1

Ich versuche, ein "Runner" -Stil-Spiel in PyGame (wie Geometry Dash) zu machen, wo sich der Hintergrund ständig bewegt. Bis jetzt funktioniert alles gut, aber das Rendern der Hintergrundbilder beschränkt die Bildfrequenz auf mehr als 35 Bilder pro Sekunde. Bevor ich das unendliche/wiederholende Hintergrundelement hinzugefügt habe, könnte es leicht mit 60 fps laufen. Diese beiden Codezeilen sind dafür verantwortlich (wenn das Spiel entfernt wird, kann es mit 60 + fps laufen):Das Rendern eines großen Bildes in PyGame verursacht niedrige Framerate

screen.blit (bg, (bg_x, 0)) | screen.blit (bg, (bg_x2, 0))

Gibt es etwas, was ich tun könnte, um das Spiel schneller laufen zu lassen? Danke im Voraus!

Simplified Source Code:

import pygame 
pygame.init() 

screen = pygame.display.set_mode((1000,650), 0, 32) 
clock = pygame.time.Clock() 

def text(text, x, y, color=(0,0,0), size=30, font='Calibri'): # blits text to the screen 
    text = str(text) 

    font = pygame.font.SysFont(font, size) 
    text = font.render(text, True, color) 

    screen.blit(text, (x, y)) 

def game(): 
    bg = pygame.image.load('background.png') 
    bg_x = 0 # stored positions for the background images 
    bg_x2 = 1000 

    pygame.time.set_timer(pygame.USEREVENT, 1000) 
    frames = 0 # counts number of frames for every second 
    fps = 0 

    while True: 
     frames += 1 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit() 
       quit() 
      if event.type == pygame.USEREVENT: # updates fps every second 
       fps = frames 
       frames = 0 # reset frame count 

     bg_x -= 10 # move the background images 
     bg_x2 -= 10 

     if bg_x == -1000: # if the images go off the screen, move them to the other end to be 'reused' 
      bg_x = 1000 
     elif bg_x2 == -1000: 
      bg_x2 = 1000 

     screen.fill((0,0,0)) 
     screen.blit(bg, (bg_x, 0)) 
     screen.blit(bg, (bg_x2, 0)) 

     text(fps, 0, 0) 

     pygame.display.update() 
     #clock.tick(60) 

game() 

Hier ist das Hintergrundbild:

enter image description here

Antwort

1

Haben Sie versucht convert() mit?

bg = pygame.image.load('background.png').convert() 

Vom documentation:

Sie wollen oft Surface.convert() ohne Argumente aufrufen, um eine Kopie zu erstellen, die schneller auf dem Bildschirm zeichnen wird.

Für Alpha Transparenz, wie in .png Bildern verwenden Sie die Methode convert_alpha() nach dem Laden, so dass das Bild pro Pixel Transparenz hat.

+0

Vielen Dank! Es läuft jetzt wie eine Brise! –