こんばんは。
次の日のご飯何にするか考えてたらお腹すいてその日の夜食になったぽりです。
今日はすごく久しぶりにウディタミニテクニック記事。本日はなんだかウディタ使いまくってる方でもなかなか知らない人が多いっぽい機能があったので、緊急講座を行なおうと思います。
けっこうなウディタリアンでもなかなか使ってる人がいないらしいので、
一般のユーザーさんだと使い方はおろか、存在すら知らない人がいるんじゃないかな?
その機能とは、
こいつです。
ビット積とは何か、そしてどう使えばいいかのさわりを紹介したいと思います。
出来るだけ分かりやすく説明しようと思うのですが、今回、
2つだけ前知識として知っていて欲しいことがあります。
予習1.2進数というものがあり、「1=1 , 2=10 , 3=11 , 4=100……」と続いていくこと
予習2.0×0=0 , 1×0=0 , 0×1=0 , 1×1=1であること
以上です。この2つについて思い出してから、↓の「続きを読む」からどうぞ。
まず、ビット積とは何か、これは説明書にも簡単に書いてありますが、2つの数をビット(2進数)に直したとき、各ケタを掛け算した結果が戻ってきます。
例えば
11(2進数で
1011)と
14(2進数で
1110)のビット積を計算したとき、
と計算され、
10が答えになります。
(※普通の掛け算と違い、各ケタを掛け算してることを忘れずに)
計算そのものはどういうものか分かってくれたと思うので、次は実用編。
じゃあ、これが何に役立つの?というと、
ゲームで0と1というと何か心あたりありませんか?
アレです。
スイッチ(フラグ)を処理するのに使います。
例えば、こんな場所があったとします。
そして処理の内容は、
「スイッチ1を押したらボックス1が変わる、スイッチ2を押したらボックス2が変わる……」というものにしたいと思います。
この処理を組む一番簡単な方法は、
◇スイッチ1を押したら変数1に1を代入
↓
◇変数1が1のとき、ボックス1が変わる
◇スイッチ2を押したら変数2に1を代入
↓
◇変数2が1のとき、ボックス2が変わる |
という感じでしょう。もちろんこれでも十分OKですが、
どうせ0~1しか使わないのに変数領域4つも占領するとか無駄な気がしませんか?4つならまだしも、10個とかあったら通常変数のリストもかなり長くなるし大変。
ならばここで役立つのがビット積です。この
4つのスイッチを1つの変数でまかないましょう。
まず、4つのスイッチを上のようにナンバリングします。
(「=」の右は2進数での値です。)
スイッチ処理は、
◇スイッチ1が押されたら
IDである1を変数に
足し算する
◇スイッチ2が押されたら
IDである2を変数に
足し算する
……という感じ。ちなみに5個以上の時はIDは「16→32→64→128→……」と倍々に増えていきます。
さて、
もしここまで正しく処理できたなら、スイッチ1と3だけ押したとき変数には1+4=5が代入されています。さてここからどうやってボックス処理を導き出すのでしょうか。
さて、5というのは2進数で0101です。2進数0001と0100を足し算したのだから当然といえば当然ですが。
このへんで勘の良い方は気づいたでしょうか。1を足せば必ず2進数の一番下は1、足さなければかならず0になります。
ならば
この変数と1のビット積を取れば、
スイッチ1を押した時だけ1、押して無いときは0になるのです!
同様に、
この変数と2(0010)のビット積を取れば、
スイッチ2を押したときだけ2、押して無いときは0になります。
もっと応用すれば、
この変数と6(0110)のビット積をとった場合、
スイッチ2がON、スイッチ3がOFF |
2(0010) |
スイッチ2がOFF、スイッチ3がON |
4(0100) |
スイッチ2も3もON |
6(0110) |
となり、
2つのスイッチの状況を条件分岐1つで分岐させることができます。
ウディタの変数が保存できる最大数というのが
2147483648で、これを2進数に直すと
31ケタになります。つまり、
理論上は1つの変数に最大31個のスイッチを入れることが出来るのです!
さてこのビット積が真に実力を発揮するのは
「汎用性のあるコモンを自作したとき」。
自作で汎用性のあるコモンを作ったとき、それを「コモンイベント呼び出し」で呼び出す必要があります。そして、コモンを呼び出すときにコモンセルフ0~3に設定項目を入力することが出来ます。
ですが、
汎用性があるシステムってのはたまに設定項目4つじゃ足りなくなる時があります。そのときにこれ。
ON/OFF系の設定項目なら31個まで1つの変数に圧縮できるので、設定項目を非常に多くしてもそのまま使える時が来る場合があります。
その他には自作戦闘システムとかにも使えそうです。例えば、
「このアイテムは鎧でもあるけど盾として装備することも出来るんだ!」というアイテムを作りたい時、
武器(右手) |
1(00001) |
武器(左手) |
2(00010) |
盾 |
4(00100) |
鎧 |
8(01000) |
装飾 |
16(10000) |
として保存し、
盾として装備できるかは4とのビット積、鎧として装備できるかは8とのビット積で調べたらどうでしょう。
12(01100)ならば4とのビット積に4を、8とのビット積に8を返すので、盾にも鎧にもなるアイテムの完成です。
さてここまで長々と書きましたビット積。大体どんなものか分かってもらえましたでしょうか。
ですが見てくださった方にはとある大事なお知らせがあるのです。
ここまで書いたとおり、
ビット積はあると便利ですが、ビット積が無いと作れない処理というものは実はありません。一番最初のスイッチ処理もただ単に変数4個使えばビット積なしで作れますし、それ以外のも個数分変数を用意して、個数分条件分岐すれば普通に処理することが出来ます。
ビット積はあくまでラクするための機能なのです。だからこそこんなに知名度が低い機能になってしまったのですが。
ですがちゃんと覚えたらラク出来る処理がいっぱいあるのは事実です。
ゲーム製作に余裕が出てきたら勉強してみるのも一手です。
※追記:「動画再生コモン」にビット積を使って実際に「コモンイベント呼び出し」時に6つの設定項目を変数1個で処理させる部分があります。興味があったら解析してみてはどうでしょう。PR