python으로 게임 만들기/pygame

[pygame] 3. 키보드 이벤트

bay07 2024. 2. 24. 07:04

 

아주~~ 아주 과거에는 컴퓨터에 input 값을 입력하려면, 직접 다 코드를 작성해야했다. (지금 리눅스처럼) 그런데 미국의 발명가인  더글러스 엥겔바트씨는 일찍이 이런 불편함을 느꼈었고,  1963년 세계 최초의 마우스를 개발했다. 키보드의 경우는 초창기 천공카드라고 불리는 종이 카드로부터 시작하였고. (뭔가 컴퓨터의 역사는 공부할수록 재미있다.)

 

아무튼 사용자가 이렇게 키보드와 마우스를 통해서 정보를 입력하면, 그 정보를 입력 받아서 처리하는 장치가 필요하다.  그 부분이 바로 이 키보드 이벤트 기능인 것이다. running이 true인 동안 while문을 계속 돌면서, 모든 이벤트를 입력받아 처리한다. 감사하게도 pygame에서 이벤트 처리 기능을 제공하기 때문에 이것을 이용하면 조금 더 쉽게 코드를 처리할 수 있다. 

 

오늘 우리가 처리할 기능은 키보드의 상하좌우( ↑ ↓ ← → ) 입력에 따라 캐릭터를 움직이는 기능이다. 우선은 키보드를 눌렀을 때와 키보드를 뗐을 때로 나누어야하는데, 뭔진 모르지만 사용자가 키보드를 눌렀음을 확인해주는 함수가 pygame.KEYDOWN이다. 그리고 사용자가 키보드에서 손을 뗐음을 나타내는 함수는 KEYUP. 이렇게 if문을 타고 들어가서 그 안에서 각각 동작을 확인해주면 된다. 입력받은 키 값이 상하좌우인지 각각 확인해주는 함수는 pygame.K_LEFT, pygame.K_RIGHT, pygame.K_UP, pygame.K_DOWN이다. 이름이 직관적이어서 아주 좋다. 그리고 나중에 키보드를 뗐을 때도, 멈춘다는 것을 반드시 표현해줘야한다. 

 

아래 pass 부분에는 캐릭터가 움직이는 것 뿐 아니라, 폭탄이 터지게 한다던지, 테트리스의 블록 모양을 바꾼다던지 하는 원하는 이벤트를 구현해주면 된다. 

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:
                pass
            # 오른쪽 키가 눌렸다면 
            elif event.key == pygame.K_RIGHT:
                pass
            # 위쪽 키가 눌렸다면 
            elif event.key == pygame.K_UP:
                pass
            # 아래쪽 키가 눌렸다면 
            elif event.key == pygame.K_DOWN:
                pass
                
        # 방향키를 떼면 멈춘다
        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 (x방향의 좌표. pos는 position을 의미한다) 에 to_x 라는 성분을 더하거나 빼줌으로서 캐릭터의 움직이는 정도를 바꿔주도록 하자. y 방향도 마찬가지이다. 맨 처음에는 to_x 값을 3정도 변화시키는 걸로 해봤었는데 그러니까 캐릭터가 너무 빨리 움직여서, 0.05로 바꾸었다. (캐릭터가 움직이니까 재밌는 것 같다)

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 -= 0.05
            # 오른쪽 키가 눌렸다면 
            elif event.key == pygame.K_RIGHT:
                to_x += 0.05
            # 위쪽 키가 눌렸다면 
            elif event.key == pygame.K_UP:
                to_y -= 0.05
            # 아래쪽 키가 눌렸다면 
            elif event.key == pygame.K_DOWN:
                to_y += 0.05
        # 방향키를 떼면 멈춘다
        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
                
    screen.blit(background, (0,0))
    screen.blit(character,(character_x_pos, character_y_pos))
    pygame.display.update()

 


 

▷ 움직이는 캐릭터 

근데 경계선 처리를 안해줘서 그런지, 키보드를 계속 누르고 있으면 캐릭터가 밖으로 나가버린다 ㅇㅅㅇ! ㅋㅋ

 

 


 

▷ 키보드 이벤트 추가 _ 전체코드

더보기
#3. 키보드 이벤트 추가_ 전체코드

import pygame

pygame.init()
screen_width = 480
screen_height = 640
screen = pygame.display.set_mode((screen_width, screen_height))

pygame.display.set_caption("Let's make game")
background = pygame.image.load("C:/Users/Soyoung/Desktop/pygame/background.png")
character = pygame.image.load("C:/Users/Soyoung/Desktop/pygame/pika.jpg")
character_size = character.get_rect().size
character_width = character_size[0]
character_height = character_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 -= 0.05
            # 오른쪽 키가 눌렸다면 
            elif event.key == pygame.K_RIGHT:
                to_x += 0.05
            # 위쪽 키가 눌렸다면 
            elif event.key == pygame.K_UP:
                to_y -= 0.05
            # 아래쪽 키가 눌렸다면 
            elif event.key == pygame.K_DOWN:
                to_y += 0.05
        # 방향키를 떼면 멈춘다
        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
                
    screen.blit(background, (0,0))
    screen.blit(character,(character_x_pos, character_y_pos))
    pygame.display.update()
pygame.quit()
 

 

▷ 참고 자료 

나도 코딩 : https://www.youtube.com/watch?v=Dkx8Pl6QKW0

Starry Night : https://www.youtube.com/watch?v=G0dfk_XNuoU

'python으로 게임 만들기 > pygame' 카테고리의 다른 글

[pygame] 5. FPS 설정1  (0) 2024.02.24
[pygame] 4. 배경화면 경계선 처리  (0) 2024.02.24
[pygame] 2. 배경화면과 캐릭터 설정  (0) 2024.02.24
[pygame] 1. 기본 설정  (0) 2024.02.24
[pygame] 0. 동기  (0) 2024.02.24