[Pygame] 2D게임 만들기 - 기획, 설정, 구조

ParkJuneWoo·2019년 12월 11일
3

Pygame

목록 보기
1/3

: 이 글은 velog 의 첫 글이다
: 한 문장으로 짧고 굵게 의미전달을 하려고 한다

  • 대학교 게임프로그래밍 프로젝트 수업에서 만든 게임을 다시한번 살펴보기로 했다
  • 코드가 깨끗하지 못한점 양해 부탁드립니다 🙏
  • 개발한지 오래되어 코드설명이 다소 미흡합니다 😅
  • pygame으로 무언가 만들고자 하는분들에게 작은 도움이 되었으면 합니다

왜 pygame인가

  • python으로 게임을 만들고 싶었다
  • 다양한 라이브러리들을 이용해보고 싶었다( 하지만 pygame 하나만씀 )
  • 다른 사람들(학생)에게 python의 위대함을 알리고 싶었다(당시 2017년..)

하지만 Unity와 비교해서보면 매우 초라하다...

게임 기획

게임 이름을 어떻게 짓지?

  • 신나고 명쾌한 게임보단 다소 어두운 게임을 만들자
  • 잔흑 동화같은 컨셉으로 밝은 분위기를 망쳐보자!
  • 이상한 나라의 앨리스는 생각보다 무서운 이야기다
  • 종합해서 있어보이게 영어로 이름을 지어보자!
    	> Finding the rabbit ( 토끼를 찾아서 ... )
  • 사실 토끼는 나쁜녀석이다
  • 토끼 + 호러 = ?
    나름 최선을 다해 없는 실력으로 만든 게임 메인 화면...

게임의 컨셉은 ?

  • 처음에는 무기 없이 도망만 치는 게임을 만들려고 했으나.. 예제가 없어서 포기했다
  • 그나마 정보가 많았던 슈팅게임을 응용해서 만들었다
  • 난이도는 어렵지만 조작은 단순하게
    - 화살표, 슈팅, 점프 키만 사용
    - 점점 어려워지는 난이도보단 그냥 어렵게
  • 아이템도 있으면 좋겠다!
  • 난이도가 고정되지 않고 동적의로 바뀌면 어떨까?

게임의 진행 방식은?

  • 단순하게 쏘고, 피하고, 올라가고
    - 적은 떨어지는 운석이다(피해야 한다)
    - 운석은 부실 수 있으며 점수를 획득한다.
  • 아이템을 먹으면 상대적 난이도가 바뀐다( 절대적 X )
    - 4개의 아이템을 만들었다
    1. 순간적으로 운석 속도 상승
    2. 순간적으로 운석 속도 하강
    3. 쏘는 총알의 개수 증가
    4. 화면에 보이는 모든 운석 제거
  • 단순한 클리어 조건
    - 토끼 머리 일정개수 이상 획득(랜덤 드랍)
    - 같은 클리어라도 획득 점수가 다르다_

혼자서 디자인은 어떻게?

  • 아무것도 모르니 도트라도 찍어보자
  • aseprite Tool 사용
  • 너무 많이는 말고 최대한 단순하게 만들자 ..
  • 움직이는 객체는 프레임 단위로

도트 디자인

다소 허접해보이지만... 최선을 다함 😂

  • 그 외의 음향효과 및 배경음, 이미지들은 자유롭게 사용이 가능한 사이트를 이용.

Music, Image
Sound

개발, 설계

UML

  • 간단하게 게임프로그래밍의 기초 로직을 그렸다

  • 게임 프로그래밍은 위의 그림과 같이 크게 Event->Update->Draw 를 반복한다
  • Event : 어떠한 행위에 대한 발동
  • Update : Event가 영향을 주는 값 변경
  • Draw : 바뀐 값을 프레임단위로 그림

구조

  • 모듈은 3가지로 구분된다
    - start.py : 게임의 전반적인 실행 구조를 담고있다
    - setting.py : 설정값에 대한 정의가 있다
    - sprites.py : 객체(벽돌, 플레이어, 운석 등)에 대한 정의

Source Overview

import 와 각 모듈의 메소드들을 살펴보자

import

import random 
import pygame as pg 
from settings import  *  
from sprites import  *

별거 없다 .. 제일 중요한건 pygame 😂

Start

class  Game: 
	def __init__(self): #변수, 게임 기본설정 초기화 
	def new(self): #게임을 시작 
	def run(self): #Loop def update(self): #게임을 갱신 시키는 부분 
	def events(self): #Event 처리에 대한 
	def draw(self): #화면에 그려주는 함수 
	def show_start_screen(self): #START 화면 
	def show_go_screen(self): #GAMEOVER/CONTINUE 화면

Sprites

# Player 클래스
class Player(pg.sprite.Sprite):

#Menu Slect 클래스
class Select(pg.sprite.Sprite):

#블록 클래스
class Platform(pg.sprite.Sprite):
  
#게임 내 아이템 클래스
class Item(pg.sprite.Sprite):
  
#토끼 머리 클래스
class Rabbithead(pg.sprite.Sprite):
   
#적 클래스
class Enemy(pg.sprite.Sprite):
    
#폭발 클래스
class Explosion(pg.sprite.Sprite):

#총알 클래스
class Bullet(pg.sprite.Sprite):
   
#이미지 sheet 및 이미지 로드를 위한 클래스
class Spritesheet:
  • sprite 에서는 게임 등장하는 모든 객체들에 대한 행동을 정의한다.
  • pg.sprite.Srpite 를 상쇡받아 Start에서 add 하여 사용한다.

Setting

#base properties
TITLE = "Finding the rabbit"
WIDTH = 512
HEIGHT = 600
FPS = 60
SCORE = 'highscore.txt'

#Font
FONT_NAME = 'arial'
BULLY = "Bully.ttf"
SURFING = "Surfing Capital.ttf"
LIBERTY = "A Voice Liberty.ttf"
LIBERTY2 = "A_Voice_Liberty.otf"

#Player properties
PLAYER_ACC = 0.65
PLAYER_FRICTION = -0.15
PLAYER_GRAV = 0.5
PLAYER_JUMP = 15.5

#Select properties
SELECT_ACC = 4

#items
ITEM_SPAWN_PCT = 10

#Heads
HEAD_SPAWN_PCT = 14

# Starting platforms
PLATFORM_LIST = [(0, HEIGHT - 40),
                (WIDTH / 2 - 50, HEIGHT * 3 / 4),
                (125, HEIGHT - 350),
                (350, 400),
                (175, 300)] #total 5 List

#define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (100, 100, 100)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255 ,255 ,0)
BROWN = (111, 109, 81)


#Image
STAND = "stand.png"
JUMP = "jump.png"
MOVE = "move.png"
BULLET = "bullet.png"
BULLET2 = "bullet2.png"
ENEMY = "meteorite.png"
JUMP = "jump.png"
JUMP_RIGHT = "jump_right.png"
BLOCK1 = "block1.png"
BLOCK2 = "block2.png"
BLOCK3 = "block3.png"
BACKGROUND = "background.png"
BOX = "box.png"
START_SCREEND = "start_screen.png"
START_LOGO = "start_logo.png"
MENU_SELECT = "menu_select.png"
HEAD = "head.png"
EXPLOSION = "explosion.png"
EXPLOSION2 = "explosion2.png"
ENDING_IMAGE = "ending.jpg"
  • 코드 내에서 불러와 사용하기 위한 설정값딀 입니다
  • 이동에 대한 속도조절, 벽돌의 크기 등...

여기 까지가 게임에 대한 전반적인 설명입니다
다음 글부터는 소스코드에 대한 설명을 하도록 하겠습니다

Source Code

profile
안녕하세요.

0개의 댓글