紙竜製作「コンボへの道2: コマンド共通化(後編)」
いよいよ後編ではコマンド共通化を搭載します。
ちなみに「コマンド共通化」とは、
前編で学んだvar()を32個のスイッチ化する方法を使って、
commandのON/OFFを変数化しちゃう技術です。
[State ,弱攻撃]
type = ChangeState
triggerAll = command = "a"
trigger1 = ctrl
trigger2 = Time>9 && Stateno =200
value = 200 ;弱パンチステート
これを・・・・
triggerAll = command = "a"
↓ ↓ ↓
triggerAll = (var(0)&(2**0)) ;"a"
見てのとおり分かりづらくなるし、
記述追加による手間が増えるデメリットがあります。
ではなぜ搭載するのかといえば・・・・
commandは記述側で制御できないのに対して、変数は記述側で制御できるから。
つまり、今後のAI搭載時に記述(AI)側で擬似的にコマンドを作れるので、
プレイヤー操作時とAI操作時でChangeStateを統一させるのが狙いです。
作り方としてはまずコマンド用変数を1つ用意して、
毎F常時監視の-2ステートで、0を代入してでリセットします。
(Commandが32個以上あるなら第2第3の変数を用意)
var(2) = 0
次に-1の先頭で、
[State ,コマンド決定]
type = NULL
triggerAll = var(0)=-1 ;AIがOFF
trigger1 = 1 || var(2):= (var(2) | (2**0)*(command = "holdup"))
trigger1 = 1 || var(2):= (var(2) | (2**1)*(command = "holddown"))
trigger1 = 1 || var(2):= (var(2) | (2**2)*(command = "holdfwd"))
.....略
と、commandをすべて変数化してあげればプレイヤー操作時はOK.
(AI時は前編のONにする要領で使うビットだけONして制御する)
後は全部のcommandを変数方式に置き換えれば、コマンド共通化は終わりですね。
補足として、数値として帰ってくるので、
Vel X= 5.0*(var(0)&(2**7)) ;(5.0・・・・ではなく 5*128=640になる)
と、いつもの癖でうっかり判定式として使うと酷いことになるので注意。
ちなみに上の場合はこうすればOK、
Vel X= 5.0*(!!(var(0)&(2**7)))
後・・・・・、前編でバグがあるから ceil(2.0**0)を使った方がといいつつ、
何で(2**0)を使っているのかですが・・・・。
バグと言っても位置が逆転してるだけなので、
こうやってスイッチ目的だけで使用する場合は何も問題ないんですよ。
(内部的に位置が入れ替わっても、記述で書く時はXはXなので)
計算式として使う場合には、32のはずが64が帰ってきて狂ったりするけど、
そのイメージが根付いて(2**X)は使えないって印象が広まってるのかな?
(つまり、複数のスイッチを同時に見る際にうっかり数字でやるとバグる事あるので注意)
○ var(0)&((2**5)|(2**7))
× var(0)&160
ちなみに「コマンド共通化」とは、
前編で学んだvar()を32個のスイッチ化する方法を使って、
commandのON/OFFを変数化しちゃう技術です。
[State ,弱攻撃]
type = ChangeState
triggerAll = command = "a"
trigger1 = ctrl
trigger2 = Time>9 && Stateno =200
value = 200 ;弱パンチステート
これを・・・・
triggerAll = command = "a"
↓ ↓ ↓
triggerAll = (var(0)&(2**0)) ;"a"
見てのとおり分かりづらくなるし、
記述追加による手間が増えるデメリットがあります。
ではなぜ搭載するのかといえば・・・・
commandは記述側で制御できないのに対して、変数は記述側で制御できるから。
つまり、今後のAI搭載時に記述(AI)側で擬似的にコマンドを作れるので、
プレイヤー操作時とAI操作時でChangeStateを統一させるのが狙いです。
作り方としてはまずコマンド用変数を1つ用意して、
毎F常時監視の-2ステートで、0を代入してでリセットします。
(Commandが32個以上あるなら第2第3の変数を用意)
var(2) = 0
次に-1の先頭で、
[State ,コマンド決定]
type = NULL
triggerAll = var(0)=-1 ;AIがOFF
trigger1 = 1 || var(2):= (var(2) | (2**0)*(command = "holdup"))
trigger1 = 1 || var(2):= (var(2) | (2**1)*(command = "holddown"))
trigger1 = 1 || var(2):= (var(2) | (2**2)*(command = "holdfwd"))
.....略
と、commandをすべて変数化してあげればプレイヤー操作時はOK.
(AI時は前編のONにする要領で使うビットだけONして制御する)
後は全部のcommandを変数方式に置き換えれば、コマンド共通化は終わりですね。
補足として、数値として帰ってくるので、
Vel X= 5.0*(var(0)&(2**7)) ;(5.0・・・・ではなく 5*128=640になる)
と、いつもの癖でうっかり判定式として使うと酷いことになるので注意。
ちなみに上の場合はこうすればOK、
Vel X= 5.0*(!!(var(0)&(2**7)))
後・・・・・、前編でバグがあるから ceil(2.0**0)を使った方がといいつつ、
何で(2**0)を使っているのかですが・・・・。
バグと言っても位置が逆転してるだけなので、
こうやってスイッチ目的だけで使用する場合は何も問題ないんですよ。
(内部的に位置が入れ替わっても、記述で書く時はXはXなので)
計算式として使う場合には、32のはずが64が帰ってきて狂ったりするけど、
そのイメージが根付いて(2**X)は使えないって印象が広まってるのかな?
(つまり、複数のスイッチを同時に見る際にうっかり数字でやるとバグる事あるので注意)
○ var(0)&((2**5)|(2**7))
× var(0)&160
- 関連記事
-
- 紙竜製作「パワーが足りないなら回転して2倍のパワーに・・・ry」 2012/02/20
- 紙竜製作「22Aは低空飛行突撃」 2012/03/18
- 紙竜製作「おめでとう、センリュウはハクリュウに進化した」 2012/03/27
- 紙竜、ポイズンブレスが1.5倍でお得 2014/06/14
- 紙竜、ミールの修正 + ゲージ技の追加検討 2014/06/15