시작하기 앞서 이전 내용을 꼭 공부한 후 봐주시길 바랍니다.
키보드 방향키 입력 받기
게임을 시작하려면 캐릭터가 움직여야하고 그 캐릭터는 보통 키보드 혹은 마우스의 입력을 받아 움직입니다.
그 중에서 우리는 키보드의 방향키(상,하,좌,우) 를 이용하여 캐릭터를 움직일 수 있게끔 만들것입니다.
미리 만들어둔 while 문 안의 if event.type == game.QUIT: running = False 의 밑부분에 해당 코드를 작성해주겠습니다.
# 키보드 방향키의 눌림과 눌릴 때 위치 설정
if event.type == pygame.KEYDOWN: # 키가 눌러졌는지 확인
if event.key == pygame.K_LEFT: # 캐릭터를 왼쪽으로
to_x -= 5
elif event.key == pygame.K_RIGHT: # 캐릭터를 오른쪽으로
to_x += 5
elif event.key == pygame.K_UP: # 캐릭터를 위로
to_y -= 5
elif event.key == pygame.K_DOWN: # 캐릭터를 아래로
to_y += 5
event.type == pygame.KEYDOWN 을 이용하여 키보드가 눌려졌는지 확인을 하게끔 하며 키보드가 눌리면 if 문이 실행되게끔 해줍니다.
pygame.K_LEFT / pygame.K_RIGHT / pygame.K_UP / pygame.K_DOWN 는 각각 왼쪽 방향키 / 오른쪽 방향키 / 윗쪽 방향키 / 아랫쪽 방향키 를 인식받아 눌러지는 키보드를 인식하여 조건이 알맞는 것을 실행되게끔 만들어줍니다.
현재 위의 코드만을 써넣었을 경우 to_x 와 to_y 는 아직 선언을 해주지 않았기 때문에 설명만을 해준다면
to_x 는 x 좌표로 - 는 왼쪽 방향, + 는 오른쪽 방향으로 5픽셀씩 움직여지는 것을 뜻합니다.
to_y는 y 좌표로 - 는 윗쪽 방향, +는 아랫쪽 방향으로 5픽셀씩 움직여지는 것을 뜻합니다.
키보드의 입력이 멈출 경우 설정하기
키가 눌렸을 때 뿐만이 아니라 키가 입력되고서 키보드에서 손이 떼어질 때 또한 설정을 해야 합니다.
if event.type == pygame.KEYUP: # 방향키 떼면 멈춤
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
to_x = 0
elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
to_y = 0
pygame.KEYDOWN 의 반대와도 같은 pygame.KEYUP 은 키보드에서 손이 떼어진 경우를 말합니다.
방향키가 눌리는게 멈춘다면 if 문의 경우에 충족되어 아래 코드가 실행이 됩니다.
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: to_x = 0
즉, 방향키가 떨어진 키가 왼쪽이나 오른쪽이라면 to_x 의 값을 0으로 치환해줍니다.
elif event.key == pygame.K_UP or event.key == pygame.K_DOWN: to_y = 0
또는 방향키가 떨어진 키가 위나 아래라면 to_y 의 값을 0으로 치환해줍니다.
이후 움직여진 x와 y좌표를 먼저 만들어둔 캐릭터의 위치가 저장된 character_x(or y)_pos 에 움직여진 값들을 저장해줍니다.
character_x_pos += to_x
character_y_pos += to_y
키보드가 눌릴 때 움직여질 좌표 설정하기
위에서 사용한 좌표인 to_x 와 to_y 를 사용하기 위해서는 해당 좌표를 사용할 변수를 미리 설정을 해주어야합니다.
이벤트 루프인 running = True 에 들어가기에 앞서 좌표 값을 설정해주기 위해 윗쪽에 변수를 설정해주도록 하겠습니다.
# 이동할 좌표
to_x = 0
to_y = 0
이와 같이 to_x 의 값을 0으로, to_y 의 값 또한 0으로 지정하여 변수를 만들어준다면 됩니다. 만약 다른 값이 지정되어 있다면 키보드를 누를때 위로 조금 더 가거나 아래로는 덜 가거나 등 캐릭터가 설정해둔 값과 다르게 움직일 수 있으니 주의해야합니다.
게임 내 경계값 처리하기
캐릭터가 움직이다보면 배경 밖으로도 나가는 경우가 생길 수 있습니다. 실제 게임에서 그러한 경우가 발생하면 최악인 경우 캐릭터를 찾아낼 수 없기 때문에 밖으로 나가지 못하게끔 만들어주어야 합니다.
해당 코드를 character_y_pos += to_y 의 밑부분 부터 이어서 작성해주도록 하겠습니다.
# 가로 경계값 처리
if character_x_pos < 0:
character_x_pos = 0
elif character_x_pos > screen_width - character_width:
character_x_pos = screen_width - character_width
# 세로 경계값 처리
if character_y_pos < 0:
character_y_pos = 0
elif character_y_pos > screen_height - character_height:
character_y_pos = screen_height - character_height
만약 캐릭터의 x좌표 위치가 0보다 작으면 0으로 고정시켜 더이상 값이 낮아질 수 없도록 만들어줍니다.
혹은 캐릭터의 위치가 '배경화면 가로 너비 - 캐릭터의 가로 너비' 보다 크다면 '배경화면 가로 너비 - 캐릭터의 가로 너비' 와 같은 값으로 지정하여 왼쪽이든, 오른쪽이든 넘어설 수 없도록 만들어줍니다.
만약 캐릭터의 y좌표 위치가 0보다 작으면 0으로 고정시켜 더이상 값이 낮아질 수 없도록 만들어줍니다.
혹은 캐릭터의 위치가 '배경화면 세로 너비 - 캐릭터의 세로 너비' 보다 크다면 '배경화면 세로 너비 - 캐릭터의 세로 너비' 와 같은 값으로 지정하여 위든, 아래든 넘어설 수 없도록 만들어줍니다.
현재까지 완성된 진행 상황, 진행 코드 확인
모든 코드의 작성이 끝났다면 실행해보도록 하겠습니다.

이전과는 다르게 키보드의 입력에 따라 캐릭터가 움직이는 것을 확인할 수 있으며 배경의 밖으로 나가지지 않는 것, 그리고 캐릭터가 잘려지지 않는 것을 확인할 수 있습니다.
import pygame
pygame.init() # 초기화 (반드시 필요)
# 화면 크기 설정
screen_width = 480 # 가로 크기
screen_height = 640 # 세로 크기
screen = pygame.display.set_mode((screen_width, screen_height))
# 화면 타이틀 설정
pygame.display.set_caption("Cheong Game") # 게임 이름
# 배경 이미지 불러오기
background = pygame.image.load("D:\\Study\\PythonWorkspace\\game\\background.png") # \\ 말고 / 로도 가능
# 스프라이트(캐릭터) 불러오기
character = pygame.image.load("D:\\Study\\PythonWorkspace\\game\\character.png")
characte_size = character.get_rect().size # 이미지의 크기를 구해옴
character_width = characte_size[0] # 캐릭터 가로 크기
character_height = characte_size[1] # 캐릭터 세로 크기
character_x_pos = screen_width / 2 - character_width / 2 # 화면 가로의 절반 크기에 해당하는 곳에 위치
character_y_pos = screen_height - character_height # 화면 세로 크기 가장 아래에 해당하는 곳에 위치
# 이동할 좌표
to_x = 0
to_y = 0
# 이벤트 루프
running = True # 게임이 진행중인가?
while running:
for event in pygame.event.get(): # 어떤 이벤트가 발생하였는가?
if event.type == pygame.QUIT: # 창이 닫히는 이벤트가 발생하였는가?
running = False # 게임이 진행중이 아님
if event.type == pygame.KEYDOWN: # 키가 눌러졌는지 확인
if event.key == pygame.K_LEFT: # 캐릭터를 왼쪽으로
to_x -= 5
elif event.key == pygame.K_RIGHT: # 캐릭터를 오른쪽으로
to_x += 5
elif event.key == pygame.K_UP: # 캐릭터를 위로
to_y -= 5
elif event.key == pygame.K_DOWN: # 캐릭터를 아래로
to_y += 5
if event.type == pygame.KEYUP: # 방향키 떼면 멈춤
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
to_x = 0
elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
to_y = 0
character_x_pos += to_x
character_y_pos += to_y
# 가로 경계값 처리
if character_x_pos < 0:
character_x_pos = 0
elif character_x_pos > screen_width - character_width:
character_x_pos = screen_width - character_width
# 세로 경계값 처리
if character_y_pos < 0:
character_y_pos = 0
elif character_y_pos > screen_height - character_height:
character_y_pos = screen_height - character_height
screen.blit(background, (0, 0)) # 배경 그리기
screen.blit(character, (character_x_pos, character_y_pos)) # 캐릭터 그리기
pygame.display.update() # 게임화면을 다시 그리기
# pygame 종료
pygame.quit()
'Project > 충돌, 피하기 게임' 카테고리의 다른 글
[Pygame] 적 생성하기, 충돌 처리 (0) | 2022.05.29 |
---|---|
[Pygame] FPS 설정 (0) | 2022.05.28 |
[Pygame] 캐릭터 만들기 (0) | 2022.05.26 |
[Pygame] 배경 설정 (0) | 2022.05.24 |
[Pygame] 파이썬을 이용한 간단한 게임 만들기 위한 초기설정, 환경설정 (0) | 2022.05.23 |