2022. 7. 3. 17:05ㆍ코딩/- Project: pygame
https://sdcoding.tistory.com/60
Python) 파이 게임 틀 만들기 (프레임, 배경, 캐릭터, 키보드 설정)
유튜브 동영상을 참조해서 파이 게임 모듈을 갖고 프레임, 배경, 캐릭터, 키보드 설정까지 완료한 코드다. 파이게임 툴의 가장 신기한 것은 좌표값이다. 대부분 왼쪽 아래를 기준으로 (0,0)를 잡
sdcoding.tistory.com
저번에 쓴 글과 이어지는 내용이다.
# import pygame | |
import pygame | |
######################################################################################################### | |
# 0. 기본 게임 설정 | |
# 파이 게임 초기화 (초기 설정, 반드시 필요) | |
pygame.init() | |
# 화면 크기 설정 | |
screen_width = 480 # 화면 가로 크기 | |
screen_height = 640 # 화면 세로 크기 | |
screen = pygame.display.set_mode((screen_width, screen_height)) | |
# 화면 타이틀 설정 | |
pygame.display.set_caption("DDochi Game") # 게임 이름 | |
# FPS(Frame per Second) | |
clock = pygame.time.Clock() | |
######################################################################################################### | |
# 1. 사용자 게임 초기화 (배경, 이미지, 좌표, 속도, 폰트 등) | |
# 배경 이미지 불러오기 | |
background = pygame.image.load("C:\\Users\\GGyu\\Desktop\\project\\pygame_basic\\background.png") | |
# 캐릭터(스프라이트) 불러오기 | |
character = pygame.image.load("C:\\Users\\GGyu\\Desktop\\project\\pygame_basic\\character.png") | |
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 # 세로축 | |
# 캐릭터 이동 속도 | |
character_speed = 1 | |
# 적 캐릭터(enemy) 불러오기 | |
enemy = pygame.image.load("C:\\Users\\GGyu\\Desktop\\project\\pygame_basic\\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) # 화면 세로 크기 중간 (적 상하 좌표) | |
# Font 정의 | |
game_font = pygame.font.Font(None, 40) # Font 객체 생성 (font, size) | |
# 총 게임 시간 | |
total_time = 10 | |
# 시작 시간 정보 | |
start_ticks = pygame.time.get_ticks() | |
# 이벤트 루프 (항상 실행되고 있어야 게임 종료 일어나지 않음) | |
running = True # 게임 진행 중인지 확인 | |
while running: | |
dt = clock.tick(60) # 게임 화면의 초당 프레임 수를 결정 | |
# 2. 이벤트 처리 (키보드, 마우스 등) | |
for event in pygame.event.get(): | |
if event.type == pygame.QUIT: # 창을 닫는 이벤트가 발생한 경우 | |
running = False # 게임 진행 = 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 | |
if event.key == pygame.K_UP or event.key == pygame.K_DOWN: | |
to_y = 0 | |
# 3. 게임 캐릭터 위치 정의 | |
# 캐릭터 위치 = 움직인 위치 설정값 | |
# 이동 속도에 dt 값을 곱해줌으로써 프레임 수와 상관없이 게임 속도 일정 | |
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)) # 적 | |
# 타이머 시간 계산 | |
elapsed_time = (pygame.time.get_ticks() - start_ticks) / 1000 | |
# 타이머 시간을 1000으로 나누어 초단위로 표시 (default: ms 단위) | |
timer = game_font.render(str(int(total_time - elapsed_time)), True, (255, 255, 255)) | |
# render 뒤에 들어가는 부분은 str 값으로 int 값을 받아온다. / True / 글자 색상 | |
screen.blit(timer, (10, 10)) # 타이머 화면에 표시 | |
# 타이머 0초 될 시 타임아웃 | |
if total_time - elapsed_time <= 0: | |
print("Time Out!") | |
running = False | |
# 게임 화면을 지속적으로 update | |
pygame.display.update() | |
# pygame 종료 | |
pygame.quit() |
enemy 라는 객체를 추가했다.
enemy 객체는 기존 character 의 코드를 그대로 따와서 만들었다. 수정한 값은 position 좌표값 정도다.
또한 충돌 처리를 위해 character와 enemy의 rect 정보를 업데이트한다.
그리고 두 객체가 충돌한다는 가정인 colliderect 함수를 이용해, 이벤트 발생 시 게임이 종료되도록 한다. (running 상태값을 False로 치환하면 간단하다.)
또한 FPS 개념을 추가해줬다. # clock = pygame.time.Clock()
FPS는 frame per second의 약자로 말그대로 초당 프레임 수다.
초당 프레임 수가 올라가면 출력이 더욱 부드러워진다.
여기서 dt = clock.tick(60), dt값을 정의해주고
dt값을 캐릭터 포지션 내 변수 값으로 지정해주면서,
어느 프레임에서든지 캐릭터의 속도가 일정해짐을 알 수 있다.
타이머를 표시해주기 위해 timer 변수를 지정해줬는데, python은 기본 출력단위가 ms단위라 보기 편하게 1000을 나눠줌으로서 초단위로 바꿔주었다. 그리고 이를 int값으로 받으면서 정수만 표출되게 하고, 또 이를 str로 받으며 render 함수의 변수로 쓰일 수 있게 하였다. 할 때는 몰랐는데 쓰다보니 복잡해지네.. 이후 타이머가 0이 될 시에 게임 종료 기능을 만들었다.

'코딩 > - Project: pygame' 카테고리의 다른 글
Python) 골드 마이너 게임 만들어보기 (1) (pygame frame 이용) (0) | 2022.07.06 |
---|---|
Python) 침팬지 게임 만들어보기 (pygame frame 이용) (0) | 2022.07.05 |
Python) 팡게임(Pang Game) 만들어보기 (pygame frame 이용) (0) | 2022.07.04 |
Python) 똥 피하기 게임 만들기 (pygame frame 이용) (0) | 2022.07.03 |
Python) 파이 게임 틀 만들기 (프레임, 배경, 캐릭터, 키보드 설정) (0) | 2022.07.03 |