편집 : 내 질문이 정확히 무엇인지 명확히하기 위해 : 이것은 콘텐츠 생성 / 관리를 주시하면서 게임 엔진에서 애니메이션 / 애니메이션 상태를 처리하는 좋은 방법입니까? 이 방법으로 수행하는 결함은 무엇이며 다른 방법은 무엇입니까? -내 대답은 의견에 부분적으로 답변되었지만, 갈 길입니다.
2D 게임 엔진 취미 프로젝트 에서 애니메이션을 하드 코딩하지 않고 애니메이션 을 처리하려고 합니다. 하드 코딩 애니메이션 상태는 일반적이지만 매우 이상한 현상 인 것 같습니다.
약간의 배경 : 구성 요소가 많은 데이터와 하위 시스템이 작동하는 엔티티 시스템을 사용하고 있습니다. 폴링 시스템을 사용하여 애니메이션 상태를 업데이트하기로했습니다.
함께 애니메이션 상태 내 말은 "walking_left", "running_left", "walking_right을", "촬영"...
애니메이션을 처리 할 생각은 애니메이션을 데이터 기반 모델 로 디자인하는 것이 었습니다 . 데이터는 xml 파일, rdbms에 저장 될 수 있고 ... 게임 / 레벨 / 시작시로드 될 수 있습니다.이 방법을 사용하면 어디서나 코드를 변경하지 않고도 애니메이션 및 전환을 쉽게 편집 할 수 있습니다. 경기.
예를 들어, 내가 생각한 데이터 정의 의 XML 초안을 만들었습니다 .
매우 중요한 데이터 중 하나는 단순히 애니메이션에 대한 설명 일뿐 입니다. 애니메이션은 고유 한 ID (설명 적 이름)를 갖습니다. 이미지에 대한 참조 ID를 보유합니다 (다른 애니메이션은 다른 스프라이트 시트를 사용할 수 있기 때문에 사용하는 스프라이트 시트). 애니메이션을 실행할 초당 프레임입니다. 여기서 "재생"은 애니메이션을 한 번 또는 무한대로 실행해야하는지 여부를 정의합니다. 그런 다음 사각형 목록을 프레임으로 정의했습니다.
<animation id='WIZARD_WALK_LEFT'>
<image id='WIZARD_WALKING' />
<fps>50</fps>
<replay>true</replay>
<frames>
<rectangle>
<x>0</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
<rectangle>
<x>45</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
</frames>
</animation>
애니메이션 데이터는 애니메이션 리소스 풀 에로드되어 유지되며 이를 사용하는 게임 엔터티가 참조합니다. 이미지, 사운드, 텍스처 등의 리소스로 취급됩니다.
정의 할 두 번째 데이터 는 애니메이션 상태 및 전환 을 처리 하는 상태 머신입니다 . 이것은 게임 엔티티가있을 수있는 각 상태를 정의합니다.이 상태는 전환 할 수있는 상태와 그 상태 변경을 유발하는 요소입니다.
이 상태 머신은 엔티티마다 다릅니다. 새는 "걷는"상태와 "비행하는"상태를 가질 수 있지만 인간은 "걷는"상태 만 가질 수 있기 때문입니다. 그러나 여러 사람이 같은 상태를 가질 것이기 때문에 (특히 몬스터와 같은 일반적인 NPC를 정의 할 때) 다른 엔티티와 공유 할 수 있습니다. 또한 오크는 인간과 같은 상태를 가질 수 있습니다. 이 상태 정의는 선택된 게임 엔터티 그룹 만 공유 할 수 있음 을 보여주기 위해 .
<state id='IDLE'>
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_LEFT'>
<event trigger='LEFT_UP' goto='IDLE' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_RIGHT'>
<event trigger='RIGHT_UP' goto='IDLE' />
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
</state>
이러한 상태는 폴링 시스템 으로 처리 할 수 있습니다 . 각 게임 틱은 게임 엔티티의 현재 상태를 파악하고 모든 트리거를 확인합니다. 조건이 충족되면 엔터티의 상태가 "goto"상태로 변경됩니다.
내가 고투했던 마지막 부분은 애니메이션 데이터와 애니메이션 상태를 엔티티 에 바인딩 하는 방법이었다 . 가장 논리적 인 접근법은 엔티티가 사용하는 상태 머신 데이터에 대한 포인터를 추가하고 해당 머신의 각 상태에 대해 사용하는 애니메이션을 정의하는 것 같습니다.
다음은 애니메이션 상태 및 애니메이션 데이터 ID를 지정하여 게임에서 일부 공통 엔터티의 애니메이션 동작 및 그래픽 표현을 정의하는 방법에 대한 xml 예제입니다. "마법사"와 "orc"는 모두 애니메이션 상태는 같지만 애니메이션은 다릅니다. 또한 다른 애니메이션은 다른 스프라이트 시트 또는 다른 애니메이션 시퀀스를 의미 할 수 있습니다 (애니메이션이 길거나 짧을 수 있음).
<entity name="wizard">
<state id="IDLE" animation="WIZARD_IDLE" />
<state id="MOVING_LEFT" animation="WIZARD_WALK_LEFT" />
</entity>
<entity name="orc">
<state id="IDLE" animation="ORC_IDLE" />
<state id="MOVING_LEFT" animation="ORC_WALK_LEFT" />
</entity>
엔티티가 생성 될 때 상태 머신 데이터 및 애니메이션 데이터 참조가있는 상태 목록을 추가합니다.
앞으로 엔티티 시스템을 사용하여 유사한 XML 형식으로 컴포넌트를 정의하여 전체 엔티티를 빌드 할 것입니다.
-
이것은 약간의 연구 후에 내가 생각해 낸 것입니다. 그러나 나는 그 주위에 머리를 두는 데 어려움을 겪었으므로 피드백을 원했습니다. 여기에 의미가없는 것이 있습니까, 아니면 이러한 것들을 처리하는 더 좋은 방법이 있습니까? 프레임을 반복하는 아이디어를 파악했지만 한 단계 더 나아가는 데 어려움을 겪고 있으며 이것이 저의 시도입니다.