https://sksnxjs.tistory.com/entry/8-Burst-%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98-%ED%9A%A8%EA%B3%BC-%EA%B5%AC%ED%98%84

 

[#8] Burst!! - 애니메이션 효과 구현

게임에 사용된 무료 리소스 링크 https://pipoya.itch.io/ Pipoya - itch.io pipoya.itch.io http://monstermeetingplace.web.fc2.com/ モンスター集会所! monstermeetingplace.web.fc2.com 게임의 해상도를 올리..

sksnxjs.tistory.com

오늘은 애니메이션을 출력해주는 클래스를 수정했다. 기존에 애니메이션 클래스는 한정된 프레임에 대한 루프만 관리해주고 실제 이미지를 출력하는건 외부 클래스가 담당했기 때문에 그대로 사용하기엔 너무나도 불편했다. 그리고 장면이 넘어가는 딜레이 타이밍 또한 외부에서 정의해줘야 했었고, 외부에서 가져오는 이미지 파일이 행렬 구조일 경우 x 좌표밖에 대응이 안되는등 한계가 명확했다. 특히 가장 치명적 문제는 FRAME이 증가할 때 마다 enum의 요소를 키워야한다는 점이었다.


수정 후 

 

캐릭터의 움직임이 담긴 리소스

수정 전 기존에 클래스는 프레임 이미지가 위에처럼 행렬 구조일 때 각각 한 라인에 대해서만 프레임 조작이 가능했었다. 이 부분에 대응하기 위해 새로 수정한 클래스에서는 프레임 위치 좌표에 대응되는 Coord 구조체를 내부에 정의해주었다. 그리고 Coord 구조체를 연산자 오버로딩해서 x, y에 대한 비교가 간단해지게끔 해두었다. 

 

set 멤버함수는 시작 모션에 대한 (x, y) 그리고 동작의 반복을 원하는 begin(x,y), end(x, y), 마지막으로 각 프레임이 전환되는 딜레이 타임을 인수로 받는다. 

draw를 하면 좌우 방향을 번갈아가면서 begin과 end지점을 딜레이 타이밍에 맞게 반복 재생시킨다. 이미지마다 프레임을 다루는 방식이 다르다보니 재생 방향까지 설정가능하게 하거나 여러 장면을 엮게끔 기능도 추가해볼까 했지만, 이런 부분들은 당장 나에게 필요한 기능은 아니어서 보류했다.

stop은 최초의 시작 모션을 아무런 애니메이션 없이 출력해주는 함수이다. 움직이지 않을 때 멈춰있는 장면을 출력하려고 넣었다.

reset은 초기의 상태로 모두 되돌린다.


 클래스 멤버 함수 정의 부분

각 픽셀에 대한 좌표를 입력받으면 이미지 단위의 픽셀로 변환한 후 자동적으로 이미지를 그려주게끔 했다.

 


애니메이션 루프는 위에처럼 진행된다. 증감연산자는 현재 출력해야할 장면의 Coord( x, y )값을 증가시킨다. 그리고 각 Coord를 관리하는 자료구조를 벡터로 사용한 이유는 하나의 애니메이션 클래스만으로 여러 동작을 정의하고 다룰 수 있게 하기 위해서 사용했다.

 

이외에도 const char로 직접 동작의 이름을 지어줄 수 있게끔해볼까 생각도 했지만, 이름으로 굳이 해당 동작에 대한 정보를 찾는 것보다 인덱스로 접근하는게 훨씬 빠르다고 판단해서 인덱스를 받아서 동작에 대한 관리가 가능하게끔 했다. 

 


Coord 구조체 정의

 

Coord 구조체는 크게 특별한 부분은 없다. 아래는 이전 상태의 로직과 수정 후 로직을 비교했다.

 


수정전 Player클래스의 draw 멤버 함수

보다시피 delay 타이밍이나 동작 방식을 player클래스에서 다루다보니 코드가 쓸데없이 길고 분기문이 많다.


수정된 애니메이션 적용

 

이전보다 코드가 비교도 안되게 간소화되었다. m_Motion은 애니메이션 클래스이다. 동적할당과 이미지 데이터를 넘겨서 생성해준다. 그리고 각각의 장면에 대한 애니메이션을 set해준다. 각 인덱스에 대한 동작 명칭은 해당 애니메이션 클래스를 보유하고 있는 클래스가 정한다. draw는 m_isWork(입력을 통해 걷고 있을 때) 현재 방향에 대한 애니메이션을 출력하고 그렇지 않을 경우 서있는 애니메이션을 출력하게 했다.

 

애니메이션 클래스가 커짐에 따라 메모리 사용량은 증가했지만 switch를 통한 분기나 여러 딜레이에 대한 if문들이 사라져서 전체적인 계산량은 크게 줄었다. 물론 여러 장면에 대한 애니메이션에 대응하기엔 턱없이 부족한 기능들이긴 하지만.. 프레임의 제한없이 대응할 수 있게 되었고, 한번의 셋팅만으로 사용이 가능해졌다. 일단 당분간은 이정도로 만족해야겠다.