How do I make my pygame levels more efficient?

Lucas Ogilvie

I've been redoing a lot of my game in order to make it more efficient, before I had functions for each level and it had about 300+ repeated lines of code for each level, I've taken it out however I'm trying to get level one to function properly now. Below is my code, any help as to how to get my code to play level1 when I run the game as right now it only displays the background screen and none of the enemies, platforms or the character.

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

This is the image that shows up whenever the game is run. Background Image

olsch88

I Think you should take a look at your "levels" Class. Give it a proper init method, for example. I got the game running by modifing the class as follows:

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

(seems like the indentation was not copied properly, everything below "class levels()" has to be indented 4 more spaces)

and adding

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

at the bottom of the file.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

Display flickering in pygame (how to make my code more efficient)

How do I make my VBA code more efficient using For each loops for three different ranges?

How can I make my pandas code more efficient?

How can I make my trie more efficient?

How can I make my website more efficient?

How can I make my IsItAHoliday function more efficient?

How can I make my VBA error handling more efficient

How can I concatenate my code properly and make this more efficient?

How do I make this matching list code more efficient?

How do I make the selection function more efficient?

How do I make the following C structure more memory efficient?

How to make my SELECT query more efficient?

How to make my routes more efficient?

How to make my code more efficient (beginner :)

How do I make EF Core 7 query with multiple navigations/levels efficient with AutoMapping to Dto?

How do i make my code for my helper more slim?

How do i make more spacing my my mui typography

How do I make my pygame window minimze and maximize?

How do I make my Pygame Sprite jump higher and farther?

How would I make this script more efficient?

How can I make this loop more efficient?

How can I make this more efficient in Android?

How would I make this more efficient? (python)

How do I make my JavaScript code more short?

How do i make my method more Object Oriented?

How do I make my git history more coherent?

How can I make my code more efficient in R - It's to repetitive

Python: How can I make my implementation of bubble sort more time efficient?

android - SQL database, how can I make my code more efficient