[Ihoo] 헬퍼로 프로젝타일과 동일한 효과 내어 봅시다. > 기초 이해 강좌

본문 바로가기

사이트 내 전체검색

뒤로가기 기초 이해 강좌

[Ihoo] 헬퍼로 프로젝타일과 동일한 효과 내어 봅시다.

페이지 정보

작성자 Leona123 작성일 24-10-03 17:49 조회 604 댓글 0

본문

편의상 반말 양해부탁드립니다. 설명은 아시는것도 많을테지만 자세하게 하겠습니다

  진념 만들다가 안 것입니다.


  제가 여기 쓴 글에 의하면 projectile 에 p2stateno 명령을 쓸 경우 버그가 생길수 있다고 하였

습니다.

  하지만 그렇다고 헬퍼를 쓰자니 projectile을 쓸때와 특징(상대장풍과 상쇄할때 등)이 틀려지

고 등의 문제가 있습니다.

vanity13님의 데미트리가, 초기버전에선 projectile에 p2stateno를 사용함으로써 원작의 특성

을 재현하셨으나, 제글의 영향인지 그 부분을 지워 버리셨습니다. 그래서 원작재현이 좀 안되

게 되었습니다만,

  최근에 방법을 하나 알아내었습니다.


  헬퍼를 쓸때 가장 골치거리가 상대장풍과 닳았을때 어떻게 스파크 안발생하고 그냥 사라지게

하느냐 였습니다.

  우연히 해법을 발견했는데, 방법은


1. 프로젝타일을 헬퍼로 전환하고 이 헬퍼의 anim에는 clsn1만 있고, 프로젝타일에 있던

HITDEF도 만듭니다. hitflag엔 P를 넣지 말고 clsn2 는 빼서 새로운 anim으로 만듭니다. attr은

P형태로 합니다. 예) ATTR = S,SP

(상대장풍을 공격하면 안되므로 hitflag 에 P가 있으면 안되고 anim에 clsn2가 있을경우 상대

장풍공격에 맞으므로 안되고 또 attr은 P 이어야 반격기에 당하지 않기 때문에)

2. 헬퍼에서 1프레임마다 사라지는 프로젝타일(이 프로젝타일의 anim은 위의 clsn2만 따로 만

든 anim으로 합니다, 기존 프로젝타일이었을때의 clsn2 와 같은 범위의)을 1프레임마다 만듭니

다.

(프로젝타일끼리 서로 상쇄될 때는 clsn2 박스가 닳았을때입니다. 따라서 이 프로젝타일은 상대

장풍과의 상쇄용입니다. 1프레임마다 만들고 사라지는 이유는 헬퍼가 사라지면 이 프로젝타일도

없어져야 하기 때문입니다.)

3. 이 프로젝타일이 사라지는지 1프레임마다 검사를 해서 사라질경우 헬퍼도 사라지게 합니다.

검사조건이 프로젝타일 발생부분보다 위에 있어야 하고 TIME > 0 이 들어가야 합니다.

 

이해를 돕기 위해 vanity13님의 현재 데미트리의 스텟 1000을 예로 들겠습니다. 지금 쓰고있는

demitris_type2.cns의 카오스플레어(장풍) 스텟에 다음과 같은 projectile 발생부분이 있습니다.

[State 1000, 2]
type = Projectile
trigger1 = AnimElemTime(9) = 1
projanim = 1006
projhitanim = 1007
offset = 69, -65
projpriority = 1
projsprpriority = 3
projscale = 1, 1
velocity = 2 + Var(10)
attr = S, SP
damage = 75 + (Var(10) * 5), 2 + Var(10)
animtype = Medium
hitflag = MA
guardflag = MA
pausetime = 0,12 + Var(10)
sparkno = S9999
guard.sparkno = S9999
hitsound   = S9999,9
guardsound = S105, 1
ground.type = High
air.animtype  = Back
ground.slidetime = 17
ground.hittime  = 19
guard.ctrltime = 16
ground.velocity = -14.3
guard.velocity = -12
air.velocity = -2.2,-8.8
air.recover = 1
fall = 0
air.fall = 1
fall.recover = 0
yaccel = .48
palfx.time = 46
palfx.add =  -70,-70,-70
ProjID = 1006
;p2stateno = 1010           ;원래 이 줄이 있어야 하지만 vanity13님께서 삭제하셨습니다
                            ;projectile 에 p2stateno를 사용할 경우 버그발생가능성이 있다는
                            ;글 때문인거 같습니다


-AIR 에서 사용하는 애니매이션은 3개입니다

; 장풍
[Begin Action 1006]
Clsn1Default: 1
Clsn1[0] = -26, -15, 12, 15
Clsn2Default: 1
Clsn2[0] = -26, -15, 12, 15
1006, 0, 0, 0, 2, ,
1006, 1, -4, 0, 3, ,
1006, 2, -5, 0, 2, ,
1006, 3, -12, 0, 3, ,
1006, 4, -6, 0, 2, ,
1006, 5, -1, 0, 2, ,

; 장풍(히트 또는 상쇄 또는 사라짐)
[Begin Action 1007]
1007, 0, 7, 0, 3, ,
1007, 1, 7, 0, 2, ,
1007, 2, 7, 0, 3, ,
1007, 3, 7, 0, 2, ,
1007, 4, 7, 0, 3, ,
1007, 5, 7, 0, 3, ,

; 장풍(히트시 효과) - 상대방 몸에 붙는 불을 표현
[Begin Action 1008]
1008, 0, 0, 0, 2, ,
1008, 1, 0, 0, 2, ,
1008, 2, 0, 0, 2, ,
1008, 3, 0, 0, 3, ,
1008, 4, 0, 0, 2, ,
1008, 5, 0, 0, 3, ,
1008, 6, 0, 0, 2, ,
1008, 7, 0, 0, 3, ,
1008, 2, 0, 0, 2, ,
1008, 3, 0, 0, 3, ,
1008, 4, 0, 0, 2, ,
1008, 8, 0, 0, 3, ,
1008, 9, 0, 0, 2, ,
1008, 10, 0, 0, 3, ,
1008, 11, 0, 0, 2, ,

 

--- 먼저 AIR 에서 저 부분들을 다음과 같이 바꿨습니다. * 표시가 바뀐 부분입니다.

; 장풍
[Begin Action 1006]             ; * CLSN2를 빼서 새로운 애니매이션 1066으로 만들었습니다
Clsn1Default: 1                 ; 이 애니매이션 1006 은 헬퍼에 사용됩니다
Clsn1[0] = -26, -15, 12, 15
1006, 0, 0, 0, 2, ,
1006, 1, -4, 0, 3, ,
1006, 2, -5, 0, 2, ,
1006, 3, -12, 0, 3, ,
1006, 4, -6, 0, 2, ,
1006, 5, -1, 0, 2, ,

[Begin Action 1066]             ;* 새로만든 이 애니매이션 1066은 헬퍼에서 만드는, 상대장풍과
Clsn2Default: 1                 ;닳았는지 검사하기 위한 프로젝타일에 사용됩니다.
Clsn2[0] = -26, -15, 12, 15
0,99,0,0,1

[Begin Action 12342]            ;* 새로만든 투명 애니매이션입니다. 헬퍼가 사라질때 필요합니다
0,99,0,0,1                      ;원래 1234로 하려 했지만 hirohiro씨 캐릭터가 제멋대로 anim 1234
                                ;를 사용하므로 12342로 했습니다

; 장풍(히트)
[Begin Action 1007]             ;여기서부턴 안바뀌었습니다
1007, 0, 7, 0, 3, ,
1007, 1, 7, 0, 2, ,
1007, 2, 7, 0, 3, ,
1007, 3, 7, 0, 2, ,
1007, 4, 7, 0, 3, ,
1007, 5, 7, 0, 3, ,


; 장풍(히트시 효과)
[Begin Action 1008]
1008, 0, 0, 0, 2, ,
1008, 1, 0, 0, 2, ,
1008, 2, 0, 0, 2, ,
1008, 3, 0, 0, 3, ,
1008, 4, 0, 0, 2, ,
1008, 5, 0, 0, 3, ,
1008, 6, 0, 0, 2, ,
1008, 7, 0, 0, 3, ,
1008, 2, 0, 0, 2, ,
1008, 3, 0, 0, 3, ,
1008, 4, 0, 0, 2, ,
1008, 8, 0, 0, 3, ,
1008, 9, 0, 0, 2, ,
1008, 10, 0, 0, 3, ,
1008, 11, 0, 0, 2, ,


---이제 CNS의 [STATEDEF 1000] 에서 기존의 PROJECTILE 부분을 다음과 같은 헬퍼로 바꿨습니다.

[State 1300, 5]
type = helper
trigger1 = AnimElemTime(9) = 1
stateno = 1004
id = 1006              ;원래 장풍은 한화면에 2개이상 안나가게 하기 위해 ID가 필요하겠지요
name = "ChaosP"        ;CMD에서 장풍조건에 NUMHELPER(1006) = 0 뭐 이렇게 고쳐야겠습니다.
pos = 69,-61           ;CMD 수정은 설명에 없습니다. 데미트리의 CMD를 보니 많은 트리거가 있는
ownpal = 1             ;데 제작자가 아닌 전 알수 없으므로 각 제작자분들께서 고치셔야 겠네요


-- 헬퍼를 발생시키게 했기 때문에 그 헬퍼에 쓸 스텟들을 다음과 같이 새로 만들었습니다.

;---------------------------------------------------------------------------
; 카오스 플레어 헬퍼
[Statedef 1004]
type    = A
movetype= A
physics = N
poweradd= 110
juggle  = 11
velset = 2+(parent,var(10)),0 ; 장풍 약중강 속도조절 부분입니다. 이건 헬퍼기 때문에
anim = 1006                   ;var(10)값을 쓸땐 parent,var(10)으로 해야합니다
ctrl = 0
sprpriority = 3               ;기존에 있던 장풍 프로젝타일과 같은값입니다

[State 230, 2]         ;음..상대한테 공격이 닳으면 sprpriority 가 1이 되는때가 있는거 같아서
type = sprpriority     ;sprpriority 유지를 위해 넣었습니다
trigger1 = 1
value = 3

[State 4, 1];그림자를 생기지 않게 하기 위해 붙였습니다. 원래 프로젝타일은 그림자가 없으니까요
type = assertspecial
trigger1 = 1
flag = noshadow
ignorehitpause = 1

;카오스 플레어(장풍계열) 히트시 효과 - 맞은상대 몸에 붙는 불
[State -2, fireEffect]; 이건 [statedef -2]부분에 있던걸 가져왔습니다. [statedef -2]부분에 있으면
type = explod         ;2인대전시 맞은 상대보다 다른 상대가 더 가까울경우 오작동의 가능성이 있습
trigger1 = movehit > 0 ;니다. 조건을 자세하게 더해서 오작동의 가능성을 줄였습니다.
trigger1 = numtarget(1006) > 0
trigger1 = target(1006),stateno = p2stateno ; 맞은 상대가 가까이 있는 상대와 같은지 검사
trigger1 = p2movetype = H                   ;하는 부분이 추가되었습니다.
postype = p2
anim = 1008
pos = 0, -1
sprpriority = 2
bindtime = 36
ownpal = 1
ignorehitpause = 1

[State -2, FireSnd] ;히트시 소리. 역시 [statedef -2]에 있는걸 가져왔습니다
type = PlaySnd
trigger1 = movehit > 0 && numtarget(1006) > 0
value = 105, 9

[State 1002, 4]              ;헬퍼를 썼으므로 이렇게 상대스텟을 버그없이 바꾸는게 가능해 졌습니다
type = Targetstate           ;hitdef에 직접 p2stateno를 안쓰는 이유는, 아포칼립스같은 특수캐러한
trigger1 = movehit > 0       ;테도 맞게 하기 위함입니다. 원래 projectile은 p2stateno를 써도 특수
trigger1 = numtarget(1006) > 0 ;캐러한테 공격이 맞지만, hitdef에 p2stateno를 쓰면 안맞기 때문입
value = 1010                   ;니다
id = 1006
ignorehitpause = 1

[State 1300, 5]              ;공격이 상대한테 닳으면 스텟 1006으로 갑니다
type = changestate
trigger1 = movecontact > 0
value = 1006
ignorehitpause = 1

[State 1300, 5]               ;장풍과 닳아 사라지기 전에 상쇄될때 나오는 애니매이션을 표현합니다
type = helper                 ;밑의 destroyself의 첫번째트리거(장풍과상쇄될때)와 조건이 같습니다.
trigger1 = parent,numprojid(1006) = 0
trigger1 = time > 0           ;프로젝타일 발생부분보다 위에 있으므로 time > 0이 들어가야 됩니다.
stateno = 1005                ;헬퍼에서 만든 프로젝타일이라도 본체소유로 인식하므로 앞에 parent,
name = "remove"               ;를 붙여야 합니다.
pos = 0,0
pausemovetime = 9999          ;헬퍼를 쓴 이유는 캐릭크기가 작게 나오는 특수스테이지에서도 크기가
ownpal = 1                    ;작게 나오게 하기 위함 & ownpal=1 사용가능 & pausemovetime = 9999
ignorehitpause = 1            ;사용가능의 이유 때문입니다

[State 1300, 5]               ;이부분이 장풍과 닳으면 없애는 부분입니다(밑의 프로젝타일이 사라졌
type = destroyself            ;을때). 밑의 프로젝타일이 1프레임마다 생기는데 어떻게 검사가 되냐고
trigger1 = parent,numprojid(1006) = 0 && time > 0;물으시면 저도 모르겠습니다. 그냥 이렇게 하니까
trigger2 = frontedgedist < -90    ;되는군요-_-; 중요한건 꼭 밑의 프로젝타일 발생부분보다 위에 있
ignorehitpause = 1                ;어야 먹힌다는 겁니다. 어쨌든 이건 상대장풍과 닳으면 프로젝타
                                ;일 id 1006이 순간 사라지게 되고, 그때 이부분이 작동합니다
                             ;두번째 트리거는 화면을 넘어갔을때 사라지게 하는 것입니다. 그냥
                            ;projectile보다 좋은점은 캐릭크기작은 특수스테이지의 구석에서도 사라
                            ;지지 않고 제대로 끝까지 간다는 겁니다.

[State 1000, 4]           ;clsn2 범위만 있는 프로젝타일입니다. 1프레임마다 사라지며, 매 프레임마
type = Projectile         ;다 만듭니다. 장풍이 있는 위치에 매 프레임 있도록 하는 것입니다.
trigger1 = movecontact = 0;원래 프로젝타일끼리 상쇄될땐 clsn2가 만날때이기 때문입니다
attr = S,SP
projanim = 1066
projid = 1006
offset = 0,0
projremovetime = 1
projedgebound = 210  ;캐릭크기작게나오는 특수스테이지의 구석에 있어도 사라지지 않게 합니다.
projstagebound = 210 ;원래 장풍을 projectile을 쓰면, 이런 특수스테이지의 구석에 가기 전에 사라져
ignorehitpause = 1   ;버리고 그렇다고 이 projedgebound = 210 같을걸 쓰자니 보통스테이지에서 장풍
                     ;이 너무 늦게 사라졌습니다만, 헬퍼를 씀으로서 이것도 가능해졌습니다.

[State 1000, 2]      ;기존 projectile에 있던 정보와 같습니다. 다만 헬퍼이므로 var(10)을
type = hitdef        ;parent,var(10)으로 바꿔야 했습니다
trigger1 = movecontact = 0
attr = S, SP
damage = 75 + (parent,Var(10) * 5), 2 + parent,Var(10)
animtype = Medium
id = 1006                ; 이 공격에 닳은 상대는 타겟 아이디 1006 이 되게 하는 부분입니다
hitflag = MA
guardflag = MA
pausetime = 0,12 + parent,Var(10)
sparkno = S9999
guard.sparkno = S9999
hitsound   = S9999,9
guardsound = S105, 1
ground.type = High
air.animtype  = Back
ground.slidetime = 17
ground.hittime  = 19
guard.ctrltime = 16
ground.velocity = -14.3
guard.velocity = -12
air.velocity = -2.2,-8.8
air.recover = 1
fall = 0
air.fall = 1
fall.recover = 0
yaccel = .48
palfx.time = 46
palfx.add =  -70,-70,-70
;---------------------------------------------------------------------------
; 카오스 플레어 장풍과 상쇄
[Statedef 1005]     ; 그냥 상쇄되는 애니매이션을 표현합니다
type    = A
movetype= A
physics = N
poweradd= 110
juggle  = 11
velset = 0,0
anim = 1007
ctrl = 0
sprpriority = 3

[State 230, 2]       ;sprpriority 유지
type = sprpriority
trigger1 = 1
value = 3

[State 4, 1];그림자 방지
type = assertspecial
trigger1 = 1
flag = noshadow
ignorehitpause = 1

[State 1300, 5]
type = destroyself
trigger1 = animtime = 0
;---------------------------------------------------------------------------
; 카오스 플레어 상대에 닳음
[Statedef 1006]    ;장풍이 상대에게 닳았을때인데...원래 스파크가 발생하면 그 스파크보다 늦게 사라
type    = A        ;지게 해야하고 때문에 cmd도 좀 복잡해질수 있는데, 데미트리는 스파크가 없으므로
movetype= I        ;그냥 사라져도 됩니다; (밑에 추가정보3 참고)
physics = N
poweradd= 110
velset = 0,0
anim = 12342       ;투명애니매이션이 원랜 필요한데 데미트리는 스파크가 없으므로 필요가 없군요
ctrl = 0

[State 1300, 5]    ;역시 상쇄 애니매이션 발생. changestate가 아닌 이유는 이 헬퍼가 빨리 없어져야
type = helper      ;장풍을 또 쏠수 있기 때문입니다. 만약 스파크가 있고 이 헬퍼가 그 스파크 보다
trigger1 = time = 0 ;늦게 사라지게 했다면, cmd가 좀 복잡해질수 있겠습니다
stateno = 1005
name = "remove"
pos = 0,0
pausemovetime = 9999
ownpal = 1

[State 1300, 5]
type = destroyself
trigger1 = time >= 0

---------------------------------------------------------------------
여기까지입니다. 이렇게 함으로써 데미트리 장풍같은게 버그없이 원작재현이 가능하게 되었습니다

이건 데미트리를 예를 든거기 때문에 다른 캐릭터에겐 필요없는 var(10)이라던지 부분도 들어갔습니다.

중요한건 헬퍼는 clsn1만 가지고, clsn2만 가지는 프로젝타일을 1프레임마다생성/없애는 거고. 상대장

풍과 닳으면 이 프로젝타일이 순간 사라지는데, 그때 헬퍼도 없애면 됩니다.

대충 이렇게 되고 세세한 부분은 제작자 분들 마음대로...

이 방법은 제캐릭터 진념의 연옥영파와 주박부에 사용되었습니다.

 


추가로 아는 정보입니다. 원래 알았던것인데 관련이 있어서 쓰겠습니다


1.원래 프로젝타일은 본체의 palfx에 상관없이 색깔이 안변합니다(하지만 윈무겐에선 변합니다. 버그인

듯)ownpal명령이 아예 없습니다.


2.헬퍼에서 프로젝타일을 만들 경우 본체에서 만든것처럼 인식하지만, 이 프로젝타일을 만든 헬퍼가 사

라지면 남은 프로젝타일의 색깔은 본체의 영향을 받습니다. 음..다시말하면 프로젝타일을 만든 헬퍼가

사라진후에 본체가 공격을 받거나 해서 palfx로 인해 색깔이 변할경우, 이미 사라진 헬퍼에서 만든

projectile의 색깔도 변한다는 뜻입니다. 따라서 헬퍼에서 애니매이션이 있는 projectile을 만들경우 그

projectile 보다 늦게 사라지게 할 필요성이 있습니다


3.헬퍼에서 공격을 해서 hitdef에 의해 스파크가 날 경우 헬퍼가 사라지면 남은 스파크의 색깔은 본체의

영향을 받습니다. 위와 같은 특징인데 역시 헬퍼가 히트할경우 히트스파크(또는 가드스파크)보다 늦게

사라지게 할 필요성이 있습니다. 이런게 문제라면 문제군요

 

도움되시길 바랍니다.

추천0

댓글목록 0

등록된 댓글이 없습니다.

개인정보처리방침 이용약관

사이트 정보

Copyright © 무겐 어소시에이션 All rights reserved.
PC 버전으로 보기