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. 5. 22. 17:49

 회전탄은 발사된 총알이 원을 그리며 움직이는 탄이다. 여러 개의 총알이 회전을 하기 때문에 현란해 보일 뿐만 아니라 위의 구현된 회전탄처럼 점점 그리는 원의 반경을 넓혀주면 플레이어가 예상하는 움직임을 빗나가게 피하기 어렵게 만든다. 

 cx, cy를 총알의 움직이는 중심 좌표로 두고, 총알이 움직이는 원의 반지름을 rad로 가정할 때, 원을 그리면서 움직이는 총알의 좌표는 아래와 같은 공식을 통해 얻을 수 있다.

x = cx + rad * cos(θ)

y = cy + rad * sin(θ) 

 위의 공식을 코드로 구현하면 아래와 같다. 

    def update(self, GameMain):
        self.x = self.cx + self.rad * math.cos(math.radians(self.theta))
        self.y = self.cy + self.rad * math.sin(math.radians(self.theta))        
        self.theta += 2
        
        if self.rad < self.max_rad:
            self.rad += 0.2
            
        self.rect.centerx = int(self.x)
        self.rect.centery = int(self.y)

 python의 math.cos 와 math.sin은 radians 값을 파라미터로 받기 때문에 우리가 알고 있는 15도, 30도와 같은 각도를 math.radians 함수를 통해 변경 시켜줘야 한다.

 매 초마다 반지름 rad 의 값을 조금씩 증가시켜 주면 위와 같이 회전탄의 반경이 점점 넓어지도록 처리할 수 있다.

 

 총알이 회전하는 움직이는 속도는 증가되는 θ의 값을 조절해서 얻을 수 있다. 위의 소스에서는 self.theta 값을 2씩 증가시켜주고 있는데, 프레임을 60으로 잡아줬기 때문에 화면에 주사하기 때문에 1~2도 정도만 설정해도 회전탄의 움직임은 꽤 빠른 편이다.

 

 발사되는 회전탄의 총알 갯수와 회전탄의 반경을 다르게 처리하기 위해서는 총알 갯수와 반경을 randinit 함수를 통해 변경해 주면 된다. 이를 코드로 구현하면 아래와 같다.

    def createBullet(self, bullet_group, sx, sy, tx, ty):
        angle = math.atan2(ty - sy, tx - sx)
        max_rad = random.randint(800, 1200)
        cnt = random.randint(4, 12)
        if cnt % 2 == 1:
            cnt += 1
        theta = 0
        theta_inc = 360 / cnt
        for _ in range(1, cnt + 1):
            rotationBullet = RotationBullet(sx, sy, tx, ty, angle, 0, max_rad, theta)
            bullet_group.add(rotationBullet)
            theta += theta_inc

 만약 총알의 갯수가 5, 7, 9, 11과 같이 홀수가 나오는 경우, 여기서는 강제로 짝수로 맞춰줬다.(이 부분을 제외하고 홀수 회전탄으로 만들어도 상관은 없다.)

 총알의 갯수에 따라 각도가 달라지게 됨으로 360도를 총알 갯수로 나눠준 값을 증가값으로 두고 0도 부터 총알 갯수만큼 반복해 주면 원형을 그리는 회전탄을 만들 수가 있다.

 

 회전탄을 살짝 응용하면 위와 같이 플레이어를 호위하는 보조비행기를 만들 수가 있다. 보조 비행기까지 구현된 샘플소스를 첨부한다. 위의 코드를 응용하여 기존의 소스코드를 바탕으로 위와 같은 보조비행기를 직접 만들어 보는 것도 본인의 실력 향상을 위해 좋을 듯 한다.

05_rotation_bullet.zip
0.02MB