[python/Game] 파이썬으로 게임만들기(2) - 미니게임
이번 포스팅에서는 미니 게임을 pygame을 사용하여 만들어 보도록 하겠습니다.
preview
이 게임은 병아리가 폭탄을 피하고 부딪히면 게임이 종료되는 미니게임 입니다.
게임 구성
1. 게임 화면 설정하기
2. 플레이어 기능 만들기: 병아리
3. 에너미 기능 만들기: 폭탄
4. 그룹화하기
5. 배경 및 효과 음악 삽입
6. 게임 루프 설정
7. 충돌 판정 설정 및 게임종료
0. 사진, 음악 파일 등을 다운받을 수 있는 사이트
[사진]
[음악]
2. https://soundeffect-lab.info/
해외사이트는 페이지 번역기능을 사용해 효과음을 찾을 수 있습니다.
※저작권 범위를 잘 확인한 뒤 사용하세요.※
1. 게임 화면 설정하기
게임의 기본적인 틀을 설정해 줍니다.
저는 미리 준비한 게임 배경화면 이미지에 맞추어 660*440크기의 창을 만들어 주었습니다.
색상, 속도, 점수 등의 변수도 미리 만들어 준비해 줍니다.
게임 내 글자에 사용될 폰트도 미리 설정해 줍니다.
그 후 게임 배경화면 사진을 불러오고, 창 이름을 Mini Game으로 바꾸어 주겠습니다.
import pygame, sys
from pygame.locals import *
import random, time
pygame.init()
# 초당 프레임 설정
FPS = 60
FramePerSec = pygame.time.Clock()
# 색상 세팅(RGB코드)
RED = (255, 0, 0)
ORANGE = (255, 153, 51)
YELLOW = (255, 255, 0)
GREEN = (0, 255, 0)
SEAGREEN = (60, 179, 113)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
VIOLET = (204, 153, 255)
PINK = (255, 153, 153)
# 게임 진행에 필요한 변수들 설정
SPEED = 5 # 게임 진행 속도
SCORE = 0 # 플레이어 점수
# 폰트 설정
font = pygame.font.SysFont('Tahoma', 60) # 기본 폰트 및 사이즈 설정(폰트1)
small_font = pygame.font.SysFont('Malgun Gothic', 20) # 작은 사이즈 폰트(폰트2)
game_over = font.render("GG", True, BLACK) # 게임 종료시 문구
# 게임 배경화면
background = pygame.image.load('background1.jpg') # 배경화면 사진 로드
# 게임 화면 생성 및 설정
GameDisplay = pygame.display.set_mode((640, 440))
GameDisplay.fill(PINK)
pygame.display.set_caption("Mini Game")
2. 플레이어 기능 만들기
다음으로 병아리(플레이어)에 적용될 클래스를 생성해 보겠습니다.
플레이어 클래스 객체가 생성되면 자동으로
사진을 불러오고 위치 설정을 해 준다음
move 함수를 만들어 왼쪽 키보드를 누르면 왼쪽으로 이동하고,
오른쪽 키보드를 누르면 오른쪽으로 이동하는 함수를 만들어 주겠습니다.
그리고 추후 폭탄이랑 부딪혔을 때 다른 이미지로 바꿔주기 위해 충돌 시 위치를 return받도록 하겠습니다.
## 게임 내에서 동작할 클래스 설정 ##
## 플레이어에게 적용할 클래스
class Player(pygame.sprite.Sprite):
# 플레이어 이미지 로딩 및 설정 함수
def __init__(self):
super().__init__()
# 플레이어 사진 불러오기
self.image = pygame.image.load('chick.png')
# 이미지 크기의 직사각형 모양 불러오기
self.rect = self.image.get_rect()
# rec 크기 축소(충돌판정 이미지에 맞추기 위함)
self.rect = self.rect.inflate(-20,-20)
print("플레이어: ",self.rect)
# 이미지 시작 위치 설정
self.rect.center = (540, 390)
# 플레이어 키보드움직임 설정 함수
def move(self):
prssdKeys = pygame.key.get_pressed()
# 왼쪽 방향키를 누르면 5만큼 왼쪽 이동
if self.rect.left > 0:
if prssdKeys[K_LEFT]:
self.rect.move_ip(-5, 0)
position_p = self.rect.center
return position_p
# 오른쪽을 누르면 5만큼 오른쪽으로 이동
if self.rect.right < 640:
if prssdKeys[K_RIGHT]:
self.rect.move_ip(5, 0)
position_p = self.rect.center
return position_p
3. 에너미(적) 기능 만들기
이번에는 적인 폭탄에 적용할 클래스를 작성해 주도록 하겠습니다.
플레이어와 마찬가지로, 이미지를 불러와 줍니다.
적은 나타날때 무작위 위치에서 나타날 수 있도록 random을 사용하겠습니다.
적의 움직임은 위에서 아래로만 떨어지므로 (0, speed)로 세팅해 줍니다.
그리고 화면 맨 아래에 떨어지면 새로 물체가 나타나도록 코드를 작성합니다.
적 하나를 피할 수록 점수가 올라가기 때문에, 충돌이 일어나지 않으면 SCORE에 +1해 줍니다.
폭탄도 플레이어와 부딪혔을 때 이미지를 바꾸기 위해 return값으로 위치를 돌려받습니다.
## 적에게 적용할 클래스
class Enemy(pygame.sprite.Sprite):
# 적의 이미지 로딩 및 설정 함수
def __init__(self):
super().__init__()
# 적 사진 불러오기
self.image = pygame.image.load('boom2.png')
# 이미지 크기의 직사각형 모양 불러오기
self.rect = self.image.get_rect()
# rec 크기 축소(충돌판정 이미지에 맞추기 위함)
self.rect = self.rect.inflate(-20,-20)
print("적: ", self.rect)
# 이미지 시작 위치 설정
self.rect.center = (random.randint(40, 600), 0)
# 적의 움직임 설정 함수+ 플레이어 점수 측정
def move(self):
global SCORE
# 적을 10픽셀크기만큼 위에서 아래로 떨어지도록 설정
self.rect.move_ip(0, SPEED) # x,y좌표 설정
# 이미지 가 화면 끝에 있으면(플레이어가 물체를 피하면) 다시 이미지 위치 세팅 + 1점 추가
if (self.rect.bottom > 440):
SCORE += 1
self.rect.top = 0
self.rect.center = (random.randint(30, 610), 0)
return self.rect.center
4. 그룹화하기
이제 플레이어와 에너미 객체를 각각 생성해 주고, 그룹화를 해 줍니다.
그룹화는 파워포인트의 그룹처럼 비슷한 역할을 하는 객체들을 묶어 어떤 동작을 할 때, 한번에 같이 적용이 될 수 있도록 해 줍니다.
플레이어는 1명이니까 나머지 적 객체를 그룹화 후,
전체(플레이어+ 적) 을 합친 전체 그룹도 만들어 줍니다.
###### 게임 설정 ########
# 플레이어 및 적 개체 생성
P1 = Player()
E1 = Enemy()
# Sprites Groups 생성하기
# 게임 물체들을 그룹화 하여 그룹별로 접근하여 설정 시 용이하게 만들기
# 적(enemy) 객체 그룹화하기
Enemies = pygame.sprite.Group()
Enemies.add(E1)
# 전체 그룹을 묶기
All_groups = pygame.sprite.Group()
All_groups.add(P1)
All_groups.add(E1)
게임에서 적이 1초마다 새로 나타날 수 있도록 그룹화한 객체에 이벤트를 설정해 줍니다.
# 적 개체 1초(1000ms)마다 새로 생기는 이벤트 생성
increaseSpeed = pygame.USEREVENT + 1
pygame.time.set_timer(increaseSpeed, 1000)
5. 배경 및 효과 음악 삽입
게임을 하는동안 지루하지 않게 배경 음악을 추가하도록 하겠습니다.
배경음악은 게임 루프가 시작되기 전에 틀어 줍니다.
배경음악이나 기타 효과음을 넣고 싶지 않으면 생략하셔도 됩니다.
# 게임 BGM 설정
bgm = pygame.mixer.Sound('backgroundMusic.mp3')
bgm.play() # 게임 BGM 재생
6. 게임 루프 설정
이제 게임이 진행되는 동안 반복될 이벤트들을 설정해 줍니다.
게임 루프에서 플레이어가 적을 잘 피할수록 적의 떨어지는 스피드를 올려 점점 어렵게 만들어 주겠습니다.
그리고 종료선언이 되면 게임을 종료시키는 코드도 미리 작성해 줍니다.
.blit()을 사용하여 배경화면을 창에 불러옵니다.
적을 몇명 피했는지 체크하는 score도 불러와 줍니다.
그 후 나머지 플레이어와 적 객체들도 화면에 나타내주고 함수 move를 사용하여 움직임이 생기도록 해 줍니다.
## 게임 루프 설정 ##
# 게임 종료되기 전까지 실행되는 루프(이벤트) 설정
while True:
for event in pygame.event.get():
# type increaseSpeed이면 속도 증가하여 어렵게 만듬(적 물체 이벤트)
if event.type == increaseSpeed:
SPEED += 0.5
# 이벤트가 종료되면 게임도 종료시킴
if event.type == QUIT:
pygame.quit()
sys.exit()
# 배경화면 사진 게임창에 불러오기(사진, 위치)
GameDisplay.blit(background, (0, 0))
# 하단부에 위치할 스코어 점수(적을 피할때마다 +1점 증가)
scores = small_font.render("Score: " + str(SCORE), True, BLACK)
GameDisplay.blit(scores, (10, 400))
#group1 = '<Player Sprite(in 1 groups)>'
#group2 = '<Enemy Sprite(in 2 groups)>'
# 게임 내 물체 움직임 생성
for i in All_groups:
GameDisplay.blit(i.image, i.rect)
i.move()
if str(i) == '<Player Sprite(in 1 groups)>':
player_pos = i
else:
enemy_pos = i
7. 충돌 판정 설정 및 게임종료
이제 마지막으로 적과 플레이어 사이에 충돌이 있을 때 일어나는 이벤트들을 설정해 주도록 하겠습니다.
플레이어와 적이 충돌하면 kill을 사용하여 움직임을 다 멈춰 주고 게임 배경음악도 멈춰 줍니다.
그 후 미리 받아온 위치정보를 충돌 후 바뀔 이미지에 적용하여 화면에 나타내 줍니다.
충돌 할 때 나는 소리 파일도 불러와 줍니다.
그 후 화면이 바뀌며 게임 종료를 알리며 게임을 종료합니다.
# 플레이어 충돌 판정(게임종료)시
if pygame.sprite.spritecollideany(P1, Enemies):
for i in All_groups:
i.kill()
# 물체 이미지 변경(충돌후 변경되는 이미지)
# 플레이어
GameDisplay.blit(background, (0, 0))
image0 = pygame.image.load('chickbommed.png')
image0.get_rect()
GameDisplay.blit(image0, player_pos)
# 폭탄
image1 = pygame.image.load('boomm.png')
image1.get_rect()
GameDisplay.blit(image1, enemy_pos)
pygame.display.update()
# 배경음악 멈춤
bgm.stop()
# 적과 충돌시 효과음 추가
pygame.mixer.Sound('BOOM.WAV').play()
time.sleep(0.5)
# 게임오버화면 설정
pygame.mixer.Sound('gameover.mp3').play()
GameDisplay.fill(SEAGREEN)
final_scores = font.render("Your Score: " + str(SCORE), True, BLACK)
GameDisplay.blit(final_scores, (150, 100))
GameDisplay.blit(game_over, (280, 200))
time.sleep(1)
pygame.display.update()
time.sleep(5)
pygame.quit()
sys.exit()
pygame.display.update()
# 초당 프레임 설정
FramePerSec.tick(FPS)
만든 게임을 실행할 때는 작성한 코드에서 바로 실행해 주셔도 되고
터미널에서 실행할 때는 코드파일이 위치한 폴더로 이동 후 아래와 같이 명령어를 입력하여 실행합니다.
python -m 게임파일이름.py
플레이 영상
전체 코드
https://github.com/ElenaLim/Pygame/blob/main/minigame.py
전체 코드 및 코드파일을 깃허브에 업로드 하였습니다. :)
참고자료
1. 파이게임 튜토리얼 문서
2. 파이게임 튜토리얼
마무리
파이썬으로 이렇게 게임을 만들어 볼 수 있어서 정말 즐거웠습니다 ^o^
어떤 게임을 만들고 싶은지 아이디어가 있다면 댓글로 남겨 주세요:)
-----------------------------------------------------------
05/19 ++충돌판정 수정.