Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발이 취미인 개발자

슈팅게임 알고리즘-배경처리 본문

슈팅게임 알고리즘(pygame)

슈팅게임 알고리즘-배경처리

도그풋79 2022. 9. 25. 20:50

 슈팅게임에서 배경은 화면의 속도감을 주는 역할을 한다. 속도감이 생기는 이유는 착시 효과를 이용한 것으로 배경을 빠르게 이동시켜 멈춰 있는 메인 캐릭터 빠른 속도로 움직인다는 느낌을 받게 된다.

 코드 구현도 무척 간단하다. 최초 맨 위에서 출발한 이미지가 화면에 마지막에 도달하게 되면 배경이미지의 높이만큼 다시 위로 이동시키면 끝이다. 여기서는 조금 입체적인 효과를 주기 위해 배경 이미지를 4장을 사용했다. 별 이미지 2장과 성운 이미지 2장을 처리했는데 이미지를 더 추가하면 훨씬 더 속도감 있는 효과를 줄 수가 있을 것이다.

 game_background.py 파일을 새로 만들고 아래 소스코드를 추가한다.

class Background(pygame.sprite.Sprite):
    def __init__(self, bg_img, y, speed):
        pygame.sprite.Sprite.__init__(self)
        self.bg = pygame.image.load(img_dir + "/img/background_" + bg_img + ".png").convert_alpha()
        self.image = self.bg
        self.rect = self.image.get_rect()                
        self.rect.x = 0
        self.speed = speed
        self.rect.y = 0 if y == 0 else -self.rect.h
    
    def update(self):
        self.rect.y += self.speed
        if self.rect.y > self.rect.h:
            self.rect.y = -self.rect.h

        self.image = self.bg

 위의 코드를  설명한 그림이다. 한장의 배경으로 y좌표 값의 위치만 계속해서 변경해주면 계속해서 반복된 배경을 만들 수가 있다. 문제는 현재 진행 중인 배경이 밀리면서 그 공백이 생기는 문제가 발생하는 이는 시작할때부터 좌표가 800부터 시작하는 다른 배경을 하나 넣어줘서 화면에 총 2장의 배경이 끝없이 서로 반복되도록 처리하면 된다.

기존 game_main.py 에 위의 작성된 Background 클래스를 호출하고 배경이 반복될 수 있도록  코드를 추가해보자.

class GameMain():
    def __init__(self):
        ... (중략) ...
        # 배경 스프라이트 그룹 추가
        self.background_group = pygame.sprite.Group()

    def play(self, GameMain):
        ... (중략) ...
        self.createBackground(self.background_group)

        ... (중략) ...
        while running:
            clock.tick(60)
            screen.fill([0,0,0])
            
            # 배경이 가장 아래에 나와야하기 때문에
            # 다른 스프라이트 그룹보다 가장 먼저 호출되어야 한다.
            self.background_group.draw(screen)
            self.background_group.update()
            
            ... (중략) ...

    def createBackground(self, background_group):
        bg1 = Background("01", 0, 1)
        bg2 = Background("02", 800, 1)        
        bg3 = Background("03", 0, 10)
        bg4 = Background("04", 1600, 10)

        background_group.add(bg1)
        background_group.add(bg2)
        background_group.add(bg3)
        background_group.add(bg4)

 pygame에서 화면에 그려지는 순서는 코드 순으로 진행된다. 먼저 그려진 이미지는 나중에 그려진 이미지에 덮어지게 된다. 배경은 게임 상의 등장하는 모든 이미지 중에 가장 밑에 나와야 되기 때문에 가장 먼저 호출한다.

 bg4는 bg2와 다르게 800이 아니라 1600으로 y값을 선언했다. 그 이유는 bg4에 적용된 이미지의 실제 height 값이 1600이기 때문이다. 첨부된 소스의 img 폴더에서 이미지 속성을 확인해 보면 별 이미지보다 훨씬 큰 것을 알 수 있을 것이다. 

 위의 영상에서는 별 배경이미지의 속도를 기존보다 높이고 새로운 별 이미지 배경을 하나 더 추가해봤다. 훨씬 더 역동적인 배경 움직임으로 속도감 있는 게임으로 변경이 되는 걸 확인할 수가 있다. 배경 하나 밑에 아주 느린 속도로 움직이는 다른 이미지를 추가해 보면 꽤나 입체적인 배경을 완성할 수 있을 것이다. 한번 직접 이런 저런 시도를 해보기 바란다. 위의 영상까지 적용한 소스 코드를 첨부한다. 실행 방법은 기존과 동일하게 game_main.py를 실행하면 된다.

12_enemy_formation_background.zip
0.69MB