第12章はabout itemの解説の続きです。 前章では、アクションを起こしても、特に何も起こらないアイテムについて解説しました。 そこで、今回の章では、アクションを起こすことでさらなる発展があるアイテム について解説いたします。 アクションを起こすことでさらなる発展があるアイテムですが、 ここではMakaimon's Searching2 for PCで出てきた、石ころを用いてみます。 このゲームをプレイした方はわかるかもしれませんが、 ハンマーで叩くと電池が出てくる、あの石ころです。 もっと詳細に書くと、about item画面で、 石に向かってハンマーを使うと、石が割れ電池がむき出しになります。 そして、その電池をクリックすると、 石とは独立したアイテムとして、電池をゲットすることができます。 また、割る前の石ころはロッカーの中に入っていることにしましょう。 つまり、処理の手順としては、 1.石ころをメイン画面の金庫の中に配置 2.電池をアイテム画面に登録 3.電池をabout item画面に登録 4.石ころをアイテム画面に登録 5.石ころをabout item画面に登録 となります。 1の実装に関しては、今まで何度か解説してきたことなので、詳細は省略します。 2と3の実装も、今まで解説してきた通りです。そのまま電池(denchi.pdr)を登録してしまいましょう。 メイン画面の電池フラグの定義と初期化も忘れずに。 4の実装ですが、これはその他のアイテムの処理とちょっと異なります。 といいますのは、about itemのアクション如何で表示する画像が変わるからです。 具体的には、 拾ったばかりの石 → 電池の露出した割れた石 → 電池を取った後の割れた石 というように、何段階か表示する画像を変える処理が絡んでくるわけですね。 ですから、実装はちょっとだけ複雑になります。 そして、5の実装は4の実装と密接に絡んできます。 ここでは、実装の都合上、5から実装していくことにしましょう。 about item画面に石ころの処理を登録するわけですが、 先ほど言いましたように、他のアイテムよりも少しだけ勝手が異なります。 最初に、石ころに関するフラグを定義しておきましょう。 石を手に入れているかどうかを表すフラグは、 今までと同様に_root.item_get_stoneとします。初期値はfalseですね。 そしてもうひとつ、石の状態を記憶するフラグを定義する必要があります。 石の場合、手に入れたかどうか?ということの他にも、 ハンマーで石を砕いたかどうか?そして、電池を取り出したかどうか? という情報を記憶しておく必要があります。 ここでは、石ころの状態を表すフラグを_root.item_state_stoneとし、 _root.item_state_stoneの値とその意味を以下のように定義します。 _root.item_state_stone = 1:まだハンマーで砕いていない _root.item_state_stone = 2:ハンマーで砕いたが、電池を取り出していない _root.item_state_stone = 3:ハンマーで砕き、電池も取り出した この初期値は1ですので、この変数もメイン画面の最初で定義・初期化しておきましょう。 次に、石を表示させるためのスプライトを作ります。 これを、スプライト:stoneとします。 今までのアイテムは、単純にスプライトの中に1つの画像を詰めていましたが、 今回の場合、アクションにより表示が変わるということで、 複数の画像を詰める必要があります。 ここでは、石ころの画像は以下のように用意しておきます。 ・stone1.pdr(砕く前の石) ・stone2.pdr(砕いた後の石) ・denchi_in_stone.pdr(石の中にある電池) 表示する画像と、フラグ:_root.item_state_stoneとの対応は以下のようになります。 _root.item_state_stone = 1:stone1.pdr _root.item_state_stone = 2:stone2.pdrとdenchi_in_stone.pdr _root.item_state_stone = 3:stone2.pdr 画像の準備が整いましたので、スプライト:stoneにイベントを配置します。 ここでは、ラベルや画像を以下のように配置します。 ID:0040がstone1.pdr、ID:0041がstone2.pdr、ID:0042がdenchi_in_stone.pdrに対応しています。 ラベル「stone○」というのを見ると、 ラベルと画像が、フラグ:_root.item_state_stoneに対応していることがわかりますね。 また、ラベル:denchi3の部分で、消去「1」としておくことを忘れずに。 (これがないと、ラベル:denchi3に遷移してもdenchi_in_stone.pdrが 表示されたままになります。) 次に、このスプライト:stoneをabout item画面に配置しましょう。 これは、他のアイテム同様と配置していただいてかまいません。 ただし、スプライト:stoneに記述するクリップアクションは異なります。 まず、_root.item_state_stoneに応じて表示を変えなければならないので、 onClipEventイベントを記述して、ラベル遷移を行う必要があります。 そしてもうひとつ、これが重要なのですが、 他のアイテムとは異なり、 on(release)イベントをクリップアクションに記述しないことです。 その代わりに、スプライト:stoneに配置した、 stone1.pdr、stone2.pdr、denchi_in_stone.pdrの3つの画像をボタン化し、 そこに処理を記述するということをします。 これに関して少し解説しておきますと、 スプライト内の画像をボタン化して処理を記述し、 さらに、スプライトのクリップアクションにon(release)を記述した場合、 これは、クリップアクションの処理が優先されるという現象が起こります。 平たく言えば、スプライトの中と外、両方にクリック時のイベントを記述すると、 外に書いた処理のみが実行される、ということになります。 今回の場合、石ころと電池の画像を別々に用意したい上に、 クリックした場合の処理も異なるものにしたいので、 スプライトの中にクリック時の処理を記述するわけです。 (石をクリックした場合はセリフが出るだけ、電池をクリックした場合は電池をゲット) アイテムの種類によっては、クリップアクションとして処理を書いた方がやりやすい場合もあります。 このあたりは、適宜判断してください。 説明が長くなりましたが、 スプライト:stoneに記述するクリップアクション、 stone1.pdr、stone2.pdr、denchi_in_stone.pdr、それぞれに記述する on(release)イベントは以下のようになります。 スプライト:stone
onClipEvent (Load) { gotoAndPlay("stone" + _root.item_state_stone); } - onClipEvent (enterFrame) { gotoAndPlay("stone" + _root.item_state_stone); }
on(release){ if (_root.select_item == "hammer"){ _root.item_state_stone = 2; _root.message = "ハンマーで石ころを砕いてみよう"; _root.message_window.gotoAndPlay("hakai"); }else{ _root.message = "見た目はただの石ころだけど…\n何に使うんだろう?"; _root.message_window.gotoAndPlay("message"); } }
on(release){ _root.message = "ハンマーで砕いた石ころだね"; _root.message_window.gotoAndPlay("message"); }
on(release){ _root.item_get_denchi = true; _root.item_state_stone = 3; _root.message = "石の中から 電池が出てきた!!"; _root.message_window.gotoAndPlay("get_item"); }
onClipEvent (Load) { if (_root.item_get_stone == false){ _visible = false; }else{ _visible = true; } gotoAndPlay("stone" + _root.item_state_stone); } - onClipEvent (enterFrame) { if (_root.item_get_stone == false){ _visible = false; }else{ _visible = true; } gotoAndPlay("stone" + _root.item_state_stone); } - on (release){ _root.select_item = "stone"; }