soma0sd

코딩 & 과학 & 교육

Pygame: 키보드를 누르고 있으면 타일맵 이동을 가속

반응형

이전에는 키보드 조작으로 타일맵 이동코드를 추가했습니다. 이 방법은 키보들르 눌렀을 때 한 번만 이동하고 원하는 만큼 이동하려면 그만큼 여러번 눌러야 합니다. 게임 시스템에 따라 그방식이 좋은 경우도 있지만, 키보드를 누르고 있는동안 부드럽게 이동하는 것이 좋은 경우도 있을 것입니다.

오늘은 게임의 타일맵을 키보드의 WASD키를 누르고 있는 동안 이동하도록 만들고, 부드러운 이동을 위해 누르는 동안 타일맵의 이동이 가속하도록 만듭니다.

키보드 이벤트

Pygame의 키보드 입력을 매개변수로 받아 카메라의 속도를 변경하는 메서드를 작성합니다. 이 때, 무한정 가속하면 게임할 때 문제가 있을테니 [-10, 10]범위에서 가속하도록 합니다. 키보드에서 손을 떼면 가속과 속도를 무시하고 즉시 정지하도록 합니다.

class World:
    """타일맵 클래스"""
    def key_event(self, pressed: Sequence[bool]):
        """맵의 WASD 이동"""
        if pressed[pygame.K_w]:
            self.__cam_vy -= 1 if self.__cam_vy > -10 else 0
        elif pressed[pygame.K_s]:
            self.__cam_vy += 1 if self.__cam_vy < 10 else 0
        else:
            self.__cam_vy = 0
        if pressed[pygame.K_a]:
            self.__cam_vx -= 1 if self.__cam_vx > -10 else 0
        elif pressed[pygame.K_d]:
            self.__cam_vx += 1 if self.__cam_vx < 10 else 0
        else:
            self.__cam_vx = 0
        self.__cam_x += self.__cam_vx
        self.__cam_y += self.__cam_vy

게임을 구동하는 메인루프마다 키 입룍을 확인하는 key_event()를 사용합니다.

# 메인 루프
...
world = World(...)
...


while True:
  ...
  world.key_event(pygame.key.get_pressed())
  ...

타일맵 이동

카메라의 이동을 저장하는 self.__cam_xself.__cam_y를 이용합니다. 타일셋을 새로 그릴 때마다 저장한 카메라 좌표만큼 그림 좌표를 변경합니다.

class World:
    """타일맵 클래스"""
    def blit_to(self, surface: pygame.Surface):
        surface.fill(pygame.Color(0, 0, 0, 0))
        cx, cy = surface.get_rect().center
        width, height = self.size
        shift_x = 0.5 * width + self.__cam_x
        shift_y = 0.5 * height + self.__cam_y
        surface.blit(self.surface, (cx - shift_x, cy - shift_y))

전체 코드는 양이 많아 깃허브 레포지토리를 통해 볼 수 있습니다. 여기서 다룬 코드는 main.py, src/_world.py입니다.

반응형
태그:

댓글

End of content

No more pages to load