Compy's Blog
426 words
2 minutes
[DEV] ComPyEngine 3 - Component with SpriteRenderer
2025-11-03
No Tags

이제 좀 눈으로 뭔가를 보고 싶어졌습니다. 그래서 빨리 뭔가 하려고 했는데, 원래 유니티에서도 씬에서 보려면 Renderer를 가진 컴포넌트를 넣어줘야 뭐가 보입니다. 그걸 따라 만들어볼겁니다.

    def render(self, surface, camera):
        if self.sprite is None:
            return

        transform = self.game_object
        screen_x, screen_y = camera.world_to_screen(
            transform.position[0],
            transform.position[1]
        )

        if camera.zoom != 1.0:
            scaled_sprite = pygame.transform.scale(
                self.sprite,
                (
                    int(self.sprite.get_width() * camera.zoom),
                    int(self.sprite.get_height() * camera.zoom)
                )
            )
            sprite_to_render = scaled_sprite
        else:
            sprite_to_render = self.sprite

        if hasattr(transform, 'rotation') and transform.rotation != 0:
            sprite_to_render = pygame.transform.rotate(sprite_to_render, transform.rotation)

        if hasattr(transform, 'scale') and transform.scale != (1, 1):
            sprite_to_render = pygame.transform.scale(
                sprite_to_render,
                (
                    int(sprite_to_render.get_width() * transform.scale[0]),
                    int(sprite_to_render.get_height() * transform.scale[1])
                )
            )

        rect = sprite_to_render.get_rect(center=(screen_x, screen_y))

        if not surface.get_rect().colliderect(rect):
            return

        if self.color != (255, 255, 255):
            tinted_sprite = sprite_to_render.copy()
            tinted_sprite.fill(self.color, special_flags=pygame.BLEND_MULT)
            surface.blit(tinted_sprite, rect)
        else:
            surface.blit(sprite_to_render, rect)

위 코드처럼 랜더링을 때릴건데, 잘 작동하는지는 모르겠지만, 일단 기본적인 줌 상태가 아닌거는 잘 작동하니까 놔두고 있습니다.

    def load_image(self, path):
        tmp = EngineManager().load_game_image(path)
        self.sprite = tmp

파일 매니저에서 가지고 있는 Image를 불러와서 sprite를 가져옵니다. 모든 오류에 대해서 핸들링을 하도록 노력했고, try문을 안 사용하는 것을 지향햇습니다.

BaseRenderer를 상속한 SpriteRenderer를 이제 컴포넌트 시스템에 넣어서 이제 잘 작동하는지 확인하기 위해서 이제 기본적인 Rendering 시스템이 필요하겠네요! 설렙니다. 이제 곧 제 눈 앞에 오브젝트가 움직이는 것을 볼 수 있겠군요.

컴포넌트 코드
# print("Component")
class Component:
    def __init__(self, name, game_object):
        self.game_object = game_object
        self.name = name
        self.enabled = True

    def update(self, dt):

        # fixed update까지는 필요도하지 않을 것으로 보인단 말이지.
        pass
[DEV] ComPyEngine 3 - Component with SpriteRenderer
https://compy07.github.io/Blog/posts/ai/reinforcementlearning/dev/compyengine/firststep/component/
Author
뒹굴뒹굴 이정훈 공부방
Published at
2025-11-03