soma0sd

코딩 & 과학 & 교육

Pygame: 키보드 조작으로 타일맵 이동

반응형

만드는 게임이 건설 운영 시뮬레이션이다보니 캐릭터의 이동이 아니라 직접 조작으로 화면을 옮기는 기능이 필요합니다. 오른손은 마우스로 바쁠테니 WASD이동을 하는 편이 좋겠죠.

타일맵 이동

소스코드의 move() 메서드 먼저 살펴보면 self.__cam_pos_x 값과 self.__cam_pos_y 값을 변경하는 것을 볼 수 있습니다. 이 값들은 blit_to() 메서드에서 타일 배치 좌표를 보정하는 역할을 합니다. 보정값을 바꿨으니 모든 타일의 위치가 변합니다.

def blit_to(self, surface: "Surface"):
    """지정한 표면에 타일맵을 출력"""
    surface.fill(pygame.Color(0, 0, 0, 0))
    xlim, ylim = self.shape
    xcenter = surface.get_rect().centerx
    ycenter = surface.get_rect().centery
    xcam = self.__cam_pos_x - xcenter
    ycam = self.__cam_pos_y - ycenter
    _w, _h = self.__grid
    for _x, _y in product(range(xlim), range(ylim)):
        tile = self.__tileset[self[_x, _y]]
        iso_x = -_x * _w * 0.5 + _y * _w * 0.5
        iso_y = _x * _h * 0.5 + _y * _h * 0.5 - tile.get_size()[1]
        surface.blit(tile, (iso_x - xcam, iso_y - ycam))

def move(self, dx: Union[int, float], dy: Union[int, float]):
    """전체 타일맵 이동"""
    self.__cam_pos_x += dx
    self.__cam_pos_y += dy

키보드 이벤트

소스코드의 게임 루프를 보면 KEYDOWN이벤트가 발생하면, 어떤 키를 눌렀는지 확인하는 판단문이 있습니다.

누른 키가 WASD라면, 누른 키에 따라서 위에서 다룬 move() 메서드를 불러옵니다.

while True:
    ...
    for event in pygame.event.get():
        ...
        if event.type == pygame.KEYDOWN:
            pressed = pygame.key.get_pressed()
            if pressed[pygame.K_w]:
                tilemap.move(0, -15)
            elif pressed[pygame.K_s]:
                tilemap.move(0, 15)
            elif pressed[pygame.K_a]:
                tilemap.move(-15, 0)
            elif pressed[pygame.K_d]:
                tilemap.move(15, 0)

(왼쪽) 초기화면 (오른쪽) D키를 눌렀을 때의 변화

소스코드에서는 키보드의 방향과 맵을 움직이는 방향을 반대로 했는데, 이것은 맵이 움직이는 것보다 시선이 움직인다는 기준으로 게임 화면이 움직이는게 더 직관적이라고 판단했기 때문입니다. 필요에 따라 메인루프의 판단문 내용을 바꿔서 변경할 수 있습니다.

반응형
태그:

댓글

End of content

No more pages to load