안녕하세요! 게임 만드는 잉여 쏘코입니다.
지난 시간에는 배경 이미지까지 만들어보았는데요!!
오늘은 황금캐기게임에서 '황금' 을 담당하고 있는 보석을 만들어 볼 예정입니다.
이번 포스팅은 강의 영상의 10:58~26:16까지의 내용을 포함하고 있습니다.
목차
0. 보석 클래스
이번에는 3_gemstone.py 파일을 만들어줍니다.
(TMI : gemstone은 가공되지 않은 보석을 의미합니다!)
그리고 2_background.py의 내용을 모두 copy&paste 해줍니다.
본 강의에서는 4개의 보석(작은 금, 큰 금, 돌, 다이아몬드)만을 사용할 예정입니다.
다시 그림판을 켜서, 35*35 크기의 캔버스를 만들고 빨간 색을 안에 칠해줍시다.
그리고 small_gold.png로 저장해줍니다.
다른 이름으로 저장을 눌러 background.png와 겹치지 않게 주의하세요!!
같은 방식으로 big_gold, stone, diamond도 만들어줍니다.
160*160 크기를 가진 주황색 배경의 big_gold.png,
55*55 크기를 가진 회색 배경의 stone.png,
38*38 크기를 가진 옥색 배경의 diamond.png 파일을 만들어서 저장해줍니다.
이제 3_gemstone.py 파일로 돌아와서 보석의 이미지를 불러옵니다.
gemstone_images라는 리스트를 하나 만들어서 그 안에다가 불러왔고,
각 보석마다 사진 정보와 위치 정보가 담겨야 하는데, 매번 그 자료들을 변수처리해서 만드려고 하면 너무 많아지기 때문에 간편하게 관리하기 위해서 class를 만들어줍니다.
(아래 사진의 """으로 주석처리된 부분이 변수처리하다가 너무 많아져서 포기한 부분입니다!)
Gemstone이라는 클래스는 pygame의 Sprite를 상속받아서 만듭니다.
그 안의 생성자는 image, position이라는 두 매개변수를 받습니다.
생성자의 명령문 안에는 Sprite의 생성자를 불러오고, gemstone의 image와 rect정보(좌표와 크기정보)를 각각 self.image와 self.rect에 저장합니다.
Sprite를 사용하기 위해서는 image와 rect가 반드시 필요합니다!!
# 3_gemstone.py
# 보석 이미지 불러오기
import os # 경로를 위해 os 라이브러리 불러오기
import pygame # 파이게임 라이브러리 불러오기
# 보석 클래스
class Gemstone(pygame.sprite.Sprite): # pygame의 Sprite를 상속해와서 사용한다!!
def __init__(self, image, position): # 생성자 (사진인 image와 보석의 위치인 position을 매개변수로 받는다!)
super().__init__() # 상속받은 Sprite의 생성자를 불러온다! (상속 받았으니 뭔지는 몰라도 초기화 해준다!)
# 아래 2개의 변수는 Sprite 메소드를 사용하기 위해서 반드시 정의해야 함!!
self.image = image # 캐릭터가 가진 이미지 정보 - 매개변수로 받아온다!
self.rect = image.get_rect(center = position) # 캐릭터가 가지는 좌표, 크기 정보 - 보석마다 위치가 달라져야 하기 때문에 받아온 이미지의 중앙이 매개변수로 받은 position에 맞춰서 rect를 가져오도록 설정한다!
pygame.init() # 파이게임 초기화
# 스크린 크기 지정
screen_width = 1280
screen_height = 720
screen = pygame.display.set_mode((screen_width, screen_height)) # 이걸 통해 게임의 창 크기를 설정
pygame.display.set_caption("Gold Miner") # 게임 제목 설정 "Gold Miner"
clock = pygame.time.Clock() # 프레임값을 조정하기 위한 clock변수 설정
# 배경 이미지 불러오기
current_path = os.path.dirname(__file__) # os.path.dirname을 이용해서 현재 파일의 위치(2_background.py 위치) 반환
background = pygame.image.load(os.path.join(current_path, "background.png")) # 현재 위치의 파일이 있는 폴더의 background.png파일을 선택하게 됨!!
# 4개 보석 이미지 불러오기 (작은 금, 큰 금, 돌, 다이아몬드) - 배경을 가져오는 과정과 동일!!
gemstone_images = [
pygame.image.load(os.path.join(current_path, "small_gold.png")), # 작은 금
pygame.image.load(os.path.join(current_path, "big_gold.png")), # 큰 금
pygame.image.load(os.path.join(current_path, "stone.png")), # 돌
pygame.image.load(os.path.join(current_path, "diamond.png")) # 다이아몬드
]
"""
character = pygame.image.load(...)
character_size = character.get_rect().size
character_width = character_size[0]
character_height = character_size[1]
character_x_pos = ...character
character_y_pos = ...character.. 보석마다 매번 이런 식으로 만들면 너무 길어진다! 클래스로 관리해보자!
"""
# 게임이 반복해서 수행될 수 있도록 게임 루프를 만든다!
running = True
while running: # 게임이 진행중이라면? while문을 계속해서 반복하게 된다!
clock.tick(30) # FPS 값이 30으로 고정
for event in pygame.event.get(): # 이벤트를 받아오고
if event.type == pygame.QUIT: # 게임이 꺼지는 이벤트가 발생했다면
running = False # running 변수를 False로 바꿔준다!
screen.blit(background, (0, 0)) # 맨 왼쪽 맨 위부터 ((0,0) 좌표부터)그림을 그려주도록 만들어준다!
pygame.display.update() # 설정한 배경화면 이미지를 pygame에 반영! (display에 업데이트!!)
pygame.quit() # while문을 빠져나가면 게임이 끝나도록 설정
1. 보석 그룹핑
이제 만든 클래스를 이용해서 객체를 만들어야겠죠?
먼저 보석 그룹인 gemstone_group을 만듭니다.
sprite의 Group이라는 메소드를 이용하여 만들어줍니다. (52줄)
그 다음 setup_gemstone()이라는 함수를 이용해서 보석을 정의합니다. (53줄)
그런데 setup_gemstone() 함수는 아직 없죠? 그렇기 때문에 직접 만들어 줘야 합니다.
위에서 Gemstone이라는 클래스를 만들었는데, 이 클래스로 만든 객체는 이미지 정보(image)와 좌표와 크기 정보(rect)를 가지고 있습니다.
두 정보만 있다면 보석의 모습과 위치를 알 수 있겠죠?
테스트를 위해 임의로 객체를 만들어서 넣어주도록 하겠습니다.
setup_gemstone() 함수 안에서 아까 만든 gemstone_group 에다가 add 메소드를 이용해서 객체를 넣어줍시다. (15줄~)
add의 매개변수로는 Gemstone 객체가 들어갑니다.
Gemstone 객체는 2개의 매개변수를 받았죠? 이미지와 좌표를 받았습니다.
이미지는 아까 만든 gemstone_images 리스트의 자료를 가져오고, 좌표는 우선 임의로 만들어줍니다.
모두 만들었다면 게임이 작동하는 while문 안에 Sprite를 스크린에 그리는 코드를 작성합니다. (67줄)
sprite의 Group 메소드로 만든 객체에서 사용할 수 있는 draw 메소드를 사용합니다.
매개변수로는 screen을 받습니다. 우리가 하고 싶은 것은 gemstone_group에 있는 모든 Sprite를 screen에 그리는 것이기 때문입니다!
# 3_gemstone.py
# 보석 이미지 불러오기
import os # 경로를 위해 os 라이브러리 불러오기
import pygame # 파이게임 라이브러리 불러오기
# 보석 클래스
class Gemstone(pygame.sprite.Sprite): # pygame의 Sprite를 상속해와서 사용한다!!
def __init__(self, image, position): # 생성자 (사진인 image와 보석의 위치인 position을 매개변수로 받는다!)
super().__init__() # 상속받은 Sprite의 생성자를 불러온다! (상속 받았으니 뭔지는 몰라도 초기화 해준다!)
# 아래 2개의 변수는 Sprite 메소드를 사용하기 위해서 반드시 정의해야 함!!
self.image = image # 캐릭터가 가진 이미지 정보 - 매개변수로 받아온다!
self.rect = image.get_rect(center = position) # 캐릭터가 가지는 좌표, 크기 정보 - 보석마다 위치가 달라져야 하기 때문에 받아온 이미지의 중앙이 매개변수로 받은 position에 맞춰서 rect를 가져오도록 설정한다!
def setup_gemstone(): # 보석 클래스에서 설정한 보석의 사진과 위치 정보를 gemstone_group에 넣는 함수! 작은 금은 이해를 위해 나눠서 작성했고, 큰 금부터는 한번에 작성!
# 작은 금
small_gold = Gemstone(gemstone_images[0], (200, 380)) # 0번째 이미지를 (200, 300) 위치에 둬라
gemstone_group.add(small_gold) # 그룹에 추가
# 큰 금
gemstone_group.add(Gemstone(gemstone_images[1], (300,500)))
# 돌
gemstone_group.add(Gemstone(gemstone_images[2], (300,380)))
# 다이아몬드
gemstone_group.add(Gemstone(gemstone_images[3], (900,420)))
pygame.init() # 파이게임 초기화
# 스크린 크기 지정
screen_width = 1280
screen_height = 720
screen = pygame.display.set_mode((screen_width, screen_height)) # 이걸 통해 게임의 창 크기를 설정
pygame.display.set_caption("Gold Miner") # 게임 제목 설정 "Gold Miner"
clock = pygame.time.Clock() # 프레임값을 조정하기 위한 clock변수 설정
# 배경 이미지 불러오기
current_path = os.path.dirname(__file__) # os.path.dirname을 이용해서 현재 파일의 위치(2_background.py 위치) 반환
background = pygame.image.load(os.path.join(current_path, "background.png")) # 현재 위치의 파일이 있는 폴더의 background.png파일을 선택하게 됨!!
# 4개 보석 이미지 불러오기 (작은 금, 큰 금, 돌, 다이아몬드) - 배경을 가져오는 과정과 동일!!
gemstone_images = [
pygame.image.load(os.path.join(current_path, "small_gold.png")), # 작은 금
pygame.image.load(os.path.join(current_path, "big_gold.png")), # 큰 금
pygame.image.load(os.path.join(current_path, "stone.png")), # 돌
pygame.image.load(os.path.join(current_path, "diamond.png")) # 다이아몬드
]
# 보석 그룹
gemstone_group = pygame.sprite.Group() # 젬스톤 그룹 생성
setup_gemstone() # 게임에 원하는 만큼의 보석을 정의
# 게임이 반복해서 수행될 수 있도록 게임 루프를 만든다!
running = True
while running: # 게임이 진행중이라면? while문을 계속해서 반복하게 된다!
clock.tick(30) # FPS 값이 30으로 고정
for event in pygame.event.get(): # 이벤트를 받아오고
if event.type == pygame.QUIT: # 게임이 꺼지는 이벤트가 발생했다면
running = False # running 변수를 False로 바꿔준다!
screen.blit(background, (0, 0)) # 맨 왼쪽 맨 위부터 ((0,0) 좌표부터)그림을 그려주도록 만들어준다!
gemstone_group.draw(screen) # gemstone_group에 있는 모든 Sprite를 screen에다가 그려라!
pygame.display.update() # 설정한 배경화면 이미지를 pygame에 반영! (display에 업데이트!!)
pygame.quit() # while문을 빠져나가면 게임이 끝나도록 설정
이제 실행해보면, 원하는 좌표에 내가 그림판에 그렸던 네모들이 출력되는 것을 볼 수 있습니다.
각 위치에 작은 금, 큰 금, 돌, 다이아몬드가 들어가면 되겠죠?
보석을 게임 화면에 띄우는 것은 생각보다 어렵지 않았습니다 :)
파이썬의 클래스를 어느 정도 이해하고 있으신 분이라면 여기까지는 충분히 무리 없이 따라올 수 있으셨을 것이라 생각합니다! (제가 그랬거든요 ㅎㅎ)
다음 포스팅부터는 이제 이놈의 보석들을 가져오는 "집게"를 만들어보도록 하겠습니다.
아마 한 편의 포스팅으로는 안될 것 같습니다만..
그렇다면 다음 포스팅에서 뵙겠습니다!
오늘도 좋은 하루 되세요 :)
최근댓글