스푸79 기록 보관소

운석 피하기 게임 개발(5)- 배경 넣기(feat. ChatGPT) 본문

게임공작소

운석 피하기 게임 개발(5)- 배경 넣기(feat. ChatGPT)

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

 

오늘은 기존 코드에 배경을 추가할 생각이다.

여러 개의 별이 위에서 아래로 흐르는 배경을 넣어서

우주 공간에서 속도감 있게 움직이는 효과를 줄 생각이다.

깔끔하게 ChatGPT에게 물어보면서 개발에 시작 하겠다.

 

ChatGPT가 보여준 코드는 아래와 같다.

class Star:
    def __init__(self):
        self.x = random.randint(0, screen_width)
        self.y = random.randint(-20, screen_height)
        self.speed = random.randint(1, 5)
        self.size = random.randint(1, 2)
    
    def move(self):
        self.y += self.speed
        if self.y > screen_height:
            self.y = random.randint(-20, -10)
            self.x = random.randint(0, screen_width)
            self.speed = random.randint(1, 5)
            self.size = random.randint(1, 2)
    
    def draw(self, screen):
        pygame.draw.circle(screen, white, (self.x, self.y), self.size)
        
        
stars = [Star() for _ in range(100)]

..중략..

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 화면 채우기 (배경색)
    screen.fill(black)

    # 별 그리기 및 이동
    for star in stars:
        star.move()
        star.draw(screen)

 

ChatGPT코드를 바로 실행해 보았다.

 

역시 갓GPT...

코드는 크게 수정할 부분은 없어 보인다.

코드를 보면 100개의 별을 생성하고

화면 끝까지 이동한 경우

다시 위치를 시작 위치로 y값을 바꾼 후 x값은 랜덤하게 바꾸도록 처리했다.

self.size = random.randint(1, 5)

이 부분만 최대값을 5에서 2로 변경했다.

 

그리고 너무 속도가 일정한 것 같다는 생각이 들어 25퍼센트의 확률로 아주 빠른 별이 지나가도록 처리했다.

기존 main.py와 enviroment.py와 연계되서 작동될 수 있도록 코드를 조금 더 수정했다.

 

아래 코드를 보자.

enviroment.py에 배경 별 생성과 관련된 전역변수를 추가했다.

import os

class Enviroment:
    .. (중략) ..
    TOTAL_STARS_COUNT = 101 #최대 생성 갯수
    MIN_STARS_SPEED = 1     #일반 별 최소 속도
    MAX_STARS_SPEED = 3     #일반 별 최대 속도
    UTRLA_STARS_SPEED = 6   #빠른 별 속도
    UTRLA_SPEED_CHANCE = 25 #빠른 별 생성하는 확률

    .. (중략) ..

 

아래는 main.py 코드 수정한 부분이다.

멤버변수 self.background에 Background 클래스를 개체를 선언했다.

배경으로 별이 처리되려면 메인 캐릭터보다 먼저 그려져야 해서 순서는 background가 먼저 draw되도록 처리했다.

.. (중략) ..
from background import Background #배경 처리를 위한 Background 클래스 import 

class Main():
    def __init__(self):        
        ... (중략) ...
        self.background = Background() #Main 클래스에 background 멤버변수 선언

    def play(self):
        while self.running:
            
            .. (중략) ..
            
            self.screen.fill(env.BLACK)
            self.background.draw(self.screen) # 별이 메인캐릭터보다 먼저 그려지도록 처리
            self.player_sprites.draw(self.screen)

.. (중략) ..

 

아래 background.py 전체 코드이다. 하드코딩을 배제하기 위해 전역변수를 많이 활용했다.

import pygame
import random
from enviroment import Enviroment as env

class Background:
    def __init__(self):
        self.stars = [Star() for _ in range(env.TOTAL_STARS_COUNT)]

    def draw(self, screen):
        for star in self.stars:
            star.move()
            star.draw(screen)

class Star:
    def __init__(self):
        self.x = random.randint(0, env.WIDTH)
        self.y = random.randint(-10, env.HEIGHT)
        self.speed = random.randint(env.MIN_STARS_SPEED, env.MAX_STARS_SPEED)
        self.size = 1
    
    def move(self):
        self.y += self.speed
        if self.y > env.HEIGHT:
            self.y = random.randint(-10, -5)
            self.x = random.randint(0, env.WIDTH)
            self.speed = self.init_stars()

    def init_stars(self):
        if random.randint(1, env.UTRLA_SPEED_CHANCE) == 1:
            speed = env.UTRLA_STARS_SPEED
        else:
            speed = random.randint(env.MIN_STARS_SPEED, env.MAX_STARS_SPEED)                    
        return speed


    def draw(self, screen):
        pygame.draw.circle(screen, env.WHITE, (self.x, self.y), self.size)

 

최종 실행한 결과는 아래와 같다.

 

04. background.zip
0.01MB