스푸79 기록 보관소

운석 피하기 게임 개발(4)- 전역변수 설정 본문

게임개발

운석 피하기 게임 개발(4)- 전역변수 설정

스푸79 2024. 8. 23. 08:00

지난 포스트에서 작성한 코드 중 상수로 선언된 부분이 보인다.

지금 하는 건 간단한 게임 개발이기 때문에 사실 그대로 둬도 큰 문제는 없다.

하지만 실제 업무에서는 이렇게 사용하면 추후 유지보수에 문제가 발생할 여지가 많다.

 

예를 들어 화면 사이즈를 고객의 요청에 의해 800 x 800 이 아니라 1000 x 1000을 변경한다고 가정하면

화면 사이즈를 바탕으로 코딩한 부분들을 모두 찾아서 일일히 수정해야하는 문제가 발생한다.

 

가급적이면 이런 부분을 방지하기 위해 상수 선언하는 부분을 별도로 만들어서

해당 부분이 수정되면 전체에 적용되도록 처리하는 것이 좋은 방법이다.

 

기존 코드에 enviroment.py 를 새로 추가하고 아래와 같이 코드를 작성했다.

import os

class Enviroment:
    GAME_TITLE = "Meteor Dodger"
    GAME_DIR = os.path.dirname(os.path.abspath(__file__))
    GAME_IMG_DIR = GAME_DIR + "/img/"
    WIDTH = 800
    HEIGHT = 800
    FPS = 60

    START_POS_X = 400
    START_POS_Y = 400

    BLACK = (0, 0, 0)
    WHITE = (255, 255, 255)

 

게임 타이틀부터 기본 경로, 이미지 경로, 화면의 폭과 넓이를 전역변수로 선언하도록 처리했다.

 

이에 맞춰서 main.py 는 아래와 같이 변경했다.

import pygame 
from enviroment import Enviroment as env #enviroment.py 불러오고 alias를 env로 설정
#import os, sys는 더이상 불필요해서 삭제
from player import Player

class Main():
    def __init__(self):        
        self.screen = pygame.display.set_mode((env.WIDTH, env.HEIGHT))
        self.clock = pygame.time.Clock()
        self.running = True 

        pygame.display.set_caption(env.GAME_TITLE) # 게임 타이틀 설정
        icon = pygame.image.load(env.GAME_DIR + "/meteor_dodger.ico") #게임 경로 설정
        pygame.display.set_icon(icon)

        self.player_sprites = pygame.sprite.Group()
        self.player = Player(env.START_POS_X, env.START_POS_Y) #캐릭터의 시작 위치 X,Y 좌표 설정
        self.player_sprites.add(self.player)

    def play(self):
        while self.running:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.running = False 
                    # 게임 종료 처리 후 처리를 main에서 처리하기 위해 
                    # while을 벗어나도록 처리함

            keys = pygame.key.get_pressed()
            self.player_sprites.update(keys)

            self.screen.fill(env.BLACK) #색상도 상수로 설정해서 처리
            self.player_sprites.draw(self.screen)

            pygame.display.flip()
            self.clock.tick(env.FPS) #프레임설정도 상수로 처리

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

 

enviorment.py 에 선언된 변수값을 env로 불러와서 숫자로 하드코딩 된 부분을 위와 같이 수정해 보았다.

그거 외에 수정한 부분이 하나 더 있는데

self.running 이라는 Main 클래스의 멤버변수를 하나 더 추가했다.

기존 코드의 while 문은 항상 True로 설정되어 있었는데

이 부분을 self.running으로 변경하고

화면이 종료되는 event가 발생했을때 self.running 값을 False로 변경하여 while에서 벗어나도록 처리했다.

 

개발이 더 진행되면 대기 상태과 게임 플레이상태가 나눠줘야하기 때문에 미리 이렇게 처리를 했다.

 

import pygame
from enviroment import Enviroment as env

class Player(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.image.load(env.GAME_IMG_DIR + "player.png")
        self.rect = self.image.get_rect()
        self.rect.center = (x, y)          # 정중앙에 위치하려면 self.rect.center 값으로 설정해야함
        self.speed = 3                     # 이동 속도 설정

    def update(self, keys):
        # 화면 밖으로 메인 캐릭터가 벗어나지 않도록 처리
        if keys[pygame.K_LEFT] and self.rect.x > 0:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT] and self.rect.x + self.rect.width < env.WIDTH:
            self.rect.x += self.speed
        if keys[pygame.K_UP] and self.rect.y > 0:
            self.rect.y -= self.speed
        if keys[pygame.K_DOWN] and self.rect.y + self.rect.height < env.HEIGHT:
            self.rect.y += self.speed

 

player.py도 전역변수로 처리를 했다.

지난 포스트에서 문제로 얘기했던 화면 밖을 벗어나는 문제를

키 이벤트에 따라 WIDTH 와 HEIGHT 값을 기준으로 동작 못하게 처리를 해 두었다.

 

이런 부분이 전역변수로 설정을 안 하고 숫자로 입력했을 경우

추후 유지보수 시, 일일히 찾아서 수정을 해야하는 부분이 되겠다.

 

이번 포스트는 크게 작업한 내용이 없다.

그래도 해당 소스코드와 파일 목록 캡쳐해서 올린다.

03. config.zip
0.01MB

 

 

다음 포스트에서는 배경에 별을 넣고 움직임과 깜빡거림을 만들어 보도록 하겠다.