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)
소스코드에서는 키보드의 방향과 맵을 움직이는 방향을 반대로 했는데, 이것은 맵이 움직이는 것보다 시선이 움직인다는 기준으로 게임 화면이 움직이는게 더 직관적이라고 판단했기 때문입니다. 필요에 따라 메인루프의 판단문 내용을 바꿔서 변경할 수 있습니다.
반응형
'프로그래밍 > 파이게임' 카테고리의 다른 글
Pygame: 키보드를 누르고 있으면 타일맵 이동을 가속 (0) | 2022.01.27 |
---|---|
Pygame [보충]: 등축투영 타일의 좌표 (0) | 2022.01.26 |
Pygame: 등축투영 타일맵을 가운데 배치하기 (0) | 2022.01.24 |
Pygame: 등축투영 타일의 좌표 (0) | 2022.01.23 |
Pygame: 타일셋 그리기(3) - 바닥 타일셋 그리기 (0) | 2022.01.21 |
댓글