개발이 취미인 개발자
슈팅게임 알고리즘-편대비행-무회전편 본문
지난 번에는 회전을 하는 편대비행을 구현했다면 이번에는 회전이 없는 편대비행을 구현해 봤다. 사실 별로 코드상의 차이는 없다. 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)
'슈팅게임 알고리즘(pygame)' 카테고리의 다른 글
슈팅게임 알고리즘-스테이지 출격과 철수 (0) | 2022.09.12 |
---|---|
슈팅게임 알고리즘-충돌 (0) | 2022.08.28 |
슈팅게임 알고리즘-편대비행-회전편 (2) | 2022.08.14 |
슈팅게임 알고리즘-보스전 (0) | 2022.07.15 |
슈팅게임 알고리즘-360도 방향탄 구현하기 (0) | 2022.06.03 |