2016년 9월 25일 일요일

4)ActionFighter의 상태 구현_2


4) ActionFighter

지금까지 AF(ActionFighter) 안에서 어떻게 이미지가 그려지는지, 그리고 어떻게 상태가 작동되는지를 설명했습니다. 이번엔 AF가 어떻게 상태를 사용하는지 그리고 어떻게 입력을 받아들여서 처리하는지를 설명하겠습니다.



AF는 다양한 상태를 지닐 수 있어야 합니다. 비트맵월드는 마우스 클릭과 드래그로 스킬을 사용합니다. 그리고 각각의 스킬은 한 개 이상의 상태로 구현되어 있습니다. 이 스킬을 저장하기 위해 AFskillMap이라는 클래스를 사용합니다.



-      AFskillMap




SkillMap의 함수와 변수들입니다.
하나의 skillMap 안에는 해당 객체의 소유AF와 스킬의 초기 상태를 저장하는 slot6개 있습니다. (연속된 다음 상태는 해당 상태의 inputSlot 함수를 통해 생성, 호출합니다)

AddSkill 함수는 원하는 슬롯에 스킬을 초기화 하여 덮어씌우고 getSkill을 통해 해당 슬롯의 레퍼런스를 받아옵니다.






이제 ActionFighter의 변수를 살펴보겠습니다.

입력을 통한 상태 변화는 skillMap의 해당 슬롯값에 저장됩니다. 하지만 입력 이외에도 다양한 상태변화가 필요하고 그러한 상태들은 AF에 직접 저장되어 있습니다.
해당 상태들은 AF가 생성될 때 초기화됩니다.

CurState: 현재 AF의 상태입니다.
CurSkillMap: 현재 활성화 되어있는 skillMap 값입니다.
AtkSkillMap: 마우스 왼쪽 클릭으로 활성화되는 공격형 스킬을 저장하는 스킬맵의 값입니다.
DefSkillMap: 마우스 오른쪽 클릭으로 활성화되는 수비형 스킬을 저장하는 스킬맵의 값입니다.
IdleState: 아무런 행동도 취하지 않을 시 진입되는 상태. idle상태에 대해선 나중에 더 설명하겠습니다.
DamagedState: 공격을 당할 시 진입하게 되는 상태입니다.
DeadState: 차가운 시체가 되는 상태입니다.
PushedState: 특정 조건에 의해 밀려나게 되는 상태입니다.
Downstate: 쓰러진 상태입니다.
EventState: 이벤트씬에서 사용되는 상태입니다.






AF는 상황에 따라 저장된 상태들로 상태 변화를 합니다.

저번 AFstate 설명에서 말했듯 모든 상태 변화는 AFstatechangeState()에 의해 변화됩니다. 그리고 changeState는 보통 AFstate의 내부에서 구현됩니다.
AFcurState의 함수를 호출함으로써 상태를 변화시킵니다.



-      damaged
상대의 공격에 의해 대미지를 받게 되면 curStatedamaged함수를 호출하여 현재 상태에서 취해야 할 행동을 처리합니다.



-      update
매 틱마다 curStateUpdate 함수를 호출합니다.






-      inputSlot

비트맵월드의 특수한 입력 형식입니다. 6방향으로 마우스를 드레그 함으로써 각각의 slot값에 접근할 수 있게 됩니다.
슬롯 입력에 따라 curState가 입력받은 slot값에 따라 처리하게 됩니다. 하지만 일단 그 전에 마우스 입력을 슬롯입력으로 바꾸는 작업이 필요합니다.
 우선 마우스 클릭을 통해 마우스 좌표를 초기화하고 skillMap을 활성화 합니다.



















1차적인 입력 처리는 playerController에서 이루어집니다. 이는 나중에 설명하겠습니다.



해당 그래프는 틱 이벤트의 시퀸스2에서 이어져있습니다.

AF는 매순간 curSkillMap이 활성화되어 있는지 확인합니다. 마우스 입력에 의해 curSkillMap이 활성화 되고 마우스 포인터의 드래그 길이가 일정 거리를 초과하게 되면 각도를 계산하여 curStateinputSlot에 계산된 slot값을 전달해 호출한 후 다시 포인터의 위치를 초기화 시킵니다.



정리하자면 ActionFighterdamaged, update, inputSlot 이벤트를 통해 curState에 접근하여 필요한 기능을 구현하게 됩니다.

이로써 ActionFighter의 대부분의 기능에 대한 설명이 끝났습니다.
다음엔 사용자의 입력을 담당하는 playerController에 대하여 설명하겠습니다.



댓글 없음:

댓글 쓰기