시작하기 앞서 이전 내용을 꼭 공부한 후 봐주시길 바랍니다.
충돌 처리란?
게임을 하기 위해서 캐릭터를 만들었고 이제 우리는 적 또한 만들어낼 것입니다.
적에게 캐릭터가 부딪히지 않는다면 게임이 계속되지만 부딪히게 된다면 게임이 끝나도록 만들어낼 것이며 우리는 그것을 충돌 처리라고 하겠습니다.
적 만들기
캐릭터를 만들었을 때처럼 이번에는 적(enemy)으로 지정될 캐릭터를 만들어주도록 하겠습니다.
코드를 작성하기 전에 그림판을 이용하여
크기 = 픽셀 가로 70, 세로 70, 배경화면 노랑색 의 조건에 맞춰 character.png 가 존재하는 폴더에 enemy.png 라는 이미지 파일로 저장을 해주도록 하겠습니다. 이전에 해보았던 내용이니 블로그에 하는 방법을 따로 기재하지는 않겠습니다.
이후 이전에 character 을 만들어 주었던 것 처럼 enemy 또한 만들어주어야 합니다. 이동속도 밑에 해당 코드를 작성해주도록 하겠습니다.
# 적(enemy) 캐릭터
enemy = pygame.image.load("D:\\Study\\PythonWorkspace\\game\\enemy.png")
enemy_size = enemy.get_rect().size # 이미지의 크기를 구해옴
enemy_width = enemy_size[0] # 캐릭터 가로 크기
enemy_height = enemy_size[1] # 캐릭터 세로 크기
enemy_x_pos = screen_width / 2 - enemy_width / 2
# 화면 가로의 절반 크기에 해당하는 곳에 위치
enemy_y_pos = screen_height / 2 - enemy_height / 2
# 화면 세로 크기 가장 아래에 해당하는 곳에 위치
- enemy 라는 변수를 만들고 pygame.image.load("이미지가 저장되어 있는 파일 주소") 를 통하여 변수에 이미지를 저장시켜줍니다.
- enemy.get_rect().size 를 이용해 캐릭터의 크기를 enemy_size 라는 변수에 저장합니다.
- enemy_size[0] 즉, 가로 크기를 enemy_width 라는 변수에 저장합니다.
enemy_size[1] 즉, 세로 크기를 enemy_height 라는 변수에 저장합니다. - 적의 위치를 우리는 화면의 중앙에 위치시키겠습니다.
screen_width/2 - enemy_width/2 즉 (전체 배경화면의 가로 크기/2) - (적의 가로 크기/2) 한 값을 enemy_x_pos 라는 변수에 저장시켜줍니다.
screen_height/2 - enemy_height/2 즉 (전체 배경화면의 세로 크기/2) - (적의 세로 크기/2) 한 값을 enemy_y_pos 라는 변수에 저장시켜줍니다.
위와 같은 코드를 작성해주었다면 이제 적의 이미지, 크기, 위치를 잡아준 셈입니다. 다음으로는 적을 그려주도록 하겠습니다.
적 그리기
적(enemy) 라는 변수를 만들어주었다고 게임에 나오는 것이 아닙니다. 변수를 만들어주었다면 배경에 띄워주어야합니다.
screen.blit(enemy, (enemy_x_pos, enemy_y_pos)) # 적 그리기
이전에 만들어둔 캐릭터 그리기의 밑 부분에 해당 코드를 작성해주도록 하겠습니다.
screen.blit() 이라는 함수를 사용하여 screen.blit(그릴 변수, (가로 위치, 세로 위치)) 를 넣어주어 screen 에 enemy 를 그려주도록 하겠습니다.
마지막으로 충돌 처리를 설정해주도록 하겠습니다.
충돌 처리
위의 코드까지 잘 따라오셨다면 이제 우리는 캐릭터와 적을 화면에서 확인할 수 있을 것입니다. 하지만 캐릭터가 아무리 적에게 닿아도 게임이 종료되지 않을 것입니다. 다음은 캐릭터와 적이 충돌했는지 확인이 가능한 코드를 작성해보도록 하겠습니다. 세로 경계값 처리를 한 코드 밑부분에 해당 코드를 작성해주도록 하겠습니다.
# 충돌 처리를 위한 rect 정보 업데이트
character_rect = character.get_rect()
character_rect.left = character_x_pos
character_rect.top = character_y_pos
- character.get_rect() 라는 함수를 이용해 rectangle 정보를 가져와 character_rect 라는 변수에 저장해주도록 하겠습니다. 다만 주의해야할 점은 character 가 처음 만들어질 때 character_x_pos 와 character_y_pos 의 좌표가 지정되어 있어 자체 이미지에 대한 rectangle 정보는 항상 같기 때문에 처음 만들어진 값을 그대로 가져가게 됩니다. 그렇기에 character_x_pos 와 character_y_pos 를 다시 한 번 사용하여 rectangle 정보를 바꿔주어야합니다.
- character_rect.left 즉, 캐릭터의 rectangle 정보의 좌측(좌우측, x 좌표) 값의 변수에 character_x_pos 를 넣어주도록 하겠습니다.
- character_rect.top 즉, 캐릭터의 rectangle 정보의 윗쪽(위아래, y 좌표) 값의 변수에 character_y_pos 를 넣어주도록 하겠습니다.
이렇게 하면 캐릭터가 화면에 위치하는 정보를 가지게 됩니다. 다음은 적 또한 위와 같이 설정해주도록 하겠습니다.
enemy_rect = enemy.get_rect()
enemy 는 위치가 고정되어 있어 해당 코드만 작성해도 괜찮으나 만일 적 또한 움직이게 된다면 left 와 top 의 값 또한 설정을 따로 해주어야합니다.
마지막으로 가장 중요한 충돌한지 체크를 해주어야 합니다.
# 충돌 체크
if character_rect.colliderect(enemy_rect):
print("충돌했어요")
running = False
colliderect 즉, rect(사각형) 을 기준으로 충돌이 일어났는지 확인을 해주는 함수입니다.
코드를 직역해본다면 캐릭터가 캐릭터와 충돌이 일어났는가 를 확인하는 코드가 되겠습니다.
만약 충돌을 한다면 충돌했어요 라는 문장이 터미널에 띄워지며 게임이 종료될 것입니다.
현재까지 완성된 코드 확인
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") # 게임 이름
# FPS
clock = pygame.time.Clock()
# 배경 이미지 불러오기
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
# 이동 속도
character_speed = 0.6
# 적 enemy 캐릭터
enemy = pygame.image.load("D:\\Study\\PythonWorkspace\\game\\enemy.png")
enemy_size = enemy.get_rect().size # 이미지의 크기를 구해옴
enemy_width = enemy_size[0] # 캐릭터 가로 크기
enemy_height = enemy_size[1] # 캐릭터 세로 크기
enemy_x_pos = screen_width / 2 - enemy_width / 2
# 화면 가로의 절반 크기에 해당하는 곳에 위치
enemy_y_pos = screen_height / 2 - enemy_height / 2
# 화면 세로 크기 가장 아래에 해당하는 곳에 위치
# 이벤트 루프
running = True # 게임이 진행중인가?
while running:
dt = clock.tick(60) # 게임화면의 초당 프레임 수를 설정
# print("fps : " + str(clock.get_fps())) # 프레임 확인
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 -= character_speed
elif event.key == pygame.K_RIGHT: # 캐릭터를 오른쪽으로
to_x += character_speed
elif event.key == pygame.K_UP: # 캐릭터를 위로
to_y -= character_speed
elif event.key == pygame.K_DOWN: # 캐릭터를 아래로
to_y += character_speed
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 * dt
character_y_pos += to_y * dt
# 가로 경계값 처리
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
# 충돌 처리를 위한 rect 정보 업데이트
character_rect = character.get_rect()
character_rect.left = character_x_pos
character_rect.top = character_y_pos
enemy_rect = enemy.get_rect()
enemy_rect.left = enemy_x_pos
enemy_rect.top = enemy_y_pos
# 충돌 체크
if character_rect.colliderect(enemy_rect):
print("충돌했어요")
running = False
screen.blit(background, (0, 0)) # 배경 그리기
screen.blit(character, (character_x_pos, character_y_pos)) # 캐릭터 그리기
screen.blit(enemy, (enemy_x_pos, enemy_y_pos)) # 적 그리기
pygame.display.update() # 게임화면을 다시 그리기
# pygame 종료
pygame.quit()
'Project > 충돌, 피하기 게임' 카테고리의 다른 글
[Pygame] 기본틀 마무리 정리 (0) | 2022.06.02 |
---|---|
[Pygame] 텍스트 설정 (0) | 2022.06.01 |
[Pygame] FPS 설정 (0) | 2022.05.28 |
[Pygame] 키보드 이벤트 (0) | 2022.05.27 |
[Pygame] 캐릭터 만들기 (0) | 2022.05.26 |