ビットを駆使したイベント作り

ウディタ講座&テクニック「ビットを使いこなす編」第3回

実際のイベント作りに、ビットをどのように使うのかを解説します。

ビットを使いこなせるようになると、1つのイベントに使用する変数の数を 大幅に節約できます。

今回の解説では、実際にビットを使ったイベント作りの例を交えながら、その使い方を解説していこうと思います。

ただ、ここまでで解説した内容を理解していないと なかなか難しい内容になると思いますので、必要に応じて過去の解説記事を読んでくださいね。

2進数とビットの理解度チェック


10進数と2進数の変換は出来る?(時間がかかってもいいし、電卓を使ってもOK)
……Noならこちらの記事を読んでください。

■変数操作: V0[ビット管理用変数] = 27 + 0 ■条件分岐(変数): 【1】 V0[ビット管理用変数] が 5 のビットを満たす -◇分岐: 【1】 [ V0[ビット管理用変数] が 5 のビットを満たす ]の場合↓ |▼ 10進数での「27」は 5 のビットを満たす? |■ ◇分岐終了◇

上記コードの、10進数での「27」は5のビットを満たすかを 自信を持って答えられる?
……Noならこちらの記事を読んでください。

■変数操作: V0[ビット管理用変数] -= V0[ビット管理用変数] 論理積 8 ■変数操作: V0[ビット管理用変数] += 8 + 0

上記コードの処理が、何の目的で行われたのかが分かる?
……Noならこちらの記事を読んでください。


すべてにYesと答えられたら 次へ進みましょう!

実際にビットを使ってみる

今回、例にするイベントの概要は以下の通りです。

【設定1】勇者として旅をしている主人公は、現在 とある村にいる。ここの村人の話を聞いて、次の目的地である『幻の街』の所在を突き止めなければならない。

【設定2】このEvに関わるNPCは、村人A~D・村長の孫・村長の6人とする。
村人A~D:幻の街の所在は、噂程度にしか知らない。
村長の孫:出かけている村長が帰ってくるのを待ってるだけ。
村長:幻の街の所在を知っているが、Ev開始時点では村にいない。

【イベントの流れ】

  • 村人A~D全員に話しかけると、村長の孫のセリフが変化する。

  • セリフ変化後の 孫に話しかけることで村長帰宅のフラグが立つ。

  • 村長に話しかけることで 幻の街の所在が明らかになる。

文字ベースの解説なので、もし分かりにくかったらスミマセン。

以上のイベントを、ビットを駆使して作ってみます。このイベントの処理を実現するために、変数が何個必要になるかを考えながら見ていくといいでしょう。

STEP1.ビットの管理用変数を用意する

まず、このイベントのためのビット管理用変数を最低1つ用意する必要がありますね。ビットを使うのですから まぁ当然です。

■変数操作: V1-0[Ev:幻の街はどこ?bit] = 0 + 0

今回は 予備変数1の0番を使うことにしました。ビットを管理する変数には、分かりやすく名前を付けておきます。

この変数を 間違えて10進数として扱ってしまうと、繰り上がり等によってEvの処理がメチャクチャになってしまいますので、これでもかというくらい分かりやすい名前にしてください。

STEP2.各ビットに役割を与える

次に、ビット管理用変数の各ビットに あらかじめ役割を与えておきます。

ここでいう役割とは、何の情報を担当するのか?ということです。

与えた役割を忘れてしまうと面倒なので、自分が分かりやすいようにメモを取っておきましょう。

ビットに役割を与える
ビット役割
1のビット村人Aに話しかけた
2のビット村人Bに話しかけた
4のビット村人Cに話しかけた
8のビット村人Dに話しかけた
16のビット村長が帰ってきた
32のビット幻の街の所在が明らかになった

ビットに与えることが出来る役割は、0か1かで表すことが出来る情報だけです。

なぜなら、各ビットの状態は必ず 0(Off/満たしていない)もしくは 1(On/満たしている)になるので、2以上の数値を必要とする情報を扱えないためです。

今回各ビットに与えた役割を見てもらえるとわかると思いますが、すべて Yes(1) か No(0)で判断できる情報ですよね?

なので 例えば「話しかけた回数」みたいなものは、ビットの役割として与えることは出来ません。

STEP3.イベントに応じて ビットのOn/Offを切り替える

以上の準備が出来たら、各NPCイベントに ビットコントロールを含む処理を設定していきます。

とりあえず、村人A~Dにざっくりとした処理を作りましょう。

村人Aの処理

■文章:村人A「幻の街は 東にあるらしいぞ。 ■変数操作: V1-0[Ev:幻の街はどこ?bit] -= V1-0[Ev:幻の街はどこ?bit] 論理積 1 ■変数操作: V1-0[Ev:幻の街はどこ?bit] += 1 + 0

村人Bの処理

■文章:村人B「幻の街は 西にあるらしいぞ。 ■変数操作: V1-0[Ev:幻の街はどこ?bit] -= V1-0[Ev:幻の街はどこ?bit] 論理積 2 ■変数操作: V1-0[Ev:幻の街はどこ?bit] += 2 + 0

村人Cの処理

■文章:村人C「幻の街は 南にあるらしいぞ。 ■変数操作: V1-0[Ev:幻の街はどこ?bit] -= V1-0[Ev:幻の街はどこ?bit] 論理積 4 ■変数操作: V1-0[Ev:幻の街はどこ?bit] += 4 + 0

村人Dの処理

■文章:村人D「幻の街は 北にあるらしいぞ。 ■変数操作: V1-0[Ev:幻の街はどこ?bit] -= V1-0[Ev:幻の街はどこ?bit] 論理積 8 ■変数操作: V1-0[Ev:幻の街はどこ?bit] += 8 + 0

各村人に話しかけると、その村人の情報を担当しているビットが確実にOnになる。という処理ですね。

『特定ビットを確実にOffにする』の計算式を入れ忘れてしまうと、話しかけるたびに加算が行われてしまい、繰り上がりが発生してイベントがメチャクチャになってしまいますので注意しましょう。

STEP4.ビットを条件分岐に組み込む

村長の孫は、管理用変数のビットの状態に応じて セリフを変えます。

村人A~D全員に話しかけたとき、管理用変数はどういう状態になっているか?を考えて、条件分岐に組み込みます。

■条件分岐(変数): 【1】 V1-0[Ev:幻の街はどこ?bit] が 15 のビットを満たす -◇分岐: 【1】 [ V1-0[Ev:幻の街はどこ?bit] が 15 のビットを満たす ]の場合↓ |■文章:孫「さっき、おじいちゃんが帰ってきたんだよー |■変数操作: V1-0[Ev:幻の街はどこ?bit] -= V1-0[Ev:幻の街はどこ?bit] 論理積 16 |■変数操作: V1-0[Ev:幻の街はどこ?bit] += 16 + 0 |■ -◇上記以外 |■文章:孫「おじいちゃん、早く帰ってこないかなー |■ ◇分岐終了◇

15のビットを満たすとはどういう状態かは もうお分かりですね?

そうです、1,2,4,8のビットをすべて満たしているか?という条件分岐です。

これはつまり、1つの変数で4つの条件を一度に判定しているというわけです。

1つの変数で、0か1かの情報を複数扱うことが出来る。これがビットのメジャーな使い方なのではないかと思います。

ビットの管理用変数というのは要するに、フラグの集合体なわけですね。

……ここまでを理解出来ていれば、このあとの処理は 既に想像がついているのではないかと思います。

この孫のイベントによって16のビットがOnになるため、村長のイベントの起動条件にこれをセットします。

さらにその村長との会話で 32のビットをOnにすれば オッケーですね!

まとめ

  • ビット管理用変数とは、フラグの集合体である。

  • 複数のフラグをまとめて管理することにより、(イベント次第では)使用する変数の数を大幅に節約できる。

今回の例では、村人A~Dに話しかけたかを一度に判定+こまごました条件x2 をたった1つの変数で処理できましたね。

2進数の解説から始まり、ようやく具体的な使い方の解説が終わりましたが、如何でしたか?

僕もまだまだ勉強中の身ですので、今回の例よりももっと素晴らしい活用方法があると思います。

こんな使い方を見つけたぜって方は、是非是非 僕にも教えていただけたら嬉しいです。

ちなみに ウディタの変数には限界値がありますので、1つの変数が扱えるフラグの数にも限度があります。

具体的に言いますと、1,073,741,824 のビットまで使えて、フラグ数の数で言うと31個が 同時に扱える限界です。

この31個を少ないと見るか、十分だと見るかは人それぞれだと思いますが、僕は8~12個くらい同時に扱えれば十分かな~と感じています。あなたはどう感じましたか?

以上、ビットを駆使したイベント作りの解説でした。

アザー


広告

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA