Python

[python/Game] 파이썬으로 게임만들기(2) - 미니게임

wonhwa 2022. 2. 16. 11:26
반응형

이번 포스팅에서는 미니 게임을 pygame을 사용하여 만들어 보도록 하겠습니다.

preview

이 게임은 병아리가 폭탄을 피하고 부딪히면 게임이 종료되는 미니게임 입니다.

 

게임 구성

1. 게임 화면 설정하기

2. 플레이어 기능 만들기: 병아리

3. 에너미 기능 만들기: 폭탄

4. 그룹화하기

5. 배경 및 효과 음악 삽입

6. 게임 루프 설정

7. 충돌 판정 설정 및 게임종료

0. 사진, 음악 파일 등을 다운받을 수 있는 사이트

[사진]

1. https://pixabay.com/ko/

2. http://www.stickpng.com/

3. https://littledeep.com/

 

리틀딥

무료 일러스트를 찾고 있나요? 출처없이 상업적으로 사용 가능한 다양한 종류의 일러스트 디자인을 무료로 공유합니다! 지금 바로 확인해보세요!

littledeep.com

[음악]

1. https://www.bensound.com/

 

Royalty Free Music - Bensound

Synth Energetic Royalty-Free Music Track by Marcus also featuring funky guitars, bass and a retro be... An energetic Royalty Free Music by TwinsMusic featuring a fast drums base, claps, synths, brass, and... As featured on Netflix's Tiger King, a spirited

www.bensound.com

2. https://soundeffect-lab.info/

 

効果音ラボ - 商用無料、報告不用の効果音素材をダウンロード

2400音以上の音源を掲載したフリー効果音サイト。品質にこだわっており、テレビなどのプロの音響現場でも使われています。

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

 

GitHub - ElenaLim/Pygame: Minigame using Pygame

Minigame using Pygame. Contribute to ElenaLim/Pygame development by creating an account on GitHub.

github.com

전체 코드 및 코드파일을 깃허브에 업로드 하였습니다. :)

 

참고자료

1. 파이게임 튜토리얼 문서

 

tutorials - pygame wiki

 

www.pygame.org

2. 파이게임 튜토리얼

 

Python pygame - The Full Tutorial - CodersLegacy

The Python Pygame library comes with modules with functions for graphics, playing sounds, handling mouse input, and other things required for making games.

coderslegacy.com

 

마무리

파이썬으로 이렇게 게임을 만들어 볼 수 있어서 정말 즐거웠습니다 ^o^

어떤 게임을 만들고 싶은지 아이디어가 있다면 댓글로 남겨 주세요:)

-----------------------------------------------------------

05/19 ++충돌판정 수정.

반응형