1. 실행 코드
import pygame as pg
import random
# 이미지 초기화
def 스프라이트_생성(이미지):
스프라이트 = pg.sprite.Sprite()
스프라이트.image = 이미지
스프라이트.rect = 스프라이트.image.get_rect()
return 스프라이트
# 게임 요소 초기화
def 게임요소초기화():
global 게임시간, 게임여부, 개리시작높이, 점수
global 개리뛰기상태, 개리뛰는흐름, 개리동작업데이트시간, 점프기본속도, 점프속도, 점프상태, 개리위치
global 요소들속도, 돌멩이생성시간, 돌멩이시작높이, 돌멩이위치리스트, 돌멩이스프라이트리스트
global 개리동료구출상태, 개리동료최초위치, 개리동료위치
global 포탈최초위치, 포탈위치
게임시간 = 0
게임여부 = True
개리시작높이 = 255
점수 = 0
개리뛰기상태 = 0
개리뛰는흐름 = 1
개리동작업데이트시간 = 0
점프기본속도 = 0.1
점프속도 = 점프기본속도
점프상태 = False
개리위치 = [70, 개리시작높이]
요소들속도 = 300
돌멩이생성시간 = 1
돌멩이시작높이 = 280
돌멩이위치리스트 = [[500, 돌멩이시작높이]]
돌멩이스프라이트리스트 = [스프라이트_생성(돌이미지) for _ in 돌멩이위치리스트]
개리동료구출상태 = False
개리동료최초위치 = 900
개리동료위치 = [개리동료최초위치, 개리시작높이]
포탈최초위치 = 900
포탈위치 = [포탈최초위치, 개리시작높이]
pg.init()
# 색깔 설정
흰색 = (255, 255, 255)
검은색 = (0, 0, 0)
# 글꼴 설정
글꼴 = pg.font.SysFont("hy얕은샘물m", 30)
# 게임 기본 설정
실행여부 = True
화면가로길이, 화면세로길이 = 800, 450
화면 = pg.display.set_mode([화면가로길이, 화면세로길이])
pg.display.set_caption('동족을 노역장에서 구출하라!')
배경이미지 = pg.image.load('img/배경.png')
배경이미지 = pg.transform.scale(배경이미지, (화면가로길이, 화면세로길이))
개리점프이미지 = pg.image.load('img/개리-뛰는-모습5(점프).png')
개리점프이미지 = pg.transform.scale(개리점프이미지, (100, 100))
개리착지이미지 = pg.image.load('img/개리-뛰는-모습6(착지).png')
개리착지이미지 = pg.transform.scale(개리착지이미지, (100, 100))
개리뛰기이미지리스트 = [pg.image.load(f'img/개리-뛰는-모습{인덱스}.png') for 인덱스 in range(1, 5)]
for 인덱스 in range(len(개리뛰기이미지리스트)):
개리뛰기이미지리스트[인덱스] = pg.transform.scale(개리뛰기이미지리스트[인덱스], (100, 100))
개리스프라이트 = 스프라이트_생성(개리뛰기이미지리스트[0])
돌이미지 = pg.image.load('img/돌.png')
돌이미지 = pg.transform.scale(돌이미지, (100, 100))
개리동료이미지 = pg.image.load('img/동료_구출-전.png')
개리동료이미지 = pg.transform.scale(개리동료이미지, (100, 100))
개리동료구출이미지 = pg.image.load('img/동료_구출-후.png')
개리동료구출이미지 = pg.transform.scale(개리동료구출이미지, (100, 100))
개리동료스프라이트 = 스프라이트_생성(개리동료이미지)
포탈이미지 = pg.image.load('img/포탈.png')
포탈이미지 = pg.transform.scale(포탈이미지, (100, 100))
포탈스프라이트 = 스프라이트_생성(포탈이미지)
재시작버튼이미지 = pg.image.load('img/다시하기-버튼.png')
재시작버튼이미지 = pg.transform.scale(재시작버튼이미지, (170, 170))
게임요소초기화()
시계 = pg.time.Clock()
while 실행여부:
if 게임여부:
화면.blit(배경이미지, (0, 0))
# 게임 시간 계산
경과시간 = 시계.tick(60) / 1000
게임시간 += 경과시간
게임시작시간글자 = 글꼴.render("%02d:%05.2f" % (게임시간 / 60, 게임시간 % 60), True, 검은색)
화면.blit(게임시작시간글자, (10, 10))
점수문자열 = str(점수)
점수글자 = 글꼴.render("구출한 동족 수 : " + 점수문자열, True, 검은색)
화면.blit(점수글자, (600, 10))
재시작버튼 = 화면.blit(재시작버튼이미지, (660, 300))
개리스프라이트.rect.x, 개리스프라이트.rect.y = 개리위치[0], 개리위치[1]
화면.blit(개리스프라이트.image, 개리스프라이트.rect)
# 개리 동족 및 포탈 그리기, 개리 동족 구출하기
개리동료스프라이트.rect.x, 개리동료스프라이트.rect.y = 개리동료위치[0], 개리동료위치[1]
화면.blit(개리동료스프라이트.image, 개리동료스프라이트.rect)
포탈스프라이트.rect.x, 포탈스프라이트.rect.y = 포탈위치[0], 포탈위치[1]
화면.blit(포탈스프라이트.image, 포탈스프라이트.rect)
if not 개리동료구출상태:
개리동료스프라이트.image = 개리동료이미지
if pg.sprite.collide_mask(개리스프라이트, 개리동료스프라이트):
개리동료구출상태 = True
개리동료위치[0] = 15
개리동료위치[1] = 개리위치[1]
개리동료위치[0] -= 요소들속도 * 경과시간
if 개리동료위치[0] < -50:
개리동료위치[0] = 개리동료최초위치
else:
개리동료스프라이트.image = 개리동료구출이미지
if pg.sprite.collide_mask(개리동료스프라이트, 포탈스프라이트):
개리동료위치[0] = 개리동료최초위치
개리동료위치[1] = 개리시작높이
점수 += 1
포탈위치[0] = 포탈최초위치
개리동료구출상태 = False
print(f"점수 = {점수}") # 점수 확인용
포탈위치[0] -= 요소들속도 * 경과시간
if 포탈위치[0] < -50:
포탈위치[0] = 포탈최초위치
for 돌멩이위치, 돌멩이스프라이트 in zip(돌멩이위치리스트, 돌멩이스프라이트리스트):
돌멩이스프라이트.rect.x, 돌멩이스프라이트.rect.y = 돌멩이위치[0], 돌멩이위치[1]
화면.blit(돌멩이스프라이트.image, 돌멩이스프라이트.rect)
if pg.sprite.collide_mask(개리스프라이트, 돌멩이스프라이트) != None:
게임여부 = False
if (개리동료위치[0] > 15 and pg.sprite.collide_mask(돌멩이스프라이트, 개리동료스프라이트)) or pg.sprite.collide_mask(돌멩이스프라이트, 포탈스프라이트):
돌멩이위치[0] -= random.random() * 100 + 100
돌멩이위치[0] -= 요소들속도 * 경과시간
if 돌멩이위치[0] < -100:
돌멩이스프라이트리스트.remove(돌멩이스프라이트)
돌멩이위치리스트.remove(돌멩이위치)
# 개리 점프
if 점프상태:
개리스프라이트.image = 점프속도 > 0 and 개리점프이미지 or 개리착지이미지
개리위치[1] -= 점프속도 * 경과시간 * 1000
점프속도 -= 점프기본속도 * 경과시간 * 2
if 개리동료구출상태:
개리동료위치[1] = 개리위치[1]
if 개리위치[1] >= 개리시작높이:
개리위치[1] = 개리시작높이
점프상태 = False
점프속도 = 점프기본속도
else:
개리동작업데이트시간 += 경과시간
if 개리동작업데이트시간 > 0.2:
개리동작업데이트시간 = 0
개리스프라이트.image = 개리뛰기이미지리스트[개리뛰기상태]
개리뛰기상태 += 개리뛰는흐름
if 개리뛰기상태 == len(개리뛰기이미지리스트) - 1 or 개리뛰기상태 == 0:
개리뛰는흐름 *= -1
돌멩이생성시간 -= 경과시간
if 돌멩이생성시간 <= 0:
돌멩이스프라이트리스트.append(스프라이트_생성(돌이미지))
돌멩이위치리스트.append([900, 돌멩이시작높이])
돌멩이생성시간 = random.random() * 2 + 1
for 이벤트 in pg.event.get():
if 이벤트.type == pg.QUIT:
실행여부 = False
elif 이벤트.type == pg.KEYDOWN:
if 게임여부 and 이벤트.key == pg.K_SPACE and not 점프상태:
점프상태 = True
elif 이벤트.type == pg.MOUSEBUTTONDOWN:
클릭위치 = pg.mouse.get_pos()
if 재시작버튼.collidepoint(클릭위치):
게임요소초기화()
pg.display.update()
pg.display.quit()
2. 상세 설명
2-1. 구현 방식(정리)
- 게임요소들을 추가하는 코드를 함수화합니다.
- 글자를 표시하기 위한 글꼴 객체와 색깔 변수를 만들고 재시작 버튼 이미지를 로드하고 그려줍니다.
- 개리동료와 포탈과 돌멩이가 겹칠 경우 돌멩이 위치를 재조정하도록 구현합니다.
- 재시작 버튼의 클릭을 감지하고 게임요소초기화 함수를 사용합니다.
2-2. 구현
흰색 = (255, 255, 255)
검은색 = (0, 0, 0)
글꼴 = pg.font.SysFont("hy얕은샘물m", 30)
- RGB값에 따라서 검은색과 흰색을 튜플로 구성하였습니다.
- 글꼴 : 화면에 보여지는 글자들의 Font 객체입니다.
- 글꼴에 경우 pygame.font.get_fonts()로 확인할 수 있습니다.
- 글꼴이 없는 경우 한글은 표시되지 않을 수 있습니다.
재시작버튼이미지 = pg.image.load('img/다시하기-버튼.png')
재시작버튼이미지 = pg.transform.scale(재시작버튼이미지, (170, 170))
def 게임요소초기화():
global 게임시간, 게임여부, 개리시작높이, 점수
global 개리뛰는상태, 개리뛰는흐름, 개리동작업데이트시간, 점프기본속도, 점프속도, 점프상태, 개리위치
global 요소들속도, 돌멩이생성시간, 돌멩이시작높이, 돌멩이위치리스트, 돌멩이스프라이트리스트
global 개리동료구출상태, 개리동료최초위치, 개리동료위치
global 포탈최초위치, 포탈위치
게임시간 = 0
게임여부 = True
개리시작높이 = 255
점수 = 0
개리뛰는상태 = 0
개리뛰는흐름 = 1
개리동작업데이트시간 = 0
점프기본속도 = 0.1
점프속도 = 점프기본속도
점프상태 = False
개리위치 = [70, 개리시작높이]
요소들속도 = 300
돌멩이생성시간 = 1
돌멩이시작높이 = 280
돌멩이위치리스트 = [[500, 돌멩이시작높이]]
돌멩이스프라이트리스트 = [스프라이트_생성(돌이미지) for _ in 돌멩이위치리스트]
개리동료구출상태 = False
개리동료최초위치 = 2400
개리동료위치 = [개리동료최초위치, 개리시작높이]
포탈최초위치 = 1200
포탈위치 = [포탈최초위치, 개리시작높이]
- 게임요소를 초기화하는 부분을 함수화합니다.(재시작 버튼 클릭 이벤트를 위해서 입니다.)
- 게임시간 : 게임을 하는 시간을 보여주기 위한 변수입니다.(재시작시 초기화됩니다.)
게임시간 += 경과시간
게임시작시간글자 = 글꼴.render("%02d:%05.2f" % (게임시간 / 60, 게임시간 % 60), True, 검은색)
화면.blit(게임시작시간글자, (10, 10))
점수문자열 = str(점수)
점수글자 = 글꼴.render("구출한 동족 수 : " + 점수문자열, True, 검은색)
화면.blit(점수글자, (600, 10))
재시작버튼 = 화면.blit(재시작버튼이미지, (660, 300))
- 게임시작시간글자 : 시간을 분과 초로 구분하여 렌더링합니다.(f문자열 사용할 경우 자릿수제한이 어려워 % 연산자를 사용하였습니다.)
if (개리동료위치[0] > 15 and pg.sprite.collide_mask(돌멩이스프라이트, 개리동료스프라이트)) or pg.sprite.collide_mask(돌멩이스프라이트, 포탈스프라이트):
돌멩이위치[0] -= random.random() * 100 + 100
- 개리동료나 포탈과 위치가 겹칠 때 돌멩이 위치를 조정합니다. 단, 개리동료가 구출된 상태에서는 개리동료와 돌멩이 충돌 체크는 하지 않습니다.
elif 이벤트.type == pg.MOUSEBUTTONDOWN:
클릭위치 = pg.mouse.get_pos()
if 재시작버튼.collidepoint(클릭위치):
게임요소초기화()
- Surface.collidepoint(위치)를 이용하여 재시작버튼 클릭을 감지하고 위에 만들어둔 초기화 요소로 게임을 재시작합니다.
3. 실행 화면