🐸

007 텍스트 및 재시작 기능 추가, 겹침 버그 수정, 함수화 추가

1. 실행 코드

import pygame as pg import random # 이미지 초기화 def 스프라이트_생성(이미지): 스프라이트 = pg.sprite.Sprite() 스프라이트.image = 이미지 스프라이트.rect = 스프라이트.image.get_rect() return 스프라이트 # 게임 요소 초기화 def 게임요소초기화(): global 게임시간, 게임여부, 개리시작높이, 점수 global 개리뛰기상태, 개리뛰는흐름, 개리동작업데이트시간, 점프기본속도, 점프속도, 점프상태, 개리위치 global 요소들속도, 돌멩이생성시간, 돌멩이시작높이, 돌멩이위치리스트, 돌멩이스프라이트리스트 global 개리동료구출상태, 개리동료최초위치, 개리동료위치 global 포탈최초위치, 포탈위치 게임시간 = 0 게임여부 = True 개리시작높이 = 255 점수 = 0 개리뛰기상태 = 0 개리뛰는흐름 = 1 개리동작업데이트시간 = 0 점프기본속도 = 0.1 점프속도 = 점프기본속도 점프상태 = False 개리위치 = [70, 개리시작높이] 요소들속도 = 300 돌멩이생성시간 = 1 돌멩이시작높이 = 280 돌멩이위치리스트 = [[500, 돌멩이시작높이]] 돌멩이스프라이트리스트 = [스프라이트_생성(돌이미지) for _ in 돌멩이위치리스트] 개리동료구출상태 = False 개리동료최초위치 = 900 개리동료위치 = [개리동료최초위치, 개리시작높이] 포탈최초위치 = 900 포탈위치 = [포탈최초위치, 개리시작높이] pg.init() # 색깔 설정 흰색 = (255, 255, 255) 검은색 = (0, 0, 0) # 글꼴 설정 글꼴 = pg.font.SysFont("hy얕은샘물m", 30) # 게임 기본 설정 실행여부 = True 화면가로길이, 화면세로길이 = 800, 450 화면 = pg.display.set_mode([화면가로길이, 화면세로길이]) pg.display.set_caption('동족을 노역장에서 구출하라!') 배경이미지 = pg.image.load('img/배경.png') 배경이미지 = pg.transform.scale(배경이미지, (화면가로길이, 화면세로길이)) 개리점프이미지 = pg.image.load('img/개리-뛰는-모습5(점프).png') 개리점프이미지 = pg.transform.scale(개리점프이미지, (100, 100)) 개리착지이미지 = pg.image.load('img/개리-뛰는-모습6(착지).png') 개리착지이미지 = pg.transform.scale(개리착지이미지, (100, 100)) 개리뛰기이미지리스트 = [pg.image.load(f'img/개리-뛰는-모습{인덱스}.png') for 인덱스 in range(1, 5)] for 인덱스 in range(len(개리뛰기이미지리스트)): 개리뛰기이미지리스트[인덱스] = pg.transform.scale(개리뛰기이미지리스트[인덱스], (100, 100)) 개리스프라이트 = 스프라이트_생성(개리뛰기이미지리스트[0]) 돌이미지 = pg.image.load('img/돌.png') 돌이미지 = pg.transform.scale(돌이미지, (100, 100)) 개리동료이미지 = pg.image.load('img/동료_구출-전.png') 개리동료이미지 = pg.transform.scale(개리동료이미지, (100, 100)) 개리동료구출이미지 = pg.image.load('img/동료_구출-후.png') 개리동료구출이미지 = pg.transform.scale(개리동료구출이미지, (100, 100)) 개리동료스프라이트 = 스프라이트_생성(개리동료이미지) 포탈이미지 = pg.image.load('img/포탈.png') 포탈이미지 = pg.transform.scale(포탈이미지, (100, 100)) 포탈스프라이트 = 스프라이트_생성(포탈이미지) 재시작버튼이미지 = pg.image.load('img/다시하기-버튼.png') 재시작버튼이미지 = pg.transform.scale(재시작버튼이미지, (170, 170)) 게임요소초기화() 시계 = pg.time.Clock() while 실행여부: if 게임여부: 화면.blit(배경이미지, (0, 0)) # 게임 시간 계산 경과시간 = 시계.tick(60) / 1000 게임시간 += 경과시간 게임시작시간글자 = 글꼴.render("%02d:%05.2f" % (게임시간 / 60, 게임시간 % 60), True, 검은색) 화면.blit(게임시작시간글자, (10, 10)) 점수문자열 = str(점수) 점수글자 = 글꼴.render("구출한 동족 수 : " + 점수문자열, True, 검은색) 화면.blit(점수글자, (600, 10)) 재시작버튼 = 화면.blit(재시작버튼이미지, (660, 300)) 개리스프라이트.rect.x, 개리스프라이트.rect.y = 개리위치[0], 개리위치[1] 화면.blit(개리스프라이트.image, 개리스프라이트.rect) # 개리 동족 및 포탈 그리기, 개리 동족 구출하기 개리동료스프라이트.rect.x, 개리동료스프라이트.rect.y = 개리동료위치[0], 개리동료위치[1] 화면.blit(개리동료스프라이트.image, 개리동료스프라이트.rect) 포탈스프라이트.rect.x, 포탈스프라이트.rect.y = 포탈위치[0], 포탈위치[1] 화면.blit(포탈스프라이트.image, 포탈스프라이트.rect) if not 개리동료구출상태: 개리동료스프라이트.image = 개리동료이미지 if pg.sprite.collide_mask(개리스프라이트, 개리동료스프라이트): 개리동료구출상태 = True 개리동료위치[0] = 15 개리동료위치[1] = 개리위치[1] 개리동료위치[0] -= 요소들속도 * 경과시간 if 개리동료위치[0] < -50: 개리동료위치[0] = 개리동료최초위치 else: 개리동료스프라이트.image = 개리동료구출이미지 if pg.sprite.collide_mask(개리동료스프라이트, 포탈스프라이트): 개리동료위치[0] = 개리동료최초위치 개리동료위치[1] = 개리시작높이 점수 += 1 포탈위치[0] = 포탈최초위치 개리동료구출상태 = False print(f"점수 = {점수}") # 점수 확인용 포탈위치[0] -= 요소들속도 * 경과시간 if 포탈위치[0] < -50: 포탈위치[0] = 포탈최초위치 for 돌멩이위치, 돌멩이스프라이트 in zip(돌멩이위치리스트, 돌멩이스프라이트리스트): 돌멩이스프라이트.rect.x, 돌멩이스프라이트.rect.y = 돌멩이위치[0], 돌멩이위치[1] 화면.blit(돌멩이스프라이트.image, 돌멩이스프라이트.rect) if pg.sprite.collide_mask(개리스프라이트, 돌멩이스프라이트) != None: 게임여부 = False if (개리동료위치[0] > 15 and pg.sprite.collide_mask(돌멩이스프라이트, 개리동료스프라이트)) or pg.sprite.collide_mask(돌멩이스프라이트, 포탈스프라이트): 돌멩이위치[0] -= random.random() * 100 + 100 돌멩이위치[0] -= 요소들속도 * 경과시간 if 돌멩이위치[0] < -100: 돌멩이스프라이트리스트.remove(돌멩이스프라이트) 돌멩이위치리스트.remove(돌멩이위치) # 개리 점프 if 점프상태: 개리스프라이트.image = 점프속도 > 0 and 개리점프이미지 or 개리착지이미지 개리위치[1] -= 점프속도 * 경과시간 * 1000 점프속도 -= 점프기본속도 * 경과시간 * 2 if 개리동료구출상태: 개리동료위치[1] = 개리위치[1] if 개리위치[1] >= 개리시작높이: 개리위치[1] = 개리시작높이 점프상태 = False 점프속도 = 점프기본속도 else: 개리동작업데이트시간 += 경과시간 if 개리동작업데이트시간 > 0.2: 개리동작업데이트시간 = 0 개리스프라이트.image = 개리뛰기이미지리스트[개리뛰기상태] 개리뛰기상태 += 개리뛰는흐름 if 개리뛰기상태 == len(개리뛰기이미지리스트) - 1 or 개리뛰기상태 == 0: 개리뛰는흐름 *= -1 돌멩이생성시간 -= 경과시간 if 돌멩이생성시간 <= 0: 돌멩이스프라이트리스트.append(스프라이트_생성(돌이미지)) 돌멩이위치리스트.append([900, 돌멩이시작높이]) 돌멩이생성시간 = random.random() * 2 + 1 for 이벤트 in pg.event.get(): if 이벤트.type == pg.QUIT: 실행여부 = False elif 이벤트.type == pg.KEYDOWN: if 게임여부 and 이벤트.key == pg.K_SPACE and not 점프상태: 점프상태 = True elif 이벤트.type == pg.MOUSEBUTTONDOWN: 클릭위치 = pg.mouse.get_pos() if 재시작버튼.collidepoint(클릭위치): 게임요소초기화() pg.display.update() pg.display.quit()
 

2. 상세 설명

2-1. 구현 방식(정리)

  1. 게임요소들을 추가하는 코드를 함수화합니다.
  1. 글자를 표시하기 위한 글꼴 객체와 색깔 변수를 만들고 재시작 버튼 이미지를 로드하고 그려줍니다.
  1. 개리동료와 포탈과 돌멩이가 겹칠 경우 돌멩이 위치를 재조정하도록 구현합니다.
  1. 재시작 버튼의 클릭을 감지하고 게임요소초기화 함수를 사용합니다.

2-2. 구현

흰색 = (255, 255, 255) 검은색 = (0, 0, 0) 글꼴 = pg.font.SysFont("hy얕은샘물m", 30)
  • RGB값에 따라서 검은색과 흰색을 튜플로 구성하였습니다.
  • 글꼴 : 화면에 보여지는 글자들의 Font 객체입니다.
    • 글꼴에 경우 pygame.font.get_fonts()로 확인할 수 있습니다.
    • 글꼴이 없는 경우 한글은 표시되지 않을 수 있습니다.
 
재시작버튼이미지 = pg.image.load('img/다시하기-버튼.png') 재시작버튼이미지 = pg.transform.scale(재시작버튼이미지, (170, 170))
  • 재시작버튼을 로드합니다.
 
def 게임요소초기화(): global 게임시간, 게임여부, 개리시작높이, 점수 global 개리뛰는상태, 개리뛰는흐름, 개리동작업데이트시간, 점프기본속도, 점프속도, 점프상태, 개리위치 global 요소들속도, 돌멩이생성시간, 돌멩이시작높이, 돌멩이위치리스트, 돌멩이스프라이트리스트 global 개리동료구출상태, 개리동료최초위치, 개리동료위치 global 포탈최초위치, 포탈위치 게임시간 = 0 게임여부 = True 개리시작높이 = 255 점수 = 0 개리뛰는상태 = 0 개리뛰는흐름 = 1 개리동작업데이트시간 = 0 점프기본속도 = 0.1 점프속도 = 점프기본속도 점프상태 = False 개리위치 = [70, 개리시작높이] 요소들속도 = 300 돌멩이생성시간 = 1 돌멩이시작높이 = 280 돌멩이위치리스트 = [[500, 돌멩이시작높이]] 돌멩이스프라이트리스트 = [스프라이트_생성(돌이미지) for _ in 돌멩이위치리스트] 개리동료구출상태 = False 개리동료최초위치 = 2400 개리동료위치 = [개리동료최초위치, 개리시작높이] 포탈최초위치 = 1200 포탈위치 = [포탈최초위치, 개리시작높이]
  • 게임요소를 초기화하는 부분을 함수화합니다.(재시작 버튼 클릭 이벤트를 위해서 입니다.)
  • 게임시간 : 게임을 하는 시간을 보여주기 위한 변수입니다.(재시작시 초기화됩니다.)
 
게임시간 += 경과시간 게임시작시간글자 = 글꼴.render("%02d:%05.2f" % (게임시간 / 60, 게임시간 % 60), True, 검은색) 화면.blit(게임시작시간글자, (10, 10)) 점수문자열 = str(점수) 점수글자 = 글꼴.render("구출한 동족 수 : " + 점수문자열, True, 검은색) 화면.blit(점수글자, (600, 10)) 재시작버튼 = 화면.blit(재시작버튼이미지, (660, 300))
  • 게임시작시간글자 : 시간을 분과 초로 구분하여 렌더링합니다.(f문자열 사용할 경우 자릿수제한이 어려워 % 연산자를 사용하였습니다.)
 
if (개리동료위치[0] > 15 and pg.sprite.collide_mask(돌멩이스프라이트, 개리동료스프라이트)) or pg.sprite.collide_mask(돌멩이스프라이트, 포탈스프라이트): 돌멩이위치[0] -= random.random() * 100 + 100
  • 개리동료나 포탈과 위치가 겹칠 때 돌멩이 위치를 조정합니다. 단, 개리동료가 구출된 상태에서는 개리동료와 돌멩이 충돌 체크는 하지 않습니다.
 
elif 이벤트.type == pg.MOUSEBUTTONDOWN: 클릭위치 = pg.mouse.get_pos() if 재시작버튼.collidepoint(클릭위치): 게임요소초기화()
  • Surface.collidepoint(위치)를 이용하여 재시작버튼 클릭을 감지하고 위에 만들어둔 초기화 요소로 게임을 재시작합니다.

3. 실행 화면

notion imagenotion image