戻る→SC-/ProjectileHelper技術
長らく放置していたので暫定的にページ作成。※未検証部分多数

■更新Proj型・Projectile更新方式飛び道具

SC-/Projectileを1Fずつ更新する方式の飛び道具。
短い通称は無いがここでは更新Proj、もしくは2FProjと称する。
基本的にはHelperから使う。
毎F更新するためProjectileの欠点である更新できない点は解消できる。

基本的な原理
1.1Fだけ判定を持った2Fだけ残るProjを射出する。(基本Helperから)
2.そのProjが残っている場合、Projを再発射しつづける。
以下詳しく
  • 攻撃判定開始のタイミングで最初の1Fだけ判定をもったSC-/Projectileを射出する。
    • アニメ定義では最初の1Fに攻撃判定があれば良い。
    • その際ProjRemovetime=1とする。これにより次のフレームまで残る。
    • PauseTimeの自分側は0とする?
    • ※ProjRemoveTimeでの消滅は残り時間が無くなった次のフレームの最後のため
      ProjRemoveTime=1設定ならステート内換算で2F分残る。
    • ※攻撃の判定はProjRemoveTimeで指定した時間分のみ。
  • 次のフレームで射出したProjが残存している場合、再度Projを発射する
    • 命中すると、命中フレーム時点で消滅するため更新も終わる。
  • Projの消滅を確認後、親の動作を終了(Helperなら消滅させる)
攻撃判定のみならoffset=(vel X),(Vel Y)で速度分位置補正だけする。
独立飛び道具ならOffsetを更新ごとに調整し、飛んでいるように見せる。
  • 独立飛び道具型で表示をOwnPal=0にしたい場合はSC-/Explodを同じ座標へ重ねる。
    • Explodを重ねると命中消滅は1F遅れるが、それは通常のHelper型飛び道具と同様。

主な利用方法
攻撃判定をProjにし、SC-/ReversalDefを無効化する。
  • アニメには最初のフレームに判定だけつけ画像は基本的につけない。
  • 基本的にSC-/Helperの飛び道具の基本と組み合わせて使う。
    • Targetが本体管理になるためヒットカウントリセットバグが起きない。
    • Juggleの管理も本体基準のためJuggle値での制限が可能になる?
  • 本体へPauseTimeが適応できないため、本体での使用は特殊な場合に限る。
  • 別々の相手への時間差の複数ヒットが管理できない。
    • 一段型の飛び道具なら問題ないが連続ヒットタイプでは若干挙動が違う。
SC-/HelperからProjの座標を管理し単一のHelperで大量の飛び道具を管理する。
  • アニメには判定と画像を付ける。画像をExplod化するなら画像は別アニメに。
  • 攻撃判定Proj化と同じメリットがある。
  • Helperから管理することでProjのみではできない挙動を行わせる事が可能。
  • SC-/Helperには固定の上限数があるがProjはいくらでも増やせる。
    • これにより大量の特殊な挙動をする飛び道具を実現できる。
  • 特殊な管理にすれば常駐させたHelperを使い回すこともできる。

注意点
SC-/Projectileなどの注意点も参照。
  • Projectileの向きは進行方向向き固定なので向きの管理には注意
  • Proj,ExplodはSC-/AngleSetのように回転させることができない。
    • 回転させたいなら回転用のアニメを別途登録する必要がある。
  • SC-/HitDefSC-/Projectileでは一部ヒットの管理が異なる。
    • HitDefでは時間を置いても一回の指定で複数の相手へヒットするが、
    • Projでは指定回数分しかヒットせず、
      時間を置いてヒットしていない相手にヒットさせることは通常できない。
  • SC-/PauseSC-/SuperPauseの効果中は本体が動けない場合Projも動かない。
    • Helperとの連動も考慮してPauseMoveTimeなどの設定は基本0が望ましい。

後なんだろ…


■射出条件記述について

※記述については検証不足。ミスあるかも※
※[State ]ステコン宣言を抜いています。コピペ時には要注意※

ProjIDについて
Projを再射出する際root,NumProjID(xxx)=1で判定を行うため、
他管理のProjとIDが重複してしまうと上手く処理を行うことができない。
  • 全て本体管理のため別々のHelperからでもProjIDが同じだと重複してしまう。
  • ProjIDは重複することが無いよう(xx00+ID)などで管理すること。
  • 単一Helperから複数Projを出す場合は、xx00のxx桁部分で区別する。
  • なおT-/IDの値は上限がほぼ無いため+100や+200と言った数値になる可能性もある。
    • そうした高い数値になっても重複しないように気をつけること
    • 本体などから固定のProjIDで射出するProjのProjIDは
      IDを足して使うProjIDよりも低い数値にすること。
    • どうしても高い数値にしたいときは十万台くらいから。

■HitDef攻撃判定差し替え型飛び道具


■Helperの攻撃判定差し替え用・HitDef→Projへの差し替え
type=HitDefをtype=Projectileにするというタイプの例
画像はHelper側で表示し、Projのアニメは攻撃判定のみにすること
PauseTimeの自分側は0に変えること
ヒットポーズの動作停止を再現したい場合T-/ProjContactTime()の条件で
基本処理を止め、SC-/PosFreezeを実行するなど自前で処理を停止させると良い。

;出来れば入れておいた方がいいパラメータ
ProjEdgeBound = 10000 ;画面外射程・基本親Helper側で管理するので大きい数値に
ProjHeightBound = -10000,10000 ;画面上下射程
ProjStageBound = 10000 ;ステージ外射程
なおSC-/HitDefを使わないため、T-/MoveTypeをAにする必要は無いが
慣例として攻撃HelperはT-/MoveTypeはAである方が望ましい。

■単発・時間経過消滅タイプ

Type = Projectile ; HitDef
Trigger1 = !Time ;射出開始
Trigger1 = Root,NumProjID(1200 + ID) = 0; 重複を防ぐ
Trigger2 = Time < 180 ;再射出終了タイミング
Trigger2 = Root,NumProjID(1200 + ID) = 1; 再射出
ProjID = 1200 + ID ;★ ProjID
PosType = P1 ;射出位置
Offset = (Vel X),(Vel Y) ;速度補正
ProjAnim = 1201 ;★攻撃判定表示用アニメ
ProjRemoveTime = 1 ;固定
; HitDef用のパラメーターも含めて記述する。

■多段型・時間更新タイプ
;PauseTimeを再現したい場合は他のステコンへ処理停止記述を入れる事。

Type = Projectile ; HitDef
Trigger1 = ( AnimElem = 2 ) || ( AnimElem = 7 ) || ( AnimElem = 12 );射出タイミング・再射出タイミング
Trigger1 = Root,NumProjID(1300 + ID) = 0; 重複を防ぐ
Trigger2 = Root,NumProjID(1300 + ID) = 1; 再射出
ProjID = 1300 + ID ;★ProjID
PosType = P1 ;射出位置
Offset = (Vel X),(Vel Y) ;速度補正
ProjAnim = 1301 ;★攻撃判定表示用アニメ
ProjRemoveTime = 1 ;固定
; HitDef用のパラメーターも含めて記述する。

■多段型・ヒット数タイプ ※var必須
;PauseTimeを再現したい場合は他のステコンへ処理停止記述を入れる事。

Type = Projectile ; HitDef
Trigger1 = !Time || Root,ProjContactTime(1400 + ID) > 15 && Var(50) < 3 ;ヒット後15F再射出停止
Trigger1 = Root,NumProjID(1400 + ID) = 0; 重複を防ぐ
Trigger2 = Root,NumProjID(1400 + ID) = 1; 再射出
Trigger3 = Root,ProjContactTime(1400 + ID) = 1 ;命中直後
Trigger3 = var(50) := var(50) + 1 ;ヒットをカウント
trigger3 = 0 ;射出はしない。
ProjID = 1400 + ID ;★ ProjID
PosType = P1 ;射出位置
Offset = (Vel X),(Vel Y) ;速度補正
ProjAnim = 1401 ;★攻撃判定表示用アニメ
ProjRemoveTime = 1 ;固定
; HitDef用のパラメーターも含めて記述する。


■応用・Helper固定式・更新Proj型飛び道具


■Helper固定してProjectileを射出する方式
Helperから射出座標の方を動かして飛び道具を飛ばすタイプの例
Helperを基準位置として座標をしていするのでHelperは動かさない
※Helperの射出位置も考えて記述を組んでいくこと。
Helperの画像は消して、ProjもしくはExplodで画像を表示する
※画像をアニメーションさせたい場合は、Anim定義を複数用意して、
 射出のAnim指定で制御を行うこと。その場合Explodの方が望ましい。
HelperのPauseMoveTime,SuperMovetimeは0にしておいた方が良い
Varを利用するとより柔軟に射出座標をコントロールできる。
Varを管理する場合は「:=代入」を利用してProjの条件式内で記述をしたい。
なるべくProj更新のタイミングでVar代入をすると、処理を安定させやすい、はず。
ヒットポーズの動作停止を再現したい場合T-/ProjContactTime()の条件で
Projの処理を停止するようにすること。
また停止中はProjが消えるためExplodで停止中の画像を表示する必要がある。
※Projの「向き」は速度に合わせて勝手に切り替わってしまう。
 速度が可変するタイプを制御するならExplodの方が向きを調整しやすい。
  • 固定した親Helperからは複数の更新Projを出すことができる。
    • Projを増やせばHelperの上限数を超える数の特殊な飛び道具を扱うこともできる。

消失タイミングについて
HitDef代替型はHelperでの消失管理になるがコチラは微妙に異なる。
Helperの位置は変わらないためProjの位置によって消去したい場合は、

ProjEdgeBound = 40 ;画面外射程・カメラの外側に出ると消える。
ProjHeightBound = -10000,10000 ;画面上下射程
ProjStageBound = 10000 ;ステージ外射程
ProjEdgeBoundなどで消滅処理をさせると良い、はず。
時間で消滅させたい場合はVarで時間を数えて消滅させる感じ。
  • 親となるHelperは、そうしたProjなどが全て消えた後に消滅させる。

■Helper固定型・時間var×速度タイプ・時限消滅

Type = Projectile ; HitDef
Trigger1 = !Time ;射出開始
Trigger1 = Root,NumProjID(1500 + ID) = 0; 重複を防ぐ
Trigger1 = 1 || var(50) := 1 ;Varリセット
; ★ 射出時に初期パラメータを設定する
Trigger2 = var(50) < 180 ;再射出終了タイミング
Trigger2 = Root,NumProjID(1500 + ID) = 1; 再射出
Trigger2 = 1 || var(50) := var(50)+1 ;カウントVar
; ★ 再射出時にパラメータを調整する
ProjID = 1500 + ID ;★ ProjID
PosType = P1 ;射出位置
Offset = var(50)*(3.0), 0 ;★射出位置・時間×速度
ProjAnim = 1201 ;★攻撃判定表示用アニメ
ProjRemoveTime = 1 ;固定
; HitDef用のパラメーターも含めて記述する。
; 必要であればRoot,NumProjID(1500 + ID)>0条件にExplodを射出する。

■Helper固定型・座標fvarタイプ・カメラ外消滅

Type = Projectile ; HitDef
Trigger1 = !Time ;射出開始
Trigger1 = Root,NumProjID(1600 + ID) = 0; 重複を防ぐ
Trigger1 = 1 || fvar(30) := 0 ;Varリセット
Trigger1 = 1 || fvar(31) := 0 ;Varリセット
; ★ 射出時に初期パラメータを設定する
Trigger2 = time < 600 ;再射出終了タイミング
Trigger2 = Root,NumProjID(1600 + ID) = 1; 再射出
Trigger2 = 1 || fvar(30) := fvar(30) + 0.1 + (Time*0.01)*(Time>60) ;一秒後加速
Trigger2 = 1 || fvar(31) := fvar(31) + 0.5*(time>60)*ifelse(P2dist Y-45>0 ,1,-1);一秒後上下微追尾
; ★ 再射出時にパラメータを調整する
ProjID = 1600 + ID ;★ ProjID
PosType = P1 ;射出位置
Offset = fvar(30), fvar(41) ;★射出位置・fvar
ProjAnim = 1201 ;★攻撃判定表示用アニメ
ProjRemoveTime = 1 ;固定
ProjEdgeBound = 40 ;画面外射程・カメラの外側に出ると消える。
ProjHeightBound = -10000,10000 ;画面上下射程
; HitDef用のパラメーターも含めて記述する。
; 必要であればRoot,NumProjID(1600 + ID)>0条件にExplodを射出する。

■Helper固定型・時間×速度タイプ・複数複合型

;▼1つ目
Type = Projectile ; HitDef
Trigger1 = !Time ;射出開始
Trigger1 = Root,NumProjID(1600 + ID) = 0; 重複を防ぐ
Trigger2 = Time < 240 ;再射出終了タイミング
Trigger2 = Root,NumProjID(1600 + ID) = 1; 再射出
ProjID = 1600 + ID ;★ ProjID
PosType = P1 ;射出位置
Offset = (Time)*(2.5), 0 ;★射出位置・時間×速度
ProjAnim = 1201 ;★攻撃判定表示用アニメ
ProjRemoveTime = 1 ;固定
; HitDef用のパラメーターも含めて記述する。必要ならExplod。
;~
;▼2つ目
Type = Projectile ; HitDef
Trigger1 = Time=30 ;射出開始
Trigger1 = Root,NumProjID(1700 + ID) = 0; 重複を防ぐ
Trigger2 = Time-30 < 240 ;再射出終了タイミング
Trigger2 = Root,NumProjID(1700 + ID) = 1; 再射出
ProjID = 1700 + ID ;★ ProjID
PosType = P1 ;射出位置
Offset = (Time-30)*(3), -10 ;★射出位置・時間×速度
ProjAnim = 1201 ;★攻撃判定表示用アニメ
ProjRemoveTime = 1 ;固定
; HitDef用のパラメーターも含めて記述する。必要ならExplod。
;~
;▼3つ目
Type = Projectile ; HitDef
Trigger1 = Time=60 ;射出開始
Trigger1 = Root,NumProjID(1800 + ID) = 0; 重複を防ぐ
Trigger2 = Time-60 < 240 ;再射出終了タイミング
Trigger2 = Root,NumProjID(1800 + ID) = 1; 再射出
ProjID = 1800 + ID ;★ ProjID
PosType = P1 ;射出位置
Offset = (Time-60)*(3.5), -20 ;★射出位置・時間×速度
ProjAnim = 1201 ;★攻撃判定表示用アニメ
ProjRemoveTime = 1 ;固定
; HitDef用のパラメーターも含めて記述する。必要ならExplod。
;~

■その他応用について
  • 特に大量のProjを扱う場合はループステートを組むことをおすすめする。
    • うまく制御すればProj記述自体は1つでも大量の更新Projを扱うこともできる。
  • 細かい部分を調整することで特殊な性質を加味できる。
    • 例えば一定条件でProjAnimを変更し攻撃判定を消すなど。
    • fvar式の例ではProjでありながら特殊な挙動をする飛び道具となっている。
  • 命中しても消滅せず通り過ぎるという性質の更新Projを作る場合は
    Explodで画像を表示を管理し、Explodの条件にProjの状況を入れなければ良い。
  • 基本は【技に合わせてhelperを出して更新Projを出す】という管理だが
    細かく飛び道具=Helperを出すというタイプのキャラでは
    「Helperの上限を気にせず」という性質は活かせない。
    • その場合は更新Projの親を常駐Helperにし、
      本体が飛び道具を出す際に本体座標などをVarに記録し、
      そのデータを元に更新Projを発射すれば
      細かく大量の飛び道具を出すキャラも一応可能。
    • ただしVarの記録可能数を超えると新しいHelperが必要になり、
      ブッキングしないよう管理はより複雑かつ面倒になるが。


AI技術関係について


■HelperのHitDefをProjへ差し替えた場合の反応用条件記述について
Helper+HitDefr型である場合Helper,MoveContactなどで管理できるが、
Projの場合はT-/ProjContact,T-/ProjContactTime()で管理することになる。
ただしHelperのIDが分からない場合、ProjIDを指定できないため、
  • ProjContactime( Helper(xxx),ID+xxx ) = [0,15] ;リダイレクト入りProjID指定
ProjIDを指定したい場合はこうした工夫をすることになるが、
リダイレクトではHelperが消えると使えないためVarで管理することになる。
  • 案.VarへHelperIDを入れておく方式
    • 発射時にHelperからIDをSC-/ParentVarSetしする。
    • ProjContactime( var(xxx)+xxx ) = [0,15] ;VarでProjID指定
    • ヒット情報を正確に認識できるが、同種複数の飛び道具の管理が困難となる。
  • 案.ヒットした情報をVarへ入れる方式
    • Projの攻撃がヒットした時点でSC-/ParentVarSetで情報を伝達する。
    • 伝達する情報は「ヒットフラグ(要リセット)」が基本だが他にも
    • 硬直の持続時間を入れて、本体で毎F-1ずつ減らす猶予カウント型なども可能。
なお細かいヒットを確認する必要がないのであれば
ProjContactime(0)=[0,10]などで一括判定してしまうことも可能。
ただ例では16Fまでと指定しているが、実際の硬直時間は
T-/GetHitVar()で確認するほうが確実。