⛏️

002 캐릭터 이동

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문을 사용했지만 없어도 무방합니다.)
        • 소울곰위치 이동 시 속도 * 흐른시간을 해주는 이유는 컴퓨터 성능에 관계없이 일정한 거리를 이동시키기 위해서입니다.
      • 화살표 위, 아래 키를 눌렀을 때
        • 이동 중이 아닌 경우 이미지상태가 멈춤으로 고정되 버리기 때문에 이동 이미지로 바꿔줍니다.(이동 중인 경우는 위에 화살표 오른쪽 또는 왼쪽 키를 눌렀을 때를 확인해주세요.)
        • 이동에 대한 제한 크기는 시간이 나오는 이미지 부분과 능력치이미지 부분을 제외한 나머지 부분으로 계산하였습니다.
      • 이미지 애니메이션 원리
          1. 이미지움직임시간에 흐른시간은 빼준다.
          1. 이미지움직임시간이 0 이하가 되면 아래에 동작을 해준다
            1. 이미지움직임시간을 최대시간으로 변경한다.(다음 이미지 변경을 위해서)
            2. 이미지인덱스는 이미지흐름만큼 더해준다.
            3. 스프라이트의 image를 바꿔준다.
            4. 이미지인덱스가 처음이나 끝일 경우 이미지흐름을 반대로 바꿔준다
              1. 이미지흐름의 존재 이유는 이미지인덱스의 변화가 1-2-3-4-3-2-1이기 때문입니다.
    • 그 외 : 광석을 캐거나 움직이지 않기 때문에 멈춤 상태로 바꿉니다.
      • 다른 움직임이 진행될 때 바로 image가 바뀔 수 있도록 이미지움직임시간을 0으로 바꿔줍니다.
      • 소울곰이미지상태와 인덱스 그리고 흐름 변수 역시 초기 상태로 되돌립니다.
      • 최종적으로 image를 바꿔줍니다.

3. 실행 결과

notion imagenotion image