🐸

004 돌맹이 생성 및 이동 구현

1. 실행 코드

import pygame as pg import random # 이미지 초기화 def 스프라이트_생성(이미지): 스프라이트 = pg.sprite.Sprite() 스프라이트.image = 이미지 스프라이트.rect = 스프라이트.image.get_rect() return 스프라이트 pg.init() # 게임 기본 설정 실행여부 = 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)) # 게임 요소 초기화 개리시작높이 = 255 개리뛰기상태 = 0 개리뛰는흐름 = 1 개리동작업데이트시간 = 0 점프기본속도 = 0.1 점프속도 = 점프기본속도 점프상태 = False 개리위치 = [70, 개리시작높이] 요소들속도 = 300 돌멩이생성시간 = 1 돌멩이시작높이 = 280 돌멩이위치리스트 = [[500, 돌멩이시작높이]] 돌멩이스프라이트리스트 = [스프라이트_생성(돌이미지) for _ in 돌멩이위치리스트] 시계 = pg.time.Clock() while 실행여부: 화면.blit(배경이미지, (0, 0)) # 게임 시간 계산 경과시간 = 시계.tick(60) / 1000 개리스프라이트.rect.x, 개리스프라이트.rect.y = 개리위치[0], 개리위치[1] 화면.blit(개리스프라이트.image, 개리스프라이트.rect) for 돌멩이위치, 돌멩이스프라이트 in zip(돌멩이위치리스트, 돌멩이스프라이트리스트): 돌멩이스프라이트.rect.x, 돌멩이스프라이트.rect.y = 돌멩이위치[0], 돌멩이위치[1] 화면.blit(돌멩이스프라이트.image, 돌멩이스프라이트.rect) 돌멩이위치[0] -= 요소들속도 * 경과시간 if 돌멩이위치[0] < -100: 돌멩이스프라이트리스트.remove(돌멩이스프라이트) 돌멩이위치리스트.remove(돌멩이위치) # 개리 점프 if 점프상태: 개리스프라이트.image = 점프속도 > 0 and 개리점프이미지 or 개리착지이미지 개리위치[1] -= 점프속도 * 경과시간 * 1000 점프속도 -= 점프기본속도 * 경과시간 * 2 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 이벤트.key == pg.K_SPACE and not 점프상태: 점프상태 = True pg.display.update() pg.display.quit()
 

2. 상세 설명

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

  1. 돌멩이의 시작위치를 하나의 리스트에 옮겨 닮고 이 리스트를 for문을 통하여 그려줍니다.
  1. 그려주는 for문에서 위치를 움직입니다.
  1. 화면을 나간 포탈과 돌멩이에 대해 객체를 삭제합니다.
  1. 포탈 자동 생성 - 시간에 따라 랜덤으로 생성합니다.

2-2. 구현

import random
  • 돌멩이 생성 시간을 랜덤으로 주기위한 모듈을 추가합니다.
 
요소들속도 = 300 돌멩이생성시간 = 1 돌멩이시작높이 = 280 돌멩이위치리스트 = [[500, 돌멩이시작높이]] 돌멩이스프라이트리스트 = [스프라이트_생성(돌이미지) for _ in 돌멩이위치리스트]
  • 요소들속도 : 게임의 요소들(개리_동족, 포탈, 돌멩이들)의 이동 속도를 나타냅니다.
  • 돌멩이생성시간 : 돌멩이가 자동으로 생성되는 시간을 나타내는 변수입니다.
  • 돌멩이위치리스트 : 돌멩이들이 있는 위치 리스트입니다.
  • 돌멩이스프라이트리스트 : 돌멩이위치리스트를 기준으로 돌멩이를 그려주기 위한 스프라이트리스트입니다.(리스트 컴프리헨션 사용)
 
for 돌멩이위치, 돌멩이스프라이트 in zip(돌멩이위치리스트, 돌멩이스프라이트리스트): 돌멩이스프라이트.rect.x, 돌멩이스프라이트.rect.y = 돌멩이위치[0], 돌멩이위치[1] 화면.blit(돌멩이스프라이트.image, 돌멩이스프라이트.rect) 돌멩이위치[0] -= 요소들속도 * 경과시간 if 돌멩이위치[0] < -100: 돌멩이스프라이트리스트.remove(돌멩이스프라이트) 돌멩이위치리스트.remove(돌멩이위치)
  • zip함수를 통해 두 개의 리스트를 같이 순회하면서 돌멩이를 그린 후 돌멩이 위치를 업데이트 합니다.
  • 돌멩이가 일정 위치(-100)를 넘어서면 화면을 벗어나서 더 이상 필요가 없으므로 두 개의 리스트에서 remove함수를 통해 제거합니다.
 
돌멩이생성시간 -= 경과시간 if 돌멩이생성시간 <= 0: 돌멩이스프라이트리스트.append(스프라이트_생성(돌이미지)) 돌멩이위치리스트.append([900, 돌멩이시작높이]) 돌멩이생성시간 = random.random() * 2 + 1
  • 돌멩이생성시간을 업데이트 하고 시간이 되었으면 돌이미지를 기준으로 특정 위치에 돌멩이를 생성합니다.
  • 생성 후에는 랜덤으로 돌멩이생성시간을 조정합니다.(지금은 1초에서 3초 사이)
    • 💡
      random.randint()를 사용하지 않는 이유는 정수로만 돌맹이의 생성시간을 지정하면 일정한 간격의 시간으로 돌맹이가 생성되기 떄문에인해 다양한 변화를 줄 수 없게 됩니다.

3. 실행 화면

notion imagenotion image