Mar-07-2020, 01:33 AM
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.
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.