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
관리 메뉴

개발이 취미인 개발자

플랫포머게임 알고리즘 - 캐릭터의 점프(1) 본문

플랫포머게임 알고리즘(pygame)

플랫포머게임 알고리즘 - 캐릭터의 점프(1)

도그풋79 2023. 9. 17. 21:46

 플랫포머 게임에서 점프는 가장 중요한 기술이다. 과거 고전 게임의 경우에는 점프 컨트롤이 아주 불편했는데, 보통 점프의 높이 변경이나 방향 전환을 할 수 없도록 구현 되어 있었다.

 특히 '마계촌'은 점프 스킬이 아주 불편했던 대표적인 고전 게임이다. 게임 내에서의 채공 시간도 매우 짧고 점프 높이도  낮아서 조금이라도 타이밍이 맞지 않으면 쉽게 적이 쏜 탄에 맞거나 몹과 부딪치게 구현되어 있었다.

 최근 플랫포머 게임의 과거와 달리 키를 얼마동안 누르고 있느냐에 따라 점프의 높이를 조절할 수 있도록 구현되어 있다. 또 이중 점프와 같은 기술을 추가하여 점프 이후에 무방비로 떨어지는 메인 캐릭터에게 한번 더 점프 할 수 있는 기회를 주기도 한다. 

우선, 이번 강의 점프는 과거 스타일의 점프를 그대로 구현해 보도록 하겠다. 

점프는 올라가는 모습과 떨어지는 모습 2개와 좌우 방향을 나눠 위와 같이 총 4개의 스프라이트로 구현했다.

 

 점프는 일반 좌우 이동의 구현처럼 x축의 값을 더하거나 빼기만 해서는 자연스럽게 보이지가 않는다. 자연스러운 점프를 구현하기 위해서는 점진적으로 y축값의 변화가 필요하다.

 

 중력 1px,  프레임당 점프높이(y축 이동크기) 15px 이라고 가정해보자.

 점프를 하는 첫번째 프레임에서  y축으로 15만큼 이동을 한다. 이때 중력의 영향으로 1이 감소하여 결국 위로 14만큼 이동시킨다. 그 다음 두번째 프레임은 기존 중력의 영향으로 14로 줄어든 상태로 두고 다시 중력값 1만큼 빼기 되면 위로 13만큼만 이동하게 된다. 이와 같은 식으로 프레임이 점점 계속 되게 되면 14번째 프레임부터서는 점프 높이가 0이 되고 15번째부터서는 점프 높이가 -1이 된다. 점프의 높이가 마이너스(음수)가 된 상태부터는 캐릭터는 아래로 떨어지게 된다. 아래로 떨어지는 값은 전체 점프 높이인 15px를 넘어설 수 없다 따라서 -15보다 더 작은 값이 나오는 시점에는 점프는 중지가 된다.

 위의 내용을 코딩하면 아래와 같다.

 

        #중력값과 점프 상태, 점프 높이, 점프 스피드를 선언한다.
        ....
        self.gravity = 1
        self.jumping = False
        self.jump_height = 15
        self.jump_speed = self.jump_height
        ....
        
        #스페이스바를 누른 경우 점프 상태를 전환한다.
        if key[pygame.K_SPACE]:
            self.jumping = True
            
        #jump_height는 캐릭터의 프레임당 기본 점프 수치
        #jump_speed는 프레임당 중력의 영향으로 점점 줄어드는 실제 캐릭터의 점프 높이다.
		if self.jumping:
            self.rect.y -= self.jump_speed
            self.jump_speed -= self.gravity
            if self.jump_speed > 0:
                self.image = self.l_jump_images[0] if self.left_direction else self.r_jump_images[0]
            else:
                self.image = self.l_jump_images[1] if self.left_direction else self.r_jump_images[1]

            if self.jump_speed < -self.jump_height:
                self.jumping = False
                self.jump_speed = self.jump_height

 중력값 점프 상태(sel.jump)와 점프 높이(jump height)와 점프 스피드(jump_speed)를 선언한다.

높이와 스피드를 각각 따로 두는 이유는 실제 점프하는 과정에서의 중력에 의해 줄어드는 높이(height)는 jump_speed로 처리하고 점프가 종료되는 시점에 원래 최초 점프 높이로 다시 되돌리기 위해 2개의 값을 사용했다.

 디버그 모드로 프로그램을 실행해서 변화는 값을 하나씩 추적해 보면 이해하기 쉬울 것이다.

아래 예제 소스를 첨부한다. 기존 강의와 동일하게 game_main.py를 실행하면 위의 동작을 확인할 수가 있다.

03_jump.zip
0.28MB