🍳

003 요리 움직이기 및 초기화

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. 실행 결과

notion imagenotion image