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. 8. 20. 09:16

 지난 번에는 회전을 하는 편대비행을 구현했다면 이번에는 회전이 없는 편대비행을 구현해 봤다. 사실 별로 코드상의 차이는 없다. rotate하는 부분을 코드를 주석으로 막으면 무회전하는 편대비행을 구현할 수가 있다. 적 생성 시점에 설정값 중에 회전 여부를 아래와 같이 추가하고 enemy_class 생성 시 회전여부를 속성값으로 설정할 수 있도록 처리했다.

 

# 0 속도(vel)
# 1 가속도(acceleration)
# 2 회전속도(angle_speed)
# 3 최대속도(max_vel)
# 4 회전여부(rotated) true(1): false(0)
# 5 회전시감속(curved_speed)

enemy_config = [
                 [1, 0.1, 5, 7, 0, 1.5]
               , [1, 0.1, 5, 7, 0, 1.5]
               ]

이렇게 하면 기존 코드에서 rotate 코드를 삭제하지 않고도 똑같은 기체를 회전, 무회전 처리를 할 수가 있다.

    def rotate(self):        
        if self.trgt_angle - self.angle > 0:
            self.angle_speed = abs(self.angle_speed)
        elif self.trgt_angle - self.angle < 0:
            self.angle_speed = abs(self.angle_speed) * -1

        self.angle += self.angle_speed
        self.acceleration.rotate_ip(self.angle_speed)
        if self.rotated: #속성값에 따라 처리할지 분기
            self.image = pygame.transform.rotate(self.orig_image, -self.angle)
            self.rect = self.image.get_rect(center=self.rect.center)
        
        if self.vel.length() > self.curved_speed:
            self.vel.scale_to_length(self.curved_speed)

 회전은 없지만 curved_speed 속성값은 그대로 유지를 했는데 그 이유는 회전이 아닌 경우에도 방향 전환 시 살짝 지연 현상을 주는 것이 조금 더 자연스럽기 때문이다. curved_speed를 0으로 주고 예제를 실행해 보면 차이를 확실히 알 수 있을 것이다. 기존 코드에서 일부 수정해서 위의 그림처럼 노란색 기체를 하나 더 추가했다. 

class EnemyFlight(pygame.sprite.Sprite):
    def __init__(self, sx, sy, enemy_type, move_type):
        pygame.sprite.Sprite.__init__(self)
        self.id = None
        self.move_idx = 0
        self.move_data = enemy_movement[move_type]
        self.images = [pygame.image.load(img_dir + "/img/enemy_flight" \
                     + str(enemy_type) + ".png").convert_alpha()]
        self.image = self.images[0]

 이제 스프라이트와 enemy_movement을 추가하면 하나의 클래스에서 다양한 적들을 생성할 수가 있게 된다.

 

편대비행 회전, 무회전에 적기의 등장을 관리하는 코드는 game_manager.py 부분이다.

지금은 단순히 적기의 등장만을 관리하는데 다음 번에는 이 부분에 게임 시작과 보스가 등장하기 전 메시지 처리와 같은 부분을 추가하도록 해 보겠다. 그리고 process 코드를 보면 무척 비효율적인 것을 알 수가 있는데 이 부분도 다음 번에 수정해서 조금 더 효율적인 코드로 개선해 보도록 하자.

 

import pygame
import os
from game_enemy import EnemyFlight

class GameManager():
    def __init__(self):
        self.time_line = 0
        self.stage_data = [
                           [100, 100, -50, 0]
                         , [150, 100, -50, 0]
                         , [200, 100, -50, 0]
                         , [250, 100, -50, 0]
                         , [300, 100, -50, 0]
                         , [350, 100, -50, 0]
                        ,  [100, 600, -50, 1]
                         , [150, 600, -50, 1]
                         , [200, 600, -50, 1]
                         , [250, 600, -50, 1]
                         , [300, 600, -50, 1]
                         , [350, 600, -50, 1]
                          ]
        

    def process(self, GameMain):
        self.time_line += 1        
        for i, v in enumerate(self.stage_data):
            if v[0] == self.time_line:
                enemy_flight = EnemyFlight(v[1], v[2], v[3], v[3])
                GameMain.enemy_flight_group.add(enemy_flight)

 

09_enemy_formation_norotate.zip
0.02MB