🍳

002 요리하기

1. 실행 코드

import pygame as pg def 스프라이트생성(이미지, 위치): 스프라이트 = pg.sprite.Sprite() 스프라이트.image = 이미지 스프라이트.rect = 스프라이트.image.get_rect() 스프라이트.rect.x, 스프라이트.rect.y = 위치[0], 위치[1] return 스프라이트 pg.init() 실행여부 = True 화면가로길이, 화면세로길이 = 874, 987 화면 = pg.display.set_mode([화면가로길이, 화면세로길이]) pg.display.set_caption('부족들의 마음을 요리로 사로잡아라!') #색 지정 흰색 = (255, 255, 255) 검은색 = (0, 0, 0) #글꼴 설정 글꼴 = pg.font.SysFont('malgungothic', 25) #게임 요소 초기화 경과시간 = 0 점수 = 0 시계 = pg.time.Clock() 현재챕터 = 1 최종챕터 = 10 자바독상태 = "기본자세" 자바독인덱스 = 0 자바독움직임흐름 = 1 현재요리 = "사료" 현재요리상태 = "전" 요리초기위치 = [424, 248] 요리위치 = [요리초기위치[0] - 53, 요리초기위치[1] - 30] 손님가로숫자, 손님세로숫자 = 4, 2 요리상태리스트 = ['전', '후'] 요리리스트 = ['사료', '뼈다귀', '물'] 배경이미지 = pg.image.load('img/배경.png') 배경이미지 = pg.transform.scale(배경이미지, (화면가로길이, 화면세로길이)) 챕터바이미지크기 = (358, 61) 챕터바이미지 = pg.image.load('img/챕터바.png') 챕터바이미지 = pg.transform.scale(챕터바이미지, 챕터바이미지크기) 자바독이미지크기 = (238, 238) 자바독이미지딕셔너리 = {} 자바독이미지딕셔너리['기본자세'] = pg.image.load('img/자바독_기본자세.png') 자바독이미지딕셔너리['기본자세'] = pg.transform.scale(자바독이미지딕셔너리['기본자세'], 자바독이미지크기) for 요리 in 요리리스트: 자바독이미지딕셔너리[요리] = [] for 인덱스 in range(3): 자바독요리중이미지 = pg.image.load(f'img/자바독_{요리}_요리중_{인덱스+1}.png') 자바독요리중이미지 = pg.transform.scale(자바독요리중이미지, 자바독이미지크기) 자바독이미지딕셔너리[요리].append(자바독요리중이미지) 주방테이블이미지크기 = (668, 173) 주방테이블이미지 = pg.image.load('img/주방-테이블.png') 주방테이블이미지 = pg.transform.scale(주방테이블이미지, 주방테이블이미지크기) 요리이미지크기딕셔너리 = {'사료':(106, 61), '뼈다귀':(106, 61), '물':(106, 61)} 요리이미지딕셔너리 = {} for 요리상태 in 요리상태리스트: 요리이미지딕셔너리[요리상태] = {} for 요리 in 요리리스트: 요리이미지딕셔너리[요리상태][요리] = pg.image.load(f'img/{요리}_요리{요리상태}.png') 요리이미지딕셔너리[요리상태][요리] = pg.transform.scale(요리이미지딕셔너리[요리상태][요리], 요리이미지크기딕셔너리[요리]) 요리스프라이트 = 스프라이트생성(요리이미지딕셔너리['전'][현재요리], 요리위치) 동족이미지크기 = (196, 314) 동족음식생각중이미지 = pg.image.load('img/동족_음식-생각-중.png') 동족음식생각중이미지 = pg.transform.scale(동족음식생각중이미지, 동족이미지크기) 동족스프라이트리스트 = [스프라이트생성(동족음식생각중이미지, (50+동족이미지크기[0]*j, 350+동족이미지크기[1]*i)) for i in range(손님세로숫자) for j in range(손님가로숫자)] 이미지움직임최대시간 = 0.2 이미지움직임시간 = 0 움직임최대횟수 = 3 움직임횟수 = 0 while 실행여부: if 현재챕터 <= 최종챕터: 화면.blit(배경이미지, (0, 0)) 흐른시간 = 시계.tick(60) / 1000 경과시간 += 흐른시간 시간문자열 = '%02d:%02d'%(경과시간/60, 경과시간%60) 경과시간글자 = 글꼴.render(시간문자열, True, 검은색) 화면.blit(챕터바이미지, ((화면가로길이 - 챕터바이미지크기[0]) // 2, 7)) 화면.blit(경과시간글자, (20, 20)) 챕터문자열 = f'{현재챕터}챕터' 챕터글자 = 글꼴.render(챕터문자열, True, 흰색) 화면.blit(챕터글자, ((화면가로길이 - 14 * len(챕터문자열)) // 2 - 10, 20)) 점수문자열 = f'{점수}점' 점수글자 = 글꼴.render(점수문자열, True, 검은색) 화면.blit(점수글자, ((화면가로길이 - 14 * len(점수문자열)) - 30, 20)) if 자바독상태 == '기본자세': 화면.blit(자바독이미지딕셔너리[자바독상태], (321, 85)) else: 화면.blit(자바독이미지딕셔너리[자바독상태][자바독인덱스], (321, 85)) 화면.blit(주방테이블이미지, (100, 192)) for 동족스프라이트 in 동족스프라이트리스트: 화면.blit(동족스프라이트.image, 동족스프라이트.rect) for 인덱스, 요리 in enumerate(요리리스트): 화면.blit(요리이미지딕셔너리['후'][요리], (460 + 90 * 인덱스, 280 - 요리이미지딕셔너리["후"][요리].get_height())) 요리스프라이트.image = 요리이미지딕셔너리[현재요리상태][현재요리] 요리스프라이트.rect.x, 요리스프라이트.rect.y = 요리위치[0], 요리위치[1] 화면.blit(요리스프라이트.image, 요리스프라이트.rect) else: 화면.fill(흰색) pg.display.update() for 이벤트 in pg.event.get(): if 이벤트.type == pg.QUIT: 실행여부 = False keys = pg.key.get_pressed() # print(keys) if keys[pg.K_SPACE]: if 자바독상태 == "기본자세": 자바독상태 = 현재요리 else: 이미지움직임시간 += 흐른시간 if 이미지움직임시간 >= 이미지움직임최대시간: 이미지움직임시간 = 0 자바독인덱스 += 자바독움직임흐름 if 자바독인덱스 == 0 or 자바독인덱스 == len(자바독이미지딕셔너리[자바독상태]) - 1: 자바독움직임흐름 *= -1 움직임횟수 += 1 if 움직임횟수 >= 움직임최대횟수: 현재요리상태 = '후' else: 이미지움직임시간 = 0 자바독상태 = "기본자세" 자바독인덱스 = 0 자바독움직임흐름 = 1 움직임횟수 = 0 pg.display.quit()
 

2. 상세 내용

자바독상태 = "기본자세" 자바독인덱스 = 0 자바독움직임흐름 = 1 현재요리 = "사료" 현재요리상태 = "전"
  • 자바독이 요리를 하기 위해서 필요한 상태들입니다.
  • 자바독상태 : 자바독이 가만히 있는지 또는 특정 요리를 하는지에 대한 변수입니다.
  • 자바독인덱스 : 자바독이 요리를 할 경우 상태에 따라 자연스러운 움직임을 보여주기위한 인덱스 변수입니다.
  • 자바독움직임흐름 : 자바독의 이미지 이동 순서는 1-2-3-2-1입니다. 즉 인덱스가 증가하다가 감소하기를 반복하기 때문에 필요합니다.
  • 현재요리, 현재요리상태 : 현재요리는 당장은 중복되어 쓰이는 음식("사료")을 코드 내에서 보기 편하게 쓰이지만 다음 단원에서는 이것을 통해 할 요리를 바꾸게 됩니다. 현재요리상태는 아직 요리되지 않은 그릇이 요리가 되었을 때 상태를 바꾸기 위해서 사용됩니다.
 
자바독이미지딕셔너리 = {} 자바독이미지딕셔너리['기본자세'] = pg.image.load('img/자바독_기본자세.png') 자바독이미지딕셔너리['기본자세'] = pg.transform.scale(자바독이미지딕셔너리['기본자세'], 자바독이미지크기) for 요리 in 요리리스트: 자바독이미지딕셔너리[요리] = [] for 인덱스 in range(3): 자바독요리중이미지 = pg.image.load(f'img/자바독_{요리}_요리중_{인덱스+1}.png') 자바독요리중이미지 = pg.transform.scale(자바독요리중이미지, 자바독이미지크기) 자바독이미지딕셔너리[요리].append(자바독요리중이미지)
  • 자바독 이미지를 다음과 같이 바꾸어 줍니다.
  • 기존의 자바독 이미지는 기본 이미지만 사용하였으나 요리기능을 넣을 때 요리가 진행되는 이미지들이 따로 있으므로 이를 딕션너리를 통하여 관리합니다. 그리고 기본자세는 가만히 있는 자바독이며 나머지는 각 요리에 맞는 자세들이 있으므로 이를 리스트로 관리합니다.
 
요리스프라이트 = 스프라이트생성(요리이미지딕셔너리['전'][현재요리], 요리위치)
  • 원래 "사료"라고 표시한 부분을 현재요리로 바꿔줍니다.
  • 지금은 현재요리가 "사료"로 고정되었지만 게임을 만들어감에 따라 하고자하는 요리를 변경할 때 사용하게 됩니다.
 
이미지움직임최대시간 = 0.2 이미지움직임시간 = 0 움직임최대횟수 = 3 움직임횟수 = 0
  • 이미지움직임최대시간 : 이제 요리를 하는 과정을 구현하게 되는데 이때 이미지를 바꾸어주는 시간을 의미합니다.
  • 이미지움직임시간 : 이미지움직임시간을 계산하는 변수입니다.
  • 움직임최대횟수 : 요리가 진행될 때 후라이팬이 왔다갔다 하는 횟수를 의미합니다. 여기서는 3으로 지정하였습니다.
  • 움직임횟수 : 움직임횟수를 계산하는 변수입니다.
 
if 자바독상태 == '기본자세': 화면.blit(자바독이미지딕셔너리[자바독상태], (321, 85)) else: 화면.blit(자바독이미지딕셔너리[자바독상태][자바독인덱스], (321, 85))
  • 자바독이미지를 그려주던 부분은 다음과 같이 바꿔줍니다.
  • 이제 자바독은 자세가 바뀌면 요리하는 모습으로 바꾸어주어야 하기 때문에 조건에 따라 그려주는 것을 바꾸어줍니다.
  • 이 코드가 이해되시지 않으면 위의 자바독이미지딕션너리의 구성을 다시 한 번 확인해주세요.
 
요리스프라이트.image = 요리이미지딕셔너리[현재요리상태][현재요리]
  • 요리이미지딕션너리["전"]["사료"]이었던 부분을 위에서 만든 변수가 적용되도록 변경합니다.
  • 요리가 완료되면 완료된 이미지를 그려줘야 하므로 다음과 같이 사용합니다.
 
keys = pg.key.get_pressed() # print(keys) if keys[pg.K_SPACE]: if 자바독상태 == "기본자세": 자바독상태 = 현재요리 else: 이미지움직임시간 += 흐른시간 if 이미지움직임시간 >= 이미지움직임최대시간: 이미지움직임시간 = 0 자바독인덱스 += 자바독움직임흐름 if 자바독인덱스 == 0 or 자바독인덱스 == len(자바독이미지딕셔너리[자바독상태]) - 1: 자바독움직임흐름 *= -1 움직임횟수 += 1 if 움직임횟수 >= 움직임최대횟수: 현재요리상태 = '후' else: 이미지움직임시간 = 0 자바독상태 = "기본자세" 자바독인덱스 = 0 자바독움직임흐름 = 1 움직임횟수 = 0
  • pg.key.get_pressed() : 키 입력의 상태들을 리스트로 반환하는 pyga me함수 입니다.
  • 요리의 기준은 Space키를 누르고 있는 것으로 하였습니다. 요리를 위한 키는 자유롭게 조정하시면 됩니다.
    • 자바독이 요리를 시작할 때는 상태를 해야할 요리로 바꾸어 줍니다.
    • 요리를 시작한 상태면 움직임 시간을 계산합니다.
    • 이미지를 바꿀 때가 되면 이미지움직임시간을 초기화하고 자바독인덱스를 바꾸어줍니다.
      • 이때 인덱스에 상태에 따라 움직임흐름이 바뀔 수 있도록 합니다.
    • 움직임흐름이 바뀌면 움직임횟수를 계산하고 움직임초대횟수까지 만족하면 요리가 완료된 것이므로 요리상태를 바꾸어줍니다.
  • Space키를 떼었을 때는 요리가 중단된 것이므로 상태를 초기화합니다.
 

3. 실행 결과

notion imagenotion image