스푸79 기록 보관소

운석 피하기 게임 개발(18) - 메뉴 본문

게임공작소

운석 피하기 게임 개발(18) - 메뉴

스푸79 2024. 11. 3. 12:00

게임 플레이 상으로는 대부분의 코드 완성한 상태이다.

하지만 외적인 면에서 보완할 부분이 사실 많다.

우선 게임은 한번 할게 아니라면 플레이가 죽은 이후에 재도전할지 플레이어가 선택할 수 있어야한다.

 

종료된 게임을 다시 시작하게 하려면 게임의 상태를 관리 해야한다.

    TITLE = 0    #게임 시작 전 메뉴화면
    PLAYING = 1  #게임 시작
    ...
    TRYAGAIN = 4 #게임 종료 후 대기
    QUIT = 5     #프로그램 종료

 

우선 상태값을 위와 같이 정의하고, PLAYING(게임 진행) 와 TRYAGAIN(게임 종료 후 대기)를 구분한다.

    def try_again_process(self):
        if not(self.player.islive):
            if self.ANSWER_INDEX == 0:
                self.running_menu = True
                self.GAME_STATE = env.TRYAGAIN
                self.state()
            
            elif self.ANSWER_INDEX == 1:
                self.running = False
                self.running_menu = True
                self.GAME_STATE = env.TITLE
                self.state()

 

ANSWER_INDEX = 0 인 경우는 YES를, ANSWER_INDEX = 1인 경우는 NO 로 정의한다.

이때 YES를 선택한 경우 게임 상태를 TRYAGAIN으로 변경하고, NO를 선택하는 경우 메인화면으로 넘어가도록 했다.

 

메인화면을 만들어보자. 타이틀과 메뉴를 아래와 같이 넣고

키보드 입력에 따라 텍스트가 노란색으로 강조 되도록 처리했다.

    def show_title(self):
        title_text = env.GAME_TITLE
        self.print_text(title_text, 400, 150, "LARGE", env.WHITE, env.CENTER, True)
        self.show_menu()
                
    def show_menu(self):
        menu_text = ["Game Start", "Upgrade", "Setting", "Exit"]        
        margin = 65
        text_color = env.WHITE
        for i in range(len(menu_text)):
            if self.MENU_INDEX == i:
                text_color = env.YELLOW
            else:
                text_color = env.WHITE
                                
            self.print_text(menu_text[i], 400, 500 + (margin * i), \
                            "MIDDLE2", text_color, env.CENTER, True)

 

 

TRYAGAIN 상태에서 YES를 선택한 경우는 위의 화면에서 Game Start를 선택하는 경우와 동일하다.

 

게임 상태값을 관리하는 state라는 메서드를 아래와 같이 작성한다.

    def state(self):
        if self.GAME_STATE == env.TITLE:
            self.title()
        elif self.GAME_STATE == env.PLAYING:
            self.init()
            self.play()
        elif self.GAME_STATE == env.SETTING:            
            ...
        elif self.GAME_STATE == env.UPGRADE:
            ...
        elif self.GAME_STATE == env.TRYAGAIN:
            #TRY AGAIN 메시지 처리, PLAYING 상태로 변경 후 다시 시작하도록 처리한다.
            self.GAME_STATE = env.PLAYING
            self.init()
            self.play()        
        elif self.GAME_STATE == env.QUIT:
            pygame.quit()
            sys.exit(0)

 

운석 피하기 게임은 앞으로 state라는 함수로 모든 상태를 관리하게 된다. 기존 시작 코드를 비교해보자.

기존 Main 시작코드

if __name__ == "__main__":    
    gameMain = Main()
    gameMain.play()

 

변경한 Main 시작코드

if __name__ == "__main__":    
    gameMain = Main()
    gameMain.state()

 

state 메서드에서 게임 시작이나 재도전을 하는 경우에 play메서드를 호출하도록 수정했다.

이로써 플레이어가 에너지가 떨어져서 죽더라도 바로 다시 도전할 수 있도록 변경했다.

하지만 이것이 끝이 아니다.

위의 추가된 메뉴를 보면 알겠지만 Setting과 Upgrade가 추가된 것을 확인할 수 있을 것이다.

Setting에서는 사운드와 효과음은 켜고 끄는(ON/OFF) 기능을 넣을 생각이다.

Upgrade에서는 게임 플레이 중에서 모은 보석을 이용해서 플레이어의 능력치를 향상시키는 코드를 넣을 계획이다.

이번에 끝난 줄 알았는데 한방 더 남았다.

소스 코드를 추가한다.

main.py를 보면 깜짝 놀랄 것이다. 메뉴를 추가하다 보니 코드가 지저분해졌다.

player, meteor 클래스를 참고하여

한번 분리해 보는 것도 도움이 될 것이다.

클래스나 메서드가 너무 길어지는 건 좋지 않다.

16. menu.zip
4.83MB