안녕하세요! 게임 만드는 잉여 쏘코입니다.

 

지난 시간에는 배경 이미지까지 만들어보았는데요!!

 

지난 시간까지 작업 내용 - 화면에 배경화면 띄우기!

 

오늘은 황금캐기게임에서 '황금' 을 담당하고 있는 보석을 만들어 볼 예정입니다.

 

보석이 화면에 나타났다?!!

 

이번 포스팅은 강의 영상의 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문을 빠져나가면 게임이 끝나도록 설정

     

    이제 실행해보면, 원하는 좌표에 내가 그림판에 그렸던 네모들이 출력되는 것을 볼 수 있습니다.

    각 위치에 작은 금, 큰 금, 돌, 다이아몬드가 들어가면 되겠죠?

    보석을 게임 화면에 띄우는 것은 생각보다 어렵지 않았습니다 :)


    파이썬의 클래스를 어느 정도 이해하고 있으신 분이라면 여기까지는 충분히 무리 없이 따라올 수 있으셨을 것이라 생각합니다! (제가 그랬거든요 ㅎㅎ)

     

    다음 포스팅부터는 이제 이놈의 보석들을 가져오는 "집게"를 만들어보도록 하겠습니다.

    아마 한 편의 포스팅으로는 안될 것 같습니다만..

     

    그렇다면 다음 포스팅에서 뵙겠습니다!

    오늘도 좋은 하루 되세요 :)

    반응형
    • 네이버 블로그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기