⛏️

001 게임 요소 및 텍스트추가

1. 실행 코드

import pygame as pg # 이미지 초기화 def 스프라이트생성(이미지, 위치, 상태=None): 스프라이트 = pg.sprite.Sprite() 스프라이트.image = 이미지 스프라이트.rect = 스프라이트.image.get_rect() 스프라이트.rect.x, 스프라이트.rect.y = 위치[0], 위치[1] if 상태 != None: 스프라이트.상태 = 상태 return 스프라이트 pg.init() # 게임기본설정 실행여부 = True 화면가로길이, 화면세로길이 = 952, 913 화면 = pg.display.set_mode([화면가로길이, 화면세로길이]) pg.display.set_caption('광석채굴!') # 색깔 설정 흰색 = (255, 255, 255) 검은색 = (0, 0, 0) # 글꼴 설정 글꼴 = pg.font.SysFont('hy얕은샘물m', 50) 작은글꼴 = pg.font.SysFont('hy얕은샘물m', 40) # 게임 요소 초기화 소울곰위치 = [화면가로길이 // 2, 화면세로길이 // 2] 광석최대상태 = 5 코인 = 0 전체시간 = 0 배경이미지 = pg.image.load('img/배경.png') 배경이미지 = pg.transform.scale(배경이미지, (화면가로길이, 화면세로길이)) 시간이미지 = pg.image.load('img/시간-바.png') 시간이미지크기 = (337, 89) 시간이미지 = pg.transform.scale(시간이미지, 시간이미지크기) 코인이미지 = pg.image.load('img/코인-바.png') 코인이미지크기 = (337, 89) 코인이미지 = pg.transform.scale(코인이미지, 코인이미지크기) 게임요소크기 = (152, 152) 소울곰이미지딕션너리 = {"이동": [], "반대이동" : [], "캐기" : []} 소울곰멈춤이미지 = pg.image.load(f'img/소울곰_멈춘상태.png') 소울곰멈춤이미지 = pg.transform.scale(소울곰멈춤이미지, 게임요소크기) 소울곰이미지딕션너리["멈춤"] = 소울곰멈춤이미지 for 인덱스 in range(4): 소울곰뛰는모습이미지 = pg.image.load(f'img/소울곰_뛰는모습_{인덱스 + 1}.png') 소울곰뛰는모습이미지 = pg.transform.scale(소울곰뛰는모습이미지, 게임요소크기) 소울곰이미지딕션너리["이동"].append(소울곰뛰는모습이미지) 소울곰뛰는모습반전이미지 = pg.image.load(f'img/소울곰_뛰는모습_반전_{인덱스 + 1}.png') 소울곰뛰는모습반전이미지 = pg.transform.scale(소울곰뛰는모습반전이미지, 게임요소크기) 소울곰이미지딕션너리["반대이동"].append(소울곰뛰는모습반전이미지) for 인덱스 in range(3): 소울곰캐는모습이미지 = pg.image.load(f'img/소울곰_캐는모습_{인덱스 + 1}.png') 소울곰캐는모습이미지 = pg.transform.scale(소울곰캐는모습이미지, 게임요소크기) 소울곰이미지딕션너리["캐기"].append(소울곰캐는모습이미지) 소울곰이미지상태 = "멈춤" 소울곰이미지인덱스 = 0 소울곰이미지흐름 = 1 소울곰스프라이트 = 스프라이트생성(소울곰이미지딕션너리[소울곰이미지상태], 소울곰위치) 광석이미지리스트 = [] for 인덱스 in range(5): 광석이미지 = pg.image.load(f'img/광석_{5 - 인덱스}.png') 광석이미지 = pg.transform.scale(광석이미지, 게임요소크기) 광석이미지리스트.append(광석이미지) 광석스프라이트리스트 = [] 광석스프라이트리스트.append(스프라이트생성(광석이미지리스트[-1], (200, 200), 광석최대상태)) # 오른쪽 하단 능력치 아이콘 이미지 능력치이미지 = pg.image.load('img/능력치.png') 능력치이미지크기 = (545, 190) 능력치이미지 = pg.transform.scale(능력치이미지, 능력치이미지크기) 시계 = pg.time.Clock() while 실행여부: 화면.blit(배경이미지, (0, 0)) 흐른시간 = 시계.tick(60)/ 1000 전체시간 += 흐른시간 시간문자열 = '%02d:%05.2f' % (전체시간 / 60, 전체시간 % 60) 게임시작시간글자 = 글꼴.render(시간문자열, True, 검은색) 화면.blit(시간이미지, (30, 10)) 화면.blit(게임시작시간글자, (시간이미지크기[0] - 21 * len(시간문자열), 40)) 코인문자열 = str(코인) 코인글자 = 글꼴.render(코인문자열, True, 검은색) 화면.blit(코인이미지, (화면가로길이 - 30 - 코인이미지크기[0], 10)) 화면.blit(코인글자, (화면가로길이 - 70 - 21 * len(코인문자열), 40)) for 광석_스프라이트 in 광석스프라이트리스트: 화면.blit(광석_스프라이트.image, 광석_스프라이트.rect) 소울곰스프라이트.rect.x, 소울곰스프라이트.rect.y = 소울곰위치[0], 소울곰위치[1] 화면.blit(소울곰스프라이트.image, 소울곰스프라이트.rect) 화면.blit(능력치이미지, (화면가로길이 - 능력치이미지크기[0], 화면세로길이 - 능력치이미지크기[1])) 파워글자 = 작은글꼴.render(str(1), True, 검은색) 화면.blit(파워글자, (500, 화면세로길이 - 능력치이미지크기[1] + 55)) 속도글자 = 작은글꼴.render(str(1), True, 검은색) 화면.blit(속도글자, (610, 화면세로길이 - 능력치이미지크기[1] + 55)) 광석글자 = 작은글꼴.render(str(1), True, 검은색) 화면.blit(광석글자, (720, 화면세로길이 - 능력치이미지크기[1] + 55)) for 이벤트 in pg.event.get(): if 이벤트.type == pg.QUIT: 실행여부 = False pg.display.update() pg.display.quit()
 

2. 상세 내용

# 게임기본설정 실행여부 = True 화면가로길이, 화면세로길이 = 952, 913 화면 = pg.display.set_mode([화면가로길이, 화면세로길이]) pg.display.set_caption('광석채굴!') # 색깔 설정 흰색 = (255, 255, 255) 검은색 = (0, 0, 0) # 글꼴 설정 글꼴 = pg.font.SysFont('hy얕은샘물m', 50) 작은글꼴 = pg.font.SysFont('hy얕은샘물m', 40) # 게임 요소 초기화 소울곰위치 = [화면가로길이 // 2, 화면세로길이 // 2] 광석최대상태 = 5 코인 = 0 전체시간 = 0
  • 화면 가로, 세로 길이를 지정하고, 게임 이름을 설정합니다.
  • 색깔과 글꼴을 설정합니다.
  • 기본적으로 사용할 변수들을 초기화합니다.
    • 소울곰 위치 : 소울곰이 표시되는 위치를 나타내는 리스트입니다
    • 광석최대상태 : 광석의 초기 상태를 나타내는 변수입니다.
    • 코인 : 캐릭터 능력치 업그레이드를 위한 코인 변수입니다.
    • 전체 시간 : 화면 상단 오른쪽의 표시되는 시간(초)를 나타내는 변수입니다.
 
def 스프라이트생성(이미지, 위치, 상태=None): 스프라이트 = pg.sprite.Sprite() 스프라이트.image = 이미지 스프라이트.rect = 스프라이트.image.get_rect() 스프라이트.rect.x, 스프라이트.rect.y = 위치[0], 위치[1] if 상태 != None: 스프라이트.상태 = 상태 return 스프라이트
  • 각 이미지들을 스프라이트 생성하기 위하여 스프라이트생성 함수를 만듭니다.(스프라이트를 사용하는 이유는 각 객체별 충돌을 판별하기 위함입니다.)
  • 여기서 상태는 Sprite 클래스의 존재하는 변수가 아닌 우리가 이번 게임에서 사용할 광석의 상태를 나타냅니다.
 
배경이미지 = pg.image.load('img/배경.png') 배경이미지 = pg.transform.scale(배경이미지, (화면가로길이, 화면세로길이)) 시간이미지 = pg.image.load('img/시간-바.png') 시간이미지크기 = (337, 89) 시간이미지 = pg.transform.scale(시간이미지, 시간이미지크기) 코인이미지 = pg.image.load('img/코인-바.png') 코인이미지크기 = (337, 89) 코인이미지 = pg.transform.scale(코인이미지, 코인이미지크기) # .. 중략 .. # 오른쪽 하단 능력치 아이콘 이미지 능력치이미지 = pg.image.load('img/능력치.png') 능력치이미지크기 = (545, 190) 능력치이미지 = pg.transform.scale(능력치이미지, 능력치이미지크기)
  • 화면에 보여질 이미지들을 가져온 후 pg.transform.scale를 통해 크기를 조절합니다.
 
게임요소크기 = (152, 152) 소울곰이미지딕션너리 = {"이동": [], "반대이동" : [], "캐기" : []} 소울곰멈춤이미지 = pg.image.load(f'img/소울곰_멈춘상태.png') 소울곰멈춤이미지 = pg.transform.scale(소울곰멈춤이미지, 게임요소크기) 소울곰이미지딕션너리["멈춤"] = 소울곰멈춤이미지 for 인덱스 in range(4): 소울곰뛰는모습이미지 = pg.image.load(f'img/소울곰_뛰는모습_{인덱스 + 1}.png') 소울곰뛰는모습이미지 = pg.transform.scale(소울곰뛰는모습이미지, 게임요소크기) 소울곰이미지딕션너리["이동"].append(소울곰뛰는모습이미지) 소울곰뛰는모습반전이미지 = pg.image.load(f'img/소울곰_뛰는모습_반전_{인덱스 + 1}.png') 소울곰뛰는모습반전이미지 = pg.transform.scale(소울곰뛰는모습반전이미지, 게임요소크기) 소울곰이미지딕션너리["반대이동"].append(소울곰뛰는모습반전이미지) for 인덱스 in range(3): 소울곰캐는모습이미지 = pg.image.load(f'img/소울곰_캐는모습_{인덱스 + 1}.png') 소울곰캐는모습이미지 = pg.transform.scale(소울곰캐는모습이미지, 게임요소크기) 소울곰이미지딕션너리["캐기"].append(소울곰캐는모습이미지) 소울곰이미지상태 = "멈춤" 소울곰이미지인덱스 = 0 소울곰이미지흐름 = 1 소울곰스프라이트 = 스프라이트생성(소울곰이미지딕션너리[소울곰이미지상태], 소울곰위치) 광석이미지리스트 = [] for 인덱스 in range(5): 광석이미지 = pg.image.load(f'img/광석_{5 - 인덱스}.png') 광석이미지 = pg.transform.scale(광석이미지, 게임요소크기) 광석이미지리스트.append(광석이미지) 광석스프라이트리스트 = [] 광석스프라이트리스트.append(스프라이트생성(광석이미지리스트[-1], (200, 200), 광석최대상태))
  • 소울곰의 동작은 멈춤, 이동, 반대 이동, 캐기로 구분됩니다.
    • 그리고 소울곰스프라이트에서 image를 통하여 그리게 되는데 각 동작에 따라서 이미지가 변경되기에 파이썬의 dictionary를 통하여 이미지들을 관리합니다.
    • 소울곰이미지상태 : 소울곰 상태에 따라 소울곰스프라이트가 그려질 이미지를 정하는 변수입니다.
    • 소울곰이미지인덱스 : 소울곰의 상태에 따라 뛰거나 캐는 동작을 보여줄 때의 이미지를 보여주기 위한 변수입니다.
    • 소울곰이미지흐름 : 뛰거나 캐는 동작의 이미지 들은 1 ~ 4와 같이 구성되는데 이미지 로드 방식이 1-2-3-4-3-2-1과 같은 .방식입니다. 따라서 인덱스가 증가하다가 떨어져야 하므로 이를 위해 사용하는 변수입니다.
  • 광석은 상태에 따라서 이미지가 변하기 때문에 리스트로 관리합니다.
 
시계 = pg.time.Clock() while 실행여부: 화면.blit(배경이미지, (0, 0)) 흐른시간 = 시계.tick(60)/ 1000 전체시간 += 흐른시간 시간문자열 = '%02d:%05.2f' % (전체시간 / 60, 전체시간 % 60) 게임시작시간글자 = 글꼴.render(시간문자열, True, 검은색) 화면.blit(시간이미지, (30, 10)) 화면.blit(게임시작시간글자, (시간이미지크기[0] - 21 * len(시간문자열), 40))
  • Clock 클래스는 tick 함수를 통하여 프레임을 고정시키기 위해 사용됩니다.(프레임을 고정하는 이유는 캐릭터가 이동하거나 광석을 캘 때 자연스러운 동작을 보이기 위함입니다.)
  • Clock.tick(숫자) 함수는 프레임 시간을 고정하고 그 프레임 시간을 반환합니다. 이 때 반환되는 시간은 milli second 기준이기 때문에 1000으로 나눠줍니다.
  • 시간이미지크기[0] - 21 * len(시간문자열) 의 식은 시간바 이미지 내의 글자를 오른쪽에 표기하기 위함입니다.
 
코인문자열 = str(코인) 코인글자 = 글꼴.render(코인문자열, True, 검은색) 화면.blit(코인이미지, (화면가로길이 - 30 - 코인이미지크기[0], 10)) 화면.blit(코인글자, (화면가로길이 - 70 - 21 * len(코인문자열), 40)) for 광석_스프라이트 in 광석스프라이트리스트: 화면.blit(광석_스프라이트.image, 광석_스프라이트.rect) 소울곰스프라이트.rect.x, 소울곰스프라이트.rect.y = 소울곰위치[0], 소울곰위치[1] 화면.blit(소울곰스프라이트.image, 소울곰스프라이트.rect) 화면.blit(능력치이미지, (화면가로길이 - 능력치이미지크기[0], 화면세로길이 - 능력치이미지크기[1])) 파워글자 = 작은글꼴.render(str(1), True, 검은색) 화면.blit(파워글자, (500, 화면세로길이 - 능력치이미지크기[1] + 55)) 속도글자 = 작은글꼴.render(str(1), True, 검은색) 화면.blit(속도글자, (610, 화면세로길이 - 능력치이미지크기[1] + 55)) 광석글자 = 작은글꼴.render(str(1), True, 검은색) 화면.blit(광석글자, (720, 화면세로길이 - 능력치이미지크기[1] + 55)) for 이벤트 in pg.event.get(): if 이벤트.type == pg.QUIT: 실행여부 = False pg.display.update()
  • 화면가로길이 - 70 - 21 * len(코인문자열) 의 식은 글자로 코인바 이미지 내에서 오른쪽 정렬처럼 보이기 위한 식입니다.
    • 여기서는 코인바 이미지 자체가 화면 오른쪽에 위치해 있어 화면 전체에서 오른쪽에 위치하는 방식을 사용하였습니다.
    • 화면가로길이를 x좌표로 두면 화면 바로 옆에 위치하게 됩니다.
    • 화면 끝에서 글자를 보일 여백(70)만큼 뺍니다.
    • 글자 크기(21) * 글자 수 만큼 뺍니다.
  • 스프라이트 객체에는 보여질 이미지인 image와 크기 및 위치 값을 가지고 있는 rect가 있는데 이를 통하여 그립니다.
 

3. 실행 결과

 
notion imagenotion image