ポケモンGOやドラクエウォークのプレイ日記、オリジナルキャラ「わんぱ君」「しおりちゃん」らが活躍する脱出ゲーム・Youtube動画を公開中!

WANPA's STORE

【脱出ゲームの作り方】12.about item(後編)

 

脱出ゲームの作り方:目次

目次

 

前回の記事

【脱出ゲームの作り方】11.about item(前編)

  脱出ゲームの作り方:目次 目次   前回の記事     はじめに 第11章はabout itemの機能について説明いたします。 about itemとは、こ ...

続きを見る

 

 

はじめに

第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);
}

stone1.pdr

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");
	}
}

stone2.pdr

on(release){
	_root.message = "ハンマーで砕いた石ころだね";
	_root.message_window.gotoAndPlay("message");
}

denchi_in_stone.pdr

on(release){
	_root.item_get_denchi = true;
	_root.item_state_stone = 3;

	_root.message = "石の中から 電池が出てきた!!";
	_root.message_window.gotoAndPlay("get_item");
}

これらの処理の記述方法に関しては、
メイン画面の場合とほぼ同様の記述をすればOKです。
結局は、
stone1.pdrにハンマーを使う→_root.item_state_stone = 2
denchi_in_stoneをクリック→_root.item_get_denchi = true かつ _root.item_state_stone = 3
の2つの処理を加えればOKになります。
また、ハンマーで石を砕いたときの効果音、hakai.mp3を追加してあります。

石のabout item画面の記述は以上で終了です。
次に、石のアイテム画面の記述に移ります。
これに関しては、他のアイテムと比較すると、
_root.item_state_stoneの値に応じてラベル遷移をする必要があります。
したがって、クリップアクションの記述は以下のようになります。

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";
}

 

 

実装完了!

以上で実装は完了です。
最終的に出来上がったFLASHは以下のようになります。

 

http://koubou.wanpa189.net/escape/sample_escape12.swf

 

ロッカーを開くと中に石が入っています。
その石をゲットし、about item画面からハンマーを利用すると、
石を砕くことができます。(同時に、アイテム画面の表示も変化します)
さらに、砕いた石から電池をクリックすると、
電池をゲットできます。(同時に、アイテム画面の表示も変化します)

ちょっとした余談ですが、サンプルプログラムを見ますと、
about item画面に配置されているアイテムを表す各スプライトの深度が、
1~4とずらしてあることがわかります。

このように、深度をずらしておかないと、
例えば、ハンマーのabout item画面を表示させている状態で、
カギのabout item画面を表示させようとしても、
カギの画面が表示されない、という現象が起こります。
どうやら、これはParaFla!の仕様でして、
ラベルA←ラベルBと、フレームの小さいラベルに遷移しようとしたとき、
ラベルAのスプライトとラベルBのスプライトが同じ深度に存在する場合、
画像消去を行っていても、ラベルBにあるスプライトが消去されずに残ってしまう
という現象が起きてしまうようです。
些細なことですが、頭の片隅においておきましょう。

第12章は終了です。
about itemまで解説しましたので、これでもう大抵の脱出ゲームは作れるだろうということで、
以上を持ちまして、WANPA's 工房の脱出ゲームの作り方は、
一旦終了とさせていただきます。
実際のところ、もっとスクリプトをスマートに書く方法はあると思います。
どのように書けば、もっと処理がうまくいくか?
続編を作るのに再利用しやすいコードになるか?
というのは、経験的に身につくものですので、
皆さんも、プログラムび記述にチャレンジしてみてください。

ただし、「○○の部分の作り方を解説してほしい」というご要望がありましたら承りますので、
お問合せフォームや総合BBSでご連絡ください。
とりあえず、「パスワードで開く金庫の作り方」は
近々解説したいと思っております。

この章で作成したファイルはこちらから。
lzh形式
zip形式
※このファイルは使用・流用は自由としますが、そのままの転載は不可とします。
使用・流用した場合、強制ではありませんが、連絡・クレジット等をしていただければ幸いです。
ただし、効果音に関しては、他サイト様のものを使用させていただいておりますので、
効果音については二次使用をせず、ご自身で取得するようにお願いいたします。

 

 

次回の記事

【脱出ゲームの作り方】13.細かいこと

  脱出ゲームの作り方:目次 目次   前回の記事     はじめに 第13章はタイトル通り細かいことを解説します(笑) トピックスは以下の3つです。 TABキ ...

続きを見る

 

 

  • B!