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] 소울곰속도 = 100 광석최대상태 = 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() 이미지움직임최대시간 = 0.2 이미지움직임시간 = 0 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 # 캐릭터 움직이기 keys = pg.key.get_pressed() if keys[pg.K_LEFT] or keys[pg.K_RIGHT] or keys[pg.K_UP] or keys[pg.K_DOWN]: 이미지움직임시간 -= 흐른시간 if keys[pg.K_LEFT] or keys[pg.K_RIGHT]: if keys[pg.K_LEFT]: if 소울곰이미지상태 != '이동': 소울곰이미지상태 = '이동' 이미지움직임시간 = 0 if 소울곰위치[0] >= 0: 소울곰위치[0] -= 소울곰속도 * 흐른시간 if keys[pg.K_RIGHT]: if 소울곰이미지상태 != "반대이동": 소울곰이미지상태 = "반대이동" 이미지움직임시간 = 0 if 소울곰위치[0] < 화면가로길이 - 게임요소크기[0] + 20: 소울곰위치[0] += 소울곰속도 * 흐른시간 if keys[pg.K_UP] or keys[pg.K_DOWN]: if 소울곰이미지상태 != '이동' and 소울곰이미지상태 != '반대이동': 소울곰이미지상태 = '이동' if keys[pg.K_UP] and 소울곰위치[1] >= 시간이미지크기[1]: 소울곰위치[1] -= 소울곰속도 * 흐른시간 elif keys[pg.K_DOWN] and 소울곰위치[1] < 화면세로길이-능력치이미지크기[1] - 게임요소크기[1]: 소울곰위치[1] += 소울곰속도 * 흐른시간 if 이미지움직임시간 <= 0: 이미지움직임시간 = 이미지움직임최대시간 소울곰이미지인덱스 += 소울곰이미지흐름 # 현재1 소울곰스프라이트.image = 소울곰이미지딕셔너리[소울곰이미지상태][소울곰이미지인덱스] if 소울곰이미지인덱스==0 or 소울곰이미지인덱스==len(소울곰이미지딕셔너리[소울곰이미지상태]) -1: 소울곰이미지흐름 *= -1 else: 이미지움직임시간 = 0 소울곰이미지상태 = '멈춤' 소울곰이미지흐름 = 1 소울곰이미지인덱스 = 0 소울곰스프라이트.image = 소울곰이미지딕셔너리[소울곰이미지상태] pg.display.update() pg.display.quit()
2. 상세 내용
소울곰속도 = 100
- 소울곰속도는 소울곰의 이동속도를 나타내는 변수입니다.
이미지움직임최대시간 = 0.2 이미지움직임시간 = 0
- 이미지움직임최대시간은 캐릭터의 애니메이션 속도를 나타냅니다.(0.2는 0.2초당 애니메이션이 변화하는 것을 의미합니다.)
- 이미지움직임시간은 애니메이션이 실제로 움직이기 위해 변화시키는 시간입니다.
keys = pg.key.get_pressed() if keys[pg.K_LEFT] or keys[pg.K_RIGHT] or keys[pg.K_UP] or keys[pg.K_DOWN]: 이미지움직임시간 -= 흐른시간 if keys[pg.K_LEFT] or keys[pg.K_RIGHT]: if keys[pg.K_LEFT]: if 소울곰이미지상태 != '이동': 소울곰이미지상태 = '이동' 이미지움직임시간 = 0 if 소울곰위치[0] >= 0: 소울곰위치[0] -= 소울곰속도 * 흐른시간 if keys[pg.K_RIGHT]: if 소울곰이미지상태 != "반대이동": 소울곰이미지상태 = "반대이동" 이미지움직임시간 = 0 if 소울곰위치[0] < 화면가로길이 - 게임요소크기[0] + 20: 소울곰위치[0] += 소울곰속도 * 흐른시간 if keys[pg.K_UP] or keys[pg.K_DOWN]: if 소울곰이미지상태 != '이동' and 소울곰이미지상태 != '반대이동': 소울곰이미지상태 = '이동' if keys[pg.K_UP] and 소울곰위치[1] >= 시간이미지크기[1]: 소울곰위치[1] -= 소울곰속도 * 흐른시간 elif keys[pg.K_DOWN] and 소울곰위치[1] < 화면세로길이-능력치이미지크기[1] - 게임요소크기[1]: 소울곰위치[1] += 소울곰속도 * 흐른시간 if 이미지움직임시간 <= 0: 이미지움직임시간 = 이미지움직임최대시간 소울곰이미지인덱스 += 소울곰이미지흐름 # 현재1 소울곰스프라이트.image = 소울곰이미지딕셔너리[소울곰이미지상태][소울곰이미지인덱스] if 소울곰이미지인덱스==0 or 소울곰이미지인덱스==len(소울곰이미지딕셔너리[소울곰이미지상태]) -1: 소울곰이미지흐름 *= -1 else: 이미지움직임시간 = 0 소울곰이미지상태 = '멈춤' 소울곰이미지흐름 = 1 소울곰이미지인덱스 = 0 소울곰스프라이트.image = 소울곰이미지딕셔너리[소울곰이미지상태]
- pg.key.get_pressed() 는 키보드가 눌렸는지를 0, 1로 이루어진 리스트로 반환하는 함수입니다.
- 알고리즘
- 화살표 위, 아래, 오른쪽, 왼쪽 키를 눌렀을 때
- 화살표 오른쪽 또는 왼쪽 키를 눌렀을 때
- 캐릭터의 이미지를 바꿔 줍니다.(여기서는 연산 낭비를 줄이기 위해 if문을 사용했지만 없어도 무방합니다.)
- 소울곰위치 이동 시 속도 * 흐른시간을 해주는 이유는 컴퓨터 성능에 관계없이 일정한 거리를 이동시키기 위해서입니다.
- 화살표 위, 아래 키를 눌렀을 때
- 이동 중이 아닌 경우 이미지상태가 멈춤으로 고정되 버리기 때문에 이동 이미지로 바꿔줍니다.(이동 중인 경우는 위에 화살표 오른쪽 또는 왼쪽 키를 눌렀을 때를 확인해주세요.)
- 이동에 대한 제한 크기는 시간이 나오는 이미지 부분과 능력치이미지 부분을 제외한 나머지 부분으로 계산하였습니다.
- 이미지 애니메이션 원리
- 이미지움직임시간에 흐른시간은 빼준다.
- 이미지움직임시간이 0 이하가 되면 아래에 동작을 해준다
- 이미지움직임시간을 최대시간으로 변경한다.(다음 이미지 변경을 위해서)
- 이미지인덱스는 이미지흐름만큼 더해준다.
- 스프라이트의 image를 바꿔준다.
- 이미지인덱스가 처음이나 끝일 경우 이미지흐름을 반대로 바꿔준다
- 그 외 : 광석을 캐거나 움직이지 않기 때문에 멈춤 상태로 바꿉니다.
- 다른 움직임이 진행될 때 바로 image가 바뀔 수 있도록 이미지움직임시간을 0으로 바꿔줍니다.
- 소울곰이미지상태와 인덱스 그리고 흐름 변수 역시 초기 상태로 되돌립니다.
- 최종적으로 image를 바꿔줍니다.
이미지흐름의 존재 이유는 이미지인덱스의 변화가 1-2-3-4-3-2-1이기 때문입니다.
3. 실행 결과
