2016-05-28 2 views
1

Я сделал игру, как это, с спрайтами, чтобы сделать платформу.Pygame отстает из-за спрайтов?

Это было хорошо, но теперь оно отстает, поэтому, когда применяется сила тяжести, он движется одним и выглядит неестественно.

Сначала было хорошо, когда платформы были прямоугольниками.

Я изменил платформы, а также ввел список врагов в качестве спрайтов.

Он отлично работает, но он очень лаги, и он очень медленный. Мне не нравится, как персонаж «заикается». Что мне делать?

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() 

ответ

1

Я замечаю, что вы загружаете свой фон LevOne на каждой итерации, а также инициализируете различные спрайты. Это одноразовая операция, и поэтому делать это на каждой итерации не требуется и, вероятно, вызывает заикание, которое вы испытываете. Вы должны загрузить фон в __init__ вашего класса LevOne, а также любые спрайты, которые будут использоваться на уровне, а затем получить доступ к фоновой переменной, когда они будут бить в методе установки.

Вместо этого;

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) 

Попробуйте это:

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]) 

Та же проблема существует для класса Menu Я замечаю. Такое же изменение должно быть сделано следующим образом.

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]) 

Я просто хочу, чтобы подтвердить причину я считаю, что это работает медленно, является то, что она того, чтобы открыть файл из системы на каждую итерацию, который является медленной работой, и вы также продолжать создавать свои списки спрайтов для первого уровня, который нужно выполнить только один раз.

0

Попробуйте вставить в конце время "clock.tick", с аргументом FPS (переменной):

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

pygame.display.update() 

эта функция позволяет вам установить игру frame_rate

Смежные вопросы