Python Forum
[PyGame] Game boss causing huge slowdown
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[PyGame] Game boss causing huge slowdown
#4
How do you know this is the slow part ? Did you profile code ?

Example how you could improve code. Need to improve body movement in my code.
import os
import pygame
from pygame.sprite import Group, Sprite

class SimpleSprite(Sprite):
    def __init__(self, image, position, anchor):
        Sprite.__init__(self)
        self.image = image
        self.rect = image.get_rect(**{anchor: position})

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

class VectorSprite(SimpleSprite):
    def __init__(self, image, position, anchor):
        SimpleSprite.__init__(self, image, position, anchor)
        self.center = pygame.Vector2(self.rect.center)

    def move(self, movement):
        self.center += movement
        self.rect.center = self.center

    def set_center(self, center):
        self.center = center
        self.rect.center = self.center

class Boss:
    def __init__(self, area, head_image, body_image, position, anchor):
        self.head = VectorSprite(head_image, position, anchor)
        self.steps = []
        self.body_list = []
        self.body = Group()
        self.create_body(body_image)
        self.vector = pygame.Vector2(-1, 0)
        self.speed = 0.06
        self.area = area
        self.step = 15
        self.max_step = len(self.body_list) * self.step + 1

    def create_body(self, body_image):
        for x in range(5):
            sprite = VectorSprite(body_image, self.head.center, "center")
            self.body_list.append(sprite)
            self.body.add(sprite)

    def draw(self, surface):
        self.body.draw(surface)
        self.head.draw(surface)

    def update(self, delta):
        movement = self.vector * delta * self.speed
        self.head.move(movement)

        if self.head.rect.left < 20:
            self.head.rect.left = 20
            self.head.center = pygame.Vector2(self.head.rect.center)
            self.vector = pygame.Vector2(0, 1) # down
        elif self.head.rect.bottom > self.area.bottom - 20:
            self.head.rect.bottom = self.area.bottom - 20
            self.head.center = pygame.Vector2(self.head.rect.center)
            self.vector = pygame.Vector2(1, 0) # right
        elif self.head.rect.right > self.area.right - 20:
            self.head.rect.right = self.area.right - 20
            self.head.center = pygame.Vector2(self.head.rect.center)
            self.vector = pygame.Vector2(0, -1) # up
        elif self.head.rect.top < 20:
            self.head.rect.top = 20
            self.head.center = pygame.Vector2(self.head.rect.center)
            self.vector = pygame.Vector2(-1, 0) # left

        self.steps.insert(0, pygame.Vector2(self.head.center))

        length = len(self.steps)
        for enum, body in enumerate(self.body_list):
            if length >= self.step * (enum + 1):
                body.set_center(self.steps[self.step * (enum + 1) - 1])

        self.steps = self.steps[:self.max_step]

class DisplayEngine:
    @staticmethod
    def center_screen():
        os.environ['SDL_VIDEO_CENTERED'] = '1'

    @staticmethod
    def screen_position(x, y):
        os.environ['SDL_VIDEO_WINDOW_POS'] = '{}, {}'.format(x, y)

    def __init__(self, caption, width, height, flags=0, fps=60):
        pygame.display.set_caption(caption)
        self.surface = pygame.display.set_mode((width, height), flags)
        self.rect = self.surface.get_rect()
        self.clock = pygame.time.Clock()
        self.running = False
        self.delta = 0
        self.fps = fps

    def idle(self):
        self.delta = self.clock.tick(self.fps)

    def quit(self):
        self.running = False

class Scene:
    def __init__(self, display_engine):
        self.display_engine = display_engine
        self.background = pygame.Color('black')
        self.create_images()

        position = self.display_engine.rect.centerx, 20
        self.boss = Boss(self.display_engine.rect, self.images['head'], self.images['body'], position, "midtop")

    def create_images(self):
        self.images = {}
        self.images['head'] = pygame.Surface((12, 12))
        self.images['head'].fill(pygame.Color('dodgerblue'))
        self.images['body'] = pygame.Surface((8, 8))
        self.images['body'].fill(pygame.Color('dodgerblue'))

    def mainloop(self):
        self.display_engine.running = True
        while self.display_engine.running:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.display_engine.quit()
                else:
                    self.on_event(event)

            self.on_update(self.display_engine.delta)
            self.on_draw(self.display_engine.surface)
            pygame.display.flip()
            self.display_engine.idle()

    def on_draw(self, surface):
        surface.fill(self.background)
        self.boss.draw(surface)

    def on_event(self, event):
        pass

    def on_update(self, delta):
        #ticks = pygame.time.get_ticks()
        self.boss.update(delta)

def main():
    pygame.init()
    DisplayEngine.center_screen()
    display_engine = DisplayEngine("Boss Example", 800, 600)
    scene = Scene(display_engine)
    scene.mainloop()

if __name__ == "__main__":
    main()
99 percent of computer problems exists between chair and keyboard.
Reply


Messages In This Thread
Game boss causing huge slowdown - by michael1789 - Mar-06-2020, 03:04 AM
RE: Game boss causing huge slowdown - by metulburr - Mar-06-2020, 09:34 AM
RE: Game boss causing huge slowdown - by Windspar - Mar-07-2020, 01:33 AM
RE: Game boss causing huge slowdown - by Windspar - Mar-07-2020, 07:30 AM
RE: Game boss causing huge slowdown - by metulburr - Mar-07-2020, 11:58 AM
RE: Game boss causing huge slowdown - by Windspar - Mar-07-2020, 06:37 PM
RE: Game boss causing huge slowdown - by Windspar - Mar-07-2020, 11:51 PM
RE: Game boss causing huge slowdown - by Windspar - Mar-08-2020, 02:34 AM
RE: Game boss causing huge slowdown - by Windspar - Mar-08-2020, 08:41 AM
RE: Game boss causing huge slowdown - by metulburr - Mar-08-2020, 11:14 AM
RE: Game boss causing huge slowdown - by Windspar - Mar-08-2020, 12:14 PM
RE: Game boss causing huge slowdown - by metulburr - Mar-08-2020, 11:04 PM
RE: Game boss causing huge slowdown - by metulburr - Mar-08-2020, 11:44 PM

Possibly Related Threads…
Thread Author Replies Views Last Post
  (HELP GREATLY APPRECIATED) New user- Huge Pygame Installation Problem! Jbomb 1 2,898 Jan-12-2021, 07:32 PM
Last Post: MK_CodingSpace

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020