proj化攻撃をhitdefみたいに by lunatic 正直pauseしたらいいんだけどそれだと止まってはいけないものまで止まってしまう。なので変数を大量に使用していろいろ実験してみた。 とりあえず実例を挙げて説明してみる。 KFMの空中弱パンチ [Statedef 600] type = A movetype= A physics = A poweradd= 11 ctrl = 0 anim = 600 sprpriority = 2 ;var(6) ガード判定 ;var(7) ヒットした攻撃の種類判定(多段攻撃用) ;var(8) ヒット判定 ;var(9) hitpausetime残量 ;fvar(0) pause終了後の速度設定のためにX軸方向の速度を記憶 ;fvar(1) pause終了後の速度設定のためにY軸方向の速度を記憶 [State 600, 1] type = PlaySnd trigger1 = Time = 1 value = 0, 0 [State ] type = varrangeset trigger1 = time = 0 value = 0; 開始時にリセット first = 6 last = 9 [State 6] Type = Explod; ヒットエフェクト trigger1 = projhittime(10600) = 0; ヒット時のみ。guard.sparknoのある場合は個別に対応。 Anim = F0; fightfx.airのanim使用。F(sparkno)でおk。無記名はF2。 Pos = -10, -58; sparkxyの値。 PosType = p2; 敵側基準 OwnPal = 1; palfxの影響なし sprpriority = 10; 実際はどうなのかよくわからん。とりあえず一番上に表示。 persistent = 0; 一度だけ。多段ヒットの場合ヒット数分ステコン追加。 [State 6] Type = Explod; ガードエフェクト trigger1 = projguardedtime(10600) = 0; ガード時のみ。 Anim = F40; fightfx.airのanim使用。 Pos = -10, -58; sparkxyの値。 PosType = p2; 敵側基準 OwnPal = 1; palfxの影響なし sprpriority = 10; 実際はどうなのかよくわからん。とりあえず一番上に表示。 persistent = 0; 一度だけ。多段ヒットの場合ヒット数分ステコン追加。 [State ] type = varset trigger1 = projcontacttime(10600) = 0 fvar(0) = vel x; pause終了後の速度設定のために記憶 [State ] type = varset trigger1 = projcontacttime(10600) = 0 fvar(1) = vel y; pause終了後の速度設定のために記憶 [State ] type = varadd trigger1 = 0;projcontacttime(10600) = 0 trigger1 = enemynear,backedgebodydist < 10 || enemynear,frontedgebodydist < 10 fvar(0) = -4; 画面端擬似押し戻し判定(地上のみ)。 ; hitdefのground.velocityのxの値。 [State ] type = varset trigger1 = projguardedtime(10600) = 0 var(6) = 1; ガード判定 [State ] type = varset trigger1 = projcontacttime(10600) = 0 var(7) = 1; 多段攻撃だった場合は当たった攻撃は何かを判断する為に ; varaddにすることでどの攻撃があたり、外れたかがわかる。 [State ] type = varset trigger1 = projcontacttime(10600) = 0 var(8) = stateno; 攻撃hit確認&hitした時のステート記憶 [State ] type = varset trigger1 = projcontacttime(10600) = 0 var(9) = 7;+(var(6)=1)*α; pausetimeが切れるタイミング確認の為 ; α=ガードと通常時のpausetime差分 [State ] type = changeanim; pausetimeでanimも止める。 trigger1 = var(7) = 1; 多段攻撃の場合var(7)で止める時間を判断。 trigger1 = 21 - time > 0; 21というのはanimelem=2の終わるtime+7(hitpausetime) value = Anim; ガード判定は21 - time +(var(6)=1)*α > 0て感じに。 elem = 2+(21-time = 0);        攻撃のanimelemを表示。最後だけ次のelemに進める ; 多段攻撃の場合var(7)で分ける [State ] type = velset trigger1 = var(7) trigger1 = var(9) x = 0; pausetimeで停止する y = 0 [State ] type = velset trigger1 = var(7) trigger1 = var(9) = 0; pause終了判定 x = fvar(0); pause終了後の速度設定 y = fvar(1) persistent = 0; 一度だけ [State 600, 2] type = projectile trigger1 = var(7) = 0; 攻撃はhitしてない trigger1 = animelem = 2; hitdef開始タイミング projid = 10600 projanim = 10600+(vel x < 0); vel x < 0で反転画像に projremove = 1 projremovetime = 11; hitdefの攻撃時間に合わせる velocity = vel x, vel y; 自分の速度に合わせる。ただしvel x < 0だと勝手に ; turnするという素敵仕様があるので反転画像用意して無いなら ; (vel x)*(vel x > 0),vel yとして反転しないように accel = 0, const(Movement.yaccel); 加速度設定 attr = A, NA damage = 20 guardflag = HA priority = 3 pausetime = 7,8 sparkno = -1 guard.sparkno = -1; projだとずれるので。導入したいならexplodのステコンで。 sparkxy = -10,-58 hitsound = 5,0 guardsound = 6,0 ground.type = High ground.slidetime = 5 ground.hittime = 5 ground.velocity = -4+8*(vel x < 0); vel x < 0だと反転してるので正負反転 air.velocity = -1.3+1.3*(vel x < 0),-3;vel x < 0だと反転してるので正負反転 [State 600, 3] type = CtrlSet trigger1 = Time = 17+7*(var(8)>0); 攻撃hitしたらhitpausetime分だけ終了を延ばす value = 1; トリガーがanimtime=0なら特に問題は無い。 ; ガード判定するなら(7+(var(6)=1)*α)*(var(8)>0)と AIとコマンドの上で [State ] type = varset triggerall = !ishelper trigger1 = stateno != ;コンボ可能なステート列挙 trigger1 = stateno != ;コンボ可能なステート列挙 ;trigger2 = palno != ;念のためproj化してないpalnoを var(8) = 0 [State ] type = varadd triggerall = !ishelper trigger1 = var(9) > 0 var(9) = -1; pausetime残量減少。−1以外にAIがあるキャラはAIの上だけに記述、 ; もしくはAIスイッチをトリガーに加える。 で、AIやコマンドのトリガーを trigger x = stateno = n && movecontact から trigger x = var(8) = n && !var(9) て感じに。 注意点としては例えばもともとのトリガーがtime > tとかだとずれてしまうのでt+7*(var(8)>0)とかいう感じに修正すること。 airファイル [Begin Action 600]; 元のanim Clsn2Default: 2 Clsn2[0] = -11,-72, 16,-27 Clsn2[1] = -5,-87, 8,-72 600,0, 0,0, 3 Clsn1: 2 Clsn1[0] = 15,-70, 31,-60 Clsn1[1] = 49,-54, 29,-65 Clsn2: 4 Clsn2[0] = -13,-72, 17,-27 Clsn2[1] = 0,-87, 12,-71 Clsn2[2] = 15,-70, 31,-60 Clsn2[3] = 49,-54, 29,-65 600,1, 0,0, 11 Clsn2: 4 Clsn2[0] = -13,-72, 17,-27 Clsn2[1] = 0,-87, 12,-71 Clsn2[2] = 15,-70, 31,-60 Clsn2[3] = 49,-54, 29,-65 600,1, 0,0, 4 600,0, 0,0, -1 [Begin Action 10600]; proj用anim Clsn1: 2 Clsn1[0] = 15,-70, 31,-60 Clsn1[1] = 49,-54, 29,-65 -1,0, 0,0, 11 [Begin Action 10601]; proj用反転anim Clsn1: 2 Clsn1[0] = -15,-70, -31,-60 Clsn1[1] = -49,-54, -29,-65 -1,0, 0,0, 11