출처 :  statedef 코드 강좌 - M.U.G.E.N. 마이너 갤러리 (dcinside.com) 

작성자 : SAE


나 1.239인데 이제부터 강좌는 고닉으로 쓰겠음.


이번에는 cns로 기술을 만들 때 반드시 사용해야 하는 statedef라는 코드를 적어볼까 함. 사실 순서를 따지면 이걸 가장 먼저 올리는 게 맞지만 갤럼들은 이런 것보다 hitdef이나 projectile같은 걸 더 알고 싶어하는 것 같아서 그걸 먼저 적긴 했음. 실제로 projectile 하나 몰라서 캐릭터 제작을 못해보고 있다는 유저도 있었고.



이건 쿵푸맨 약손 statedef을 가져온 거임. 내가 파이터 팩토리 3을 쓰는데 맨 오른쪽에 cns코드들을 나열된 목록 중에 statedef은 없더라고. 쿵푸맨 statedef이 기본적인 설명을 주석으로 다 적어놔서 가장 알기 쉽다는 이유도 있음. 그나마 비슷한 코드가 statetypeset이라는 코드인데 일부는 이거 설명 보면 쉽게 이해가 될 듯.


[Statedef 200]

type = S, C, A, L ;State-type: S-stand, C-crouch, A-air, L-liedown

Statedef의 statetype을 정해줌. S는 서서, C는 앉음, A는 공중, L은 누웠을 때라는 뜻.


movetype= A, I, H ;Move-type: A-attack, I-idle, H-gethit

Statedef의 movetype을 정해줌. A는 공격 중, I는 중립, H는 맞는 중이라는 뜻으로 보통 아무 것도 안 하고 있는 상태는 거의 I(중립)이라고 보면 됨.


physics = S, C, A, N ;Physics: S-stand, C-crouch, A-air, N-None

Statedef의 물리법칙 같은 것을 정해줌. 위 type과 똑같이 적어주면 되는데 설정에 따라 소소한 움직임이 달라지기도 함. 예를 들어 점프 공격에 physics를 A로 적으면 별도로 velset 같은 이동 관련 코드를 안 만들어도 알아서 바닥으로 스스로 떨어지고 별도로 chagestate를 만들지 않아도 알아서 바닥에 착지했을 때 그 착지 애니메이션까지 자연스럽게 수행하게 됨.


강좌 내용을 보면 각각 yaccel(y가속도), crouch.frictione(앉아있을때마찰력), stand.friction(서있을때마찰력) 값을 매 프레임마다 적용한다고 되어 있음. 다만 공중 기술 중에서 physics를 N(아무것도 적용안함)으로 적어 놓고 이동 관련 코드를 별도로 조절해서 만드는 경우도 많으니 참고.


참고로 위 3개는 코드 중에 StateTypeSet라고 있는데 이걸로 이용해서 도중에 다른 값으로 바꿀 수 있음.



juggle = 숫자(0 이상의 값을 주면 됨) ;Number of air juggle points move takes

기술의 중력 보정을 설정함. 공중에서 한번 타격할때마다 저글 수치가 해당 값만큼 누적되고 juggle이 [data]의 air.juggle의 수치를 초과하면 더 이상 공중에 떠 있는 상대 캐릭터를 때릴 수 없게 됨. 그리고 상대 캐릭터가 바닥에 떨어지는 순간 juggle은 0으로 초기화 됨. 당연히 땅에 발을 붙이고 있는 캐릭터한테는 juggle이 0으로 고정되서 juggle 값이 누적되지 않음. 이건 hitdef이나 projectile의 air.juggle로 대신 설정 할 수 있음.


근데 한 가지 골치 아플 수 있는 것이 바로 helper인데 helper는 일종의 독립적인 개체로 분류되는 녀석이라 캐릭터의 juggle 수치가 아무리 air.juggle의 값을 넘은 상태여도 애초에 helper는 별개의 몸으로 취급되기 때문에 helper의 juggle은 캐릭터 juggle로 가져오지 않고 별개로 0으로 되어 있음. 때문에 중력 보정이 걸리지 않고

계속 공중에서 타격이 가능해짐. 잘못하면 helper 공격에 떡칠된 캐릭터는 공중 무한 콤보가 걸릴 수 있음.이론적으로 특정 코드를 만들어서 중력 보정이 걸리게 만들 수 있긴 할텐데 진짜 코드를 잘 짜는 애들이 아니면 좀 힘들 듯. 나도 아직 해결책을 못 찾음.


;Commonly-used controllers:

velset = x축(숫자),y축(숫자) ;Set velocity (x,y) (Def: no change)

캐릭터가 해당 statedef이 끝날 때까지 설정한 수치만큼 이동시킴. 만약 특정 프레임 범위 내에서만 캐릭터가 이동하게만들고 싶다면 이걸 0,0으로 초기화시켜주고 별도로 velset 코드를 만들어서 지정해야 함.


ctrl = 0 or 1 ;Set ctrl (Def: no change)

캐릭터가 Statedef이 돌아가는 중에도 커맨드 입력해서 조종 혹은 캔슬이 가능할 수 있게 할거냐 이런 거임. 점프 착지 모션이라던가 이런 경우가 아니면 일반적인 경우에는 0(조종 불가)으로 씀.


anim = 애니메이션 번호 ;Change animation (Def: no change)

air파일에서 만들어 놓은 애니메이션을 지정함. 당연히 써야지 안 쓰면 기술 썼을때 아무것도 안 보일 거임.


poweradd = 숫자 ;Power to add (Def: 0)

statdef이 작동했을 때 기 수치를 얼마만큼 증가시킬 것이냐를 설정함. 음수값도 사용 가능하고 그러면 당연히 기가 수치만큼 깍인다는 뜻이 됨.


sprpriority = 숫자 ;Set p1's sprite layering priority to 2 (in front)

statedef anim의 우선 표시 순위를 정함. 예를 들어 이게 explod의 sprpriority보다 낮으면 캐릭터가 explod에 가려지는 것처럼 보임. 음수 값도 사용 가능하고 값은 보통 -5~5 사이의 값을 많이 씀.



당연히 statedef을 썼으면 이걸 끝내는 법도 알아야겠지?


끝내는 방법은 chagestate라는 코드를 이용하면 됨.


[State 0, ChangeState]

type = ChangeState

trigger1 = animtime = 0

value = 0

ctrl = 1


이렇게 하면 다시 기본 스탠딩 자세로 돌아갈거임. 만약 다른 statedef으로 넘어가게 만들고 싶다면


[State 0, ChangeState]

type = ChangeState

trigger1 = animtime = 0

value = 300


이렇게 적으면 되고. 만약 점프 공격이라서 점프 착지 모션을 별도로 만들어야 하는 상황이라면


[State 821, 3]

type = changeState

trigger1 = vel y > 0 &&pos y >= 0

value = 52


이렇게 적으면 됨. 혹시나해서 말하지만 statedef -1, -2, -3은 상시 발동 상태를 유지해야 하므로 특정 조건에서 다른 statedef으로 넘어가게 만들게 아니라면 ChangeState를 쓰지 않아도 됨.


그리고 이건 깜빡하고 안 썼는데 어느 statedef에 따라 끝내는 방법이 다르기도 함.

예를 들어 피격 전용 statedef이면 selfstate로 끝낼 수도 있고, helper statedef이면 무조건 DestroySelf로 끝내야 헬퍼가 사라짐.