2016-05-28 27 views
1

Ich habe das Spiel mit Sprites gemacht, um ein Plattformspiel zu machen.Pygame ist wegen Sprites zurückgeblieben?

Es war in Ordnung vor, aber jetzt ist es verzögert, also, wenn die Schwerkraft angewendet wird, bewegt es sich um eins und sieht unnatürlich aus.

Es war zunächst gut, wenn die Plattformen Rechtecke waren.

Ich änderte die Plattformen und fügte auch eine Liste von Feinden als Sprites ein.

Es funktioniert gut, aber es ist sehr laggy und es ist sehr langsam. Ich mag nicht, wie der Charakter "stottert". Was kann ich tun?

import pygame, sys 
from pygame.locals import * 
pygame.init() 

class Poppy(pygame.sprite.Sprite): 
    def __init__(self): #making the player 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load('POPPY.png') 
     self.rect = self.image.get_rect() 
     self.grav = .5 
     self.y_vel = 0 
     self.jumping = False 

    def jump_update(self): #checking the jumps 
     if self.jumping: 
      self.y_vel += self.grav 
      self.rect.y += self.y_vel 

    def jump(self): #the jump initializer 
     if not self.jumping: 
      self.y_vel = -50 
      self.jumping = True 

    def keys(self): #the keys 
     key = pygame.key.get_pressed() 
     dist = 5 
     if key[pygame.K_RIGHT]: # right key 
      self.rect.x += dist # move right 
     elif key[pygame.K_LEFT]: # left key 
      self.rect.x -= dist 

    def collide_check(self, platform_list): #check if it hit the ground or the platforms 
     for blocks in platform_list: 
      if pygame.sprite.collide_rect(self, blocks) == True: 
       self.rect.y = blocks.top 

     if self.rect.y >= 600-self.rect.height:    # BALL HITS TOP AND BOTTOM 
      self.grav = 0 
      self.y_vel = 0 
      self.rect.y = 600 - self.rect.height 
      self.jumping = False 

    def move(self): 
     self.rect.x += 0 
     self.rect.y += 10 

    def draw(self, surface): 
     surface.blit(self.image, (self.rect.x, self.rect.y)) 

class Platform(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load('levoneplatform.png') 
     self.rect = self.image.get_rect() 

class Enemy(pygame.sprite.Sprite): 

def __init__(self): 
    pygame.sprite.Sprite.__init__(self) 
    self.image = pygame.image.load('enemy.png') 
    self.rect = self.image.get_rect() 

class Menu(): 
    def setup(self): 
     background_image = pygame.image.load('menu.png').convert_alpha() 
     screen.blit(background_image, [0,0]) 


class LevOne(): 
    def setup(self): 

     background_image = pygame.image.load('night.png').convert_alpha() 
     screen.blit(background_image, [0, 0]) 


     platforms_one = [ (200,300), 
         (50,500), 
         (550,650), 
         (300,200), 
         (120,100) 
        ] 
     for k,v in platforms_one: 
      platform = Platform() 
      enemy = Enemy() 
      platform.rect.x = k 
      enemy.rect.x = k 
      platform.rect.y = v 
      enemy.rect.y = v - 44 
      platform_list.add(platform) 
      enemy_list.add(enemy) 

screen = pygame.display.set_mode((800,600)) 
enemy_list = pygame.sprite.Group() 
platform_list = pygame.sprite.Group() 
Poppy = Poppy() 
Menu = Menu() 
LevOne = LevOne() 


clock = pygame.time.Clock() 
level = 0 

while True: 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
     elif event.type == KEYDOWN: 
      if event.key == K_SPACE: 
       Poppy.jump() 
       Poppy.jump_update() 

    Menu.setup() 
    if event.type == MOUSEBUTTONDOWN: 
     x,y = pygame.mouse.get_pos() 
     if x >= 544.86 and x <= 700.86 and y <= 385.02 and y >= 340.03: 
      level = 1 

    if level == 1: 

     first_lives = 5 
     LevOne.setup() 

     Poppy.keys() 
     Poppy.move() 


     Poppy.draw(screen) 
     platform_list.draw(screen) 
     enemy_list.draw(screen) 


     Poppy.draw(screen) 

    pygame.display.update() 

Antwort

1

festlegen können Ich stelle fest, dass Sie bei jeder Iteration Ihren LevOne-Hintergrund laden und die verschiedenen Sprites initialisieren. Dies ist eine einmalige Operation und daher ist es bei jeder Iteration nicht notwendig und verursacht wahrscheinlich das Stottern, das Sie erleben. Sie sollten den Hintergrund in eine __init__ Ihrer LevOne-Klasse laden, zusammen mit den Sprites, die in der Ebene verwendet werden, und dann auf die Hintergrundvariable zugreifen, wenn Sie in der Setup-Methode blitzen.

Statt dessen;

class LevOne(): 
    def setup(self): 

     background_image = pygame.image.load('night.png').convert_alpha() 
     screen.blit(background_image, [0, 0]) 


     platforms_one = [ (200,300), 
         (50,500), 
         (550,650), 
         (300,200), 
         (120,100) 
        ] 
     for k,v in platforms_one: 
      platform = Platform() 
      enemy = Enemy() 
      platform.rect.x = k 
      enemy.rect.x = k 
      platform.rect.y = v 
      enemy.rect.y = v - 44 
      platform_list.add(platform) 
      enemy_list.add(enemy) 

Try this:

class LevOne(): 
    def __init__(self): 
     self.background_image = pygame.image.load('night.png').convert_alpha() 
     platforms_one = [ (200,300), 
         (50,500), 
         (550,650), 
         (300,200), 
         (120,100) 
        ] 
     for k,v in platforms_one: 
      platform = Platform() 
      enemy = Enemy() 
      platform.rect.x = k 
      enemy.rect.x = k 
      platform.rect.y = v 
      enemy.rect.y = v - 44 
      platform_list.add(platform) 
      enemy_list.add(enemy) 
    def setup(self): 
     screen.blit(self.background_image, [0, 0]) 

Das gleiche Problem gibt es für die Menu-Klasse bin ich zu bemerken. Die gleiche Änderung sollte wie folgt vorgenommen werden.

class Menu(): 
    def __init__(self): 
     self.background_image = pygame.image.load('menu.png').convert_alpha() 
    def setup(self): 
     screen.blit(self.background_image, [0,0]) 

Ich will nur den Grund, warum ich dies langsam läuft glauben wiederholen, dass es bei jeder Iteration eine Datei aus dem System zu öffnen ist eine Frage, die ein langsamer Vorgang ist, und halten Sie auch Ihre Sprite Erstellen von Listen für Stufe eins, die nur einmal durchgeführt werden muss.

0

Versuchen am Ende der während "clock.tick", mit dem Argument, FPS (Variable) einzufügen:

clock.tick(60) #60 are the frames per second 

pygame.display.update() 

dieser Funktion können Sie das Spiel frame_rate