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
자바독요리가능여부 = True
현재요리 = "사료"
현재요리상태 = "전"
요리움직임여부 = False
이미지마우스위치 = [0, 0]
요리초기위치 = [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 = 요리이미지딕셔너리[현재요리상태][현재요리]
if 자바독요리가능여부:
요리위치 = [요리초기위치[0] - 요리스프라이트.image.get_width() // 2,
요리초기위치[1] - 요리스프라이트.image.get_height() // 2
]
요리스프라이트.rect.x, 요리스프라이트.rect.y = 요리위치[0], 요리위치[1]
진행중인요리 = 화면.blit(요리스프라이트.image, 요리스프라이트.rect)
if 요리움직임여부:
마우스위치 = pg.mouse.get_pos()
요리위치 = [마우스위치[0] + 이미지마우스위치[0], 마우스위치[1] + 이미지마우스위치[1]]
else:
화면.fill(흰색)
pg.display.update()
for 이벤트 in pg.event.get():
if 이벤트.type == pg.QUIT:
실행여부 = False
elif 이벤트.type == pg.MOUSEBUTTONDOWN:
클릭위치 = pg.mouse.get_pos()
if 진행중인요리.collidepoint(클릭위치):
요리움직임여부 = True
자바독요리가능여부 = False
이미지마우스위치 = [요리위치[0] - 클릭위치[0], 요리위치[1] - 클릭위치[1]]
for 요리 in 요리리스트:
if 요청요리리스트[요리].collidepoint(클릭위치):
현재요리 = 요리
현재요리상태 = '전'
자바독요리가능여부 = True
elif 이벤트.type == pg.MOUSEBUTTONUP:
요리움직임여부 = False
keys = pg.key.get_pressed()
# print(keys)
if keys[pg.K_SPACE] and 자바독요리가능여부:
if 자바독상태 == "기본자세":
자바독상태 = 현재요리
else:
이미지움직임시간 += 흐른시간
if 이미지움직임시간 >= 이미지움직임최대시간:
이미지움직임시간 = 0
자바독인덱스 += 자바독움직임흐름
if 자바독인덱스 == 0 or 자바독인덱스 == len(자바독이미지딕셔너리[자바독상태]) - 1:
자바독움직임흐름 *= -1
움직임횟수 += 1
if 움직임횟수 >= 움직임최대횟수:
현재요리상태 = '후'
else:
이미지움직임시간 = 0
자바독상태 = "기본자세"
자바독인덱스 = 0
자바독움직임흐름 = 1
움직임횟수 = 0
pg.display.quit()
2. 상세 내용
자바독요리가능여부 = True
요리움직임여부 = False
이미지마우스위치 = [0, 0]
- 자바독요리가능여부 : 자바독이 요리를 할 수 있는 상태인지 확인하는 변수입니다. 개념적으로 그릇이 정 위치에 있어야 요리를 할 수 있도록 하기 위해서 필요합니다.
- 요리움직임여부 : 나중에는 손님들에게 요리를 갖다주게 되는데 요리를 갖다주는 방식으로 드래그앤드롭을 사용하게 되는데 이를 위해서 사용되는 변수입니다.
- 이미지마우스위치 : 요리이미지를 드래그앤드롭 기능을 사용하게 될 때 요리이미지 내의 마우스 위치를 저장하는 변수입니다.
요청요리리스트 = {}
for 인덱스, 요리 in enumerate(요리리스트):
요청요리리스트[요리] = 화면.blit(요리이미지딕셔너리['후'][요리], (460 + 90 * 인덱스, 280 - 요리이미지딕셔너리["후"][요리].get_height()))
- 요청요리리스트 : 손님에게 제공할 요리 옆에 있는 제공할 수 있는 이미지들을 클릭하여 임의로 초기화하는 기능을 위해서 사용됩니다.
if 자바독요리가능여부:
요리위치 = [요리초기위치[0] - 요리스프라이트.image.get_width() // 2,
요리초기위치[1] - 요리스프라이트.image.get_height() // 2
]
- 요리를 초기화하게 되면 요리에 따라 그 크기가 달라질 수 있습니다. 그러면 위치를 그대로 둘 경우 가운데 있지 않은 것처럼 보이게 되는데 이를 보정하기 위해서 위치를 재조정해줍니다.
진행중인요리 = 화면.blit(요리스프라이트.image, 요리스프라이트.rect)
- 손님에게 제공되는 요리를 드래그앤 드롭하게 위해서 그려놓은 객체를 변수로 받아옵니다.
if 요리움직임여부:
마우스위치 = pg.mouse.get_pos()
요리위치 = [마우스위치[0] + 이미지마우스위치[0], 마우스위치[1] + 이미지마우스위치[1]]
- 이미지를 움직일 준비가 되었으면 마우스위치로 이미지를 옮기는데 처음 이미지를 클릭했을 때에 나오는 이미지 내 마우스위치와 함께 보정하여 이동시킵니다.
elif 이벤트.type == pg.MOUSEBUTTONDOWN:
클릭위치 = pg.mouse.get_pos()
if 진행중인요리.collidepoint(클릭위치):
요리움직임여부 = True
자바독요리가능여부 = False
이미지마우스위치 = [요리위치[0] - 클릭위치[0], 요리위치[1] - 클릭위치[1]]
for 요리 in 요리리스트:
if 요청요리리스트[요리].collidepoint(클릭위치):
현재요리 = 요리
현재요리상태 = '전'
자바독요리가능여부 = True
elif 이벤트.type == pg.MOUSEBUTTONUP:
요리움직임여부 = False
#.. 중략 ..
if keys[pg.K_SPACE] and 자바독요리가능여부:
- 진행중인요리를 클릭했을 경우 요리를 움직일 수 있도록 합니다. 이때 요리가 움직여서 요리가 불가능한 상태가 되어야 하므로 자바독요리가능여부도 바꿔줍니다. 그리고 이미지가 올바르게 움직이게 하기위해서 이미지내 마우스위치를 계산하여 저장합니다.
- 초기화하기 위한 요리를 클릭했을 경우에는 현재요리를 바꾼 뒤 요리상태와 요리가능여부를 초기화합니다.
- 마우스를 떼면 요리 이동이 완료된 것이므로 요리움직임여부를 False로 만들어 요리가 움직이지 못하게 합니다.
- 원래 Space 확인만 했던 부분에 자바독요리가능여부를 추가합니다. 그 이유는 그릇이 이동되어 자바독이 요리가능여부 False가 되었을 때 요리를 하지못하도록 하기 위함입니다.
3. 실행 결과