【问题标题】:How do I make my pygame levels more efficient? [closed]如何让我的 pygame 关卡更有效率? [关闭]
【发布时间】:2021-04-05 14:24:28
【问题描述】:

为了提高效率,我一直在重做我的很多游戏,在我为每个级别设置函数之前,每个级别都有大约 300 多行重复的代码,但我已经把它拿出来了'正在尝试让一级功能正常运行。下面是我的代码,关于如何让我的代码在我运行游戏时玩 level1 的任何帮助,因为现在它只显示背景屏幕,没有敌人、平台或角色。

import pygame
import time
import random
from pygame.math import Vector2 as vec

pygame.init()

# Set the screen size
screen = pygame.display.set_mode([700, 500])

# Define the colours for text
black = (0,0,0)
white = (255,255,255)
green = (0,51,0)
light_green = (51,102,0)
PLAYER_FRICTION = 0.0
PLAYER_ACC = 3
HEIGHT = 500
WIDTH = 700
FPS = 60

# Set Display

pygame.display.set_caption('Jungle Blast')
clock = pygame.time.Clock()


class Character(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.image.load("TheoHills.png")

        self.rect = self.image.get_rect(topleft=(50, 300))
        self.x = 50
        self.y = 300
        self.pos = vec(50, 300)
        self.vel = vec(0,0)
        self.acc = vec(0,0)


    def characterJump(self,platforms):
        self.rect.y += 1
        hits = pygame.sprite.spritecollide(self, platforms, False)
        self.rect.y -= 1
        if hits:
            self.vel.y = -18

    def update(self):
        self.acc = vec(0, 0.5)
        keys = pygame.key.get_pressed()
        if keys[pygame.K_a]:
            self.acc.x = -PLAYER_ACC
        if keys[pygame.K_d]:
            self.acc.x = PLAYER_ACC

        # apply friction
        self.vel.x *= PLAYER_FRICTION
        self.vel += self.acc
        self.pos += self.vel

        self.rect.midbottom = self.pos


        if self.pos.y == 500:
            background_image = pygame.image.load("Lose Screen.png")


        if self.pos.x > 699:
            level2()

class Bullet(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()

        self.image = pygame.image.load("Bullet.png").convert()
        self.image.set_colorkey(black)

        self.rect = self.image.get_rect()

    def update(self):
            self.rect.x += 10

class levelInd(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("1 out of 5.png")
        self.rect = self.image.get_rect(topleft=(20, 20))
        self.pos = vec(20, 20)

class Platform(pygame.sprite.Sprite):
    def __init__(self, x, y, w, h):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((100, 88))
        self.image.fill(black)
        self.image = pygame.image.load("Platform1.png")
        self.rect = self.image.get_rect(topleft=(x, y))

class Enemy(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((100, 50))
        self.image = pygame.image.load("RobberStanding.png")
        self.rect = self.image.get_rect(topleft=(x,y))

def draw_text(surface, text, size, x, y,font_name):
    font = pygame.font.SysFont(str(font_name), size)
    text_surface = font.render(text, True, black)
    text_rect = text_surface.get_rect()
    text_rect.topleft = (x, y)
    surface.blit(text_surface, text_rect)

class levels():
    
    levelind = levelInd()
    character = Character()
    all_sprites = pygame.sprite.Group()
    platforms = pygame.sprite.Group()
    enemies = pygame.sprite.Group()
    bullet_list = pygame.sprite.Group()
    background_image = pygame.image.load("JungleBackground.png")
    
    running = True
    while running:
            clock.tick(FPS)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    running = False
                    pygame.display.quit()
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_w:
                        character.characterJump(platforms)

                if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:

                    bullet = Bullet()

                    bullet.rect.x = character.rect.x + 10
                    bullet.rect.y = character.rect.y + 50

                    bullet_list.add(bullet)
                    all_sprites.add(bullet)

                    for bullet in bullet_list:

                    # See if the enemy is hit
                        enemyHit = pygame.sprite.spritecollide(bullet,enemies,True)
                        if enemyHit:
                            enemies.remove(Enemy)
                            score1 += 10
                        if bullet.rect.x > 700:
                            bullet_list.remove(bullet)

            if character.rect.y >= 500:
                background_image = pygame.image.load("Lose Screen.png")
                pygame.display.update()
                all_sprites.empty()


            death = pygame.sprite.spritecollide(character, enemies, True)
            if len(death) > 0:
                background_image = pygame.image.load("Lose Screen.png")
                all_sprites.empty()


            all_sprites.update()

            hits = pygame.sprite.spritecollide(character, platforms, False)
            for platform in hits:
                if character.vel.y > 0:
                    character.rect.bottom = character.rect.bottom
                    character.vel.y = 0
                elif character.vel.y < 0:
                    character.rect.top = character.rect.top
                    character.vel.y = 3

                character.pos.y = character.rect.bottom


            screen.blit(background_image,[0,0])
            all_sprites.draw(screen)
            pygame.display.flip()
    

    def level1():
        
        done = False
        clock = pygame.time.Clock()
        font_name = pygame.font.match_font("Arial")
        black = ( 0, 0, 0)
        white = ( 255, 255, 255)
        x = 300
        y = 88

        e1 = Enemy(250, 125)

        enemies.add(e1)

        all_sprites.add(character)
        all_sprites.add(levelind)
        all_sprites.add(e1)

        p1 = Platform(-80, 400, WIDTH - 400, HEIGHT - 10)
        p2 = Platform(175, 210, WIDTH - 400, HEIGHT - 10)
        p3 = Platform(500, 400, WIDTH - 400, HEIGHT - 10)

        all_sprites.add(p1, p2, p3)
        platforms.add(p1, p2, p3)

        score1 = 0

    level1()

这是游戏运行时显示的图像。

【问题讨论】:

    标签: python python-3.x performance pygame


    【解决方案1】:

    我认为您应该看看您的“级别”课程。 例如,给它一个适当的 init 方法。 我通过如下修改类来运行游戏:

    class levels():
    def __init__(self):
        self.levelind = levelInd()
        self.character = Character()
        self.all_sprites = pygame.sprite.Group()
        self.platforms = pygame.sprite.Group()
        self.enemies = pygame.sprite.Group()
        self.bullet_list = pygame.sprite.Group()
        self.background_image = pygame.image.load("1LPqX.png")
        self.score1 = 0
        self.running = True
    
    def run(self):
        while self.running:
            self.level1()
            clock.tick(FPS)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.running = False
                    pygame.display.quit()
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_w:
                        self.haracter.characterJump(self.platforms)
    
                if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
    
                    bullet = Bullet()
    
                    bullet.rect.x = self.character.rect.x + 10
                    bullet.rect.y = self.character.rect.y + 50
    
                    self.bullet_list.add(bullet)
                    self.all_sprites.add(bullet)
    
                    for bullet in self.bullet_list:
    
                        # See if the enemy is hit
                        enemyHit = pygame.sprite.spritecollide(bullet, self.enemies, True)
                        if enemyHit:
                            self.enemies.remove(Enemy)
                            self.score1 += 10
                        if bullet.rect.x > 700:
                            self.bullet_list.remove(bullet)
    
            if self.character.rect.y >= 500:
                self.background_image = pygame.image.load("1LPqX.png")
                pygame.display.update()
                self.all_sprites.empty()
    
            death = pygame.sprite.spritecollide(self.character, self.enemies, True)
            if len(death) > 0:
    
                self.background_image = pygame.image.load("1LPqX.png")
                self.all_sprites.empty()
    
            self.all_sprites.update()
    
            hits = pygame.sprite.spritecollide(self.character, self.platforms, False)
            for platform in hits:
                if self.character.vel.y > 0:
                    self.character.rect.bottom = self.character.rect.bottom
                    self.character.vel.y = 0
                elif self.character.vel.y < 0:
                    self.character.rect.top = self.character.rect.top
                    self.character.vel.y = 3
    
                self.character.pos.y = self.character.rect.bottom
    
            screen.blit(self.background_image, [0, 0])
            self.all_sprites.draw(screen)
            pygame.display.flip()
    
    def level1(self):
    
        done = False
        clock = pygame.time.Clock()
        font_name = pygame.font.match_font("Arial")
        black = (0, 0, 0)
        white = (255, 255, 255)
        x = 300
        y = 88
    
        e1 = Enemy(250, 125)
    
        self.enemies.add(e1)
    
        self.all_sprites.add(self.character)
        self.all_sprites.add(self.levelind)
        self.all_sprites.add(e1)
    
        p1 = Platform(-80, 400, WIDTH - 400, HEIGHT - 10)
        p2 = Platform(175, 210, WIDTH - 400, HEIGHT - 10)
        p3 = Platform(500, 400, WIDTH - 400, HEIGHT - 10)
    
        self.all_sprites.add(p1, p2, p3)
        self.platforms.add(p1, p2, p3)
    
        self.score1 = 0
    
    # level1()
    

    (好像没有正确复制缩进,“class levels()”下面的所有内容都必须缩进4个空格)

    添加

    if __name__ == '__main__':
        game = levels()
        game.run()
    

    在文件的底部。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-08
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      相关资源
      最近更新 更多