• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:脱出ゲームを作るときのアクションスプリクト)

脱出ゲームでのアクションスプリクトについての質問

このQ&Aのポイント
  • 脱出ゲームを作る際、壁にはめた玉の順番によって脱出するアクションスプリクトの書き方について教えてください。
  • 現在、脱出ゲームにおいて玉のムービークリップと壁の穴のムービークリップを作成していますが、具体的なアクションスプリクトの解説がなく、どのように書けばよいのか分かりません。
  • アクションスプリクトの書き方を教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

3時間くらい唸って考えましたし, わかる範囲内で同様のようなものを作成したみましたが, 結局何を書かれていらっしゃるのかさっぱり理解できませんでした。 ムービーの構造どころかルールさえわかりません。 >ゲットした4つの玉(アイテム)を壁の穴に当てはめる >という動作が見事出来ました スクリプトを見る上では,「穴にあてはめる」=「その穴に順に置いた玉が順次移動する」という部分は全くみつかりません。移動はぜんぜんしていないように見えますよ。 --- --- --- --- --- --- 玉のムービークリップのスクリプトの最後の行, > itemNum = false;} これは _root.itemNum = false;} の間違いではないでしょうか? また 書かれていらっしゃる玉のスクリプトはおそらく, 「aka1」に書かれたものだと思いますが, 1つしか例がないので, 「aka2」ではどこをどのように変えるのか, また 「ao1」ではどこをどのように変えるのか, という規則性がいまひとつわかりません。 一応 「aka2」 は次のようになるのではないかとは推測しました。 on (release) { _root.aka2._visible = false; _root.item2._alpha = 100; _root.komento = "赤い玉をはずした"; _root.itemNum = false; } 「ao1」 は次のようになるのではないかとは推測しました。 on (release) { _root.ao1._visible = false; _root.item1._alpha = 100; _root.komento = "青い玉をはずした"; _root.itemNum = false; } 一応推測はしましたが, 実際はどう変えるべきなのかわかりません。 --- --- --- --- --- --- 最難関が , if (_root.item == "about1") など _root.item です。 _root.item にどこで about1 という値を代入しているのでしょうか? わかりません。 また,アイコン(item?) などというものも突如出没していて, 玉 と 穴 と アイコン(item?) の関係がぜんぜんつかめません。 --- --- --- --- --- --- 根本的に,もっとわからないのは, 4個の穴に玉を当てはめるのに,なぜ玉が16個もあるかです。 16個あるにしても, 「赤」「青」「黄」「緑」「紫」「茶」「橙」…のように全く違う玉があるのなら理解ができます。 しかし4個で済むところを同じ色の玉を4つずつ用意している意味がわかりません。 たとえば 「赤」「青」「黄」「緑」 という順が正解であるとする場合, 「aka1」「ao4」「kiiro4」「midori3」 でも 「aka2」「ao1」「kiiro2」「midori2」 でも, 「aka4」「ao4」「kiiro1」「midori1」 でも,   …   …   略  …  … これら全てが正解なのでしょうか? もしそうだとするなら, それらすべてが正解であるという判定をしなければなりませんよ。 だからそこを工夫する必要があると思います。 --- --- --- --- --- --- あと気になった点を少し。 例えば 「ao1」「ao2」「ao3」「ao4」と連続でクリックした場合, 現状では「青」が全部消えてしまいますよ。 これでいいのでしょうか? >「玉レイヤー」と「壁の穴レイヤー」を階層に分け スクリプトを見る限り階層に分けているようには見えませんよ。 階層とはオブジェクトの階層構造のことを指します。 Flashの場合はムービークリップが1つの階層です。 ムービークリップの中にムービークリップを入れたりした場合に, 親階層とか子階層とか言います。 _root がそもそも1つの階層です。 「玉レイヤー」と「壁の穴レイヤー」の階層分けを本当にすると次のようにするということです(例)。  _root   ├玉用ムービークリップ   │  ├aka1   │  ├aka2   │  ├aka3   │   …略…   │  └midori4   └穴用ムービークリップ      ├穴1ムービークリップ      ├穴2ムービークリップ      ├穴3ムービークリップ      └穴4ムービークリップ --- --- --- --- --- --- ★結局★ 自分の中で日本語で明白にルールがあればそれをコーディングすれば良いだけです。 この日本語↑とは純粋日本語ではなくインスタンス名などの固有名称は含む意味での日本語です。 ご質問の文やスクリプトからは, 「何がどうなれば良いのか(何がどうなればゲームクリアなのか)」 がさっぱりわからないので, こちらも根掘り葉掘りと細部を聞いているだけです。 補足してくださっても, 結局わからない可能性が多いので,その場合補足説明する労力は無駄になりますが, それでもかまわない場合は,補足説明してください。 一番良いのは, 上で私が書いた様々な疑問に1つずつ答えてくださってもかまいませんが, それより 「何がどうなったときゲームクリアなのか」 を補足説明していただく方が良いです。 「何がどうなったときゲームクリアなのか」 をご自分の中で明白にすると, 補足説明するまでもなく,ひょっとしたら自己解決するかもしれませんよ。 ☆ちなみに☆ 私が http://oshiete1.goo.ne.jp/qa4121602.html で書いたのは, _root の上レイヤーに玉ムービークリップ「aka」「ao」「kiiro」「midori」 があったとして, _root の下レイヤーに穴ムービークリップ「ana1」「ana2」「ana3」「ana4」があったとして,  「ana1 に aka が入る」   「ana2 に ao が入る」    「ana3 に kiiro が入る」     「ana4 に midori が入る」 これが正解の順序であるとした場合, 次のようにすればいいのではないかというような意味です。 ------------------------------------ // このムービークリップ(またはボタン)を放したとき on (release) { // 赤が穴1と接触 なおかつ 青が穴2と接触 なおかつ // 黄が穴3と接触 なおかつ 緑が穴4と接触 していたら if (_root.aka.hitTest(_root.ana1) && _root.ao.hitTest(_root.ana2) && _root.kiiro.hitTest(_root.ana3) && _root.midori.hitTest(_root.ana4)) { // 完了!を出力(実際は何か他の動作を書く) trace("完了!"); } } ------------------------------------  // このムービークリップ(またはボタン)を放したとき の 「このムービークリップ」 とは, 「ana1」「ana2」「ana3」「ana4」でも良いですし, 「aka」「ao」「kiiro」「midori」 でも良いです。 何でも良いのです。 穴をクリックして玉を持ってくる形式でしたら,各穴に書くことになると思います。 各玉に ------------------------- // このムービークリップを押したとき on (press) { // ドラッグ開始 this.startDrag(); } // このムービークリップを放したとき on (release, releaseOutside) { // ドラッグ終了 this.stopDrag(); } ------------------------- のように書いて, 穴に玉をドラック移動させる形式でしたら,  // ドラッグ終了  this.stopDrag(); のあとくらいに if文 を書くことになると思います。 また,穴でも玉でもない別の「判定!」ボタンなどを作成して, そこに hitTest 判定文を書いても良いでしょう。 そういう単純な意味です。

musasabi00
質問者

お礼

BlurFiltanさま 回答ありがとうございます 回答を頂いてからいじってみましたが、HitTestを入れてのスプリクトでも同じ玉が何個も表示されるエラーもなくなりました (質問のアクションスプリクトはHitTestなしで作ったものです) ゲームクリアは たとえば左から順に赤・青・黄・緑と玉を入れると正解(正解の並び順番はひとつ)で 「エンディング画面へ飛ぶ」gotoAndPlay("ending")にしたいのですが、教えていただいた、 ------------------------------------ // このムービークリップ(またはボタン)を放したとき on (release) { // 赤が穴1と接触 なおかつ 青が穴2と接触 なおかつ // 黄が穴3と接触 なおかつ 緑が穴4と接触 していたら if (_root.aka.hitTest(_root.ana1) && _root.ao.hitTest(_root.ana2) && _root.kiiro.hitTest(_root.ana3) && _root.midori.hitTest(_root.ana4)) { // 完了!を出力(実際は何か他の動作を書く) trace("完了!"); } } ------------------------------------ を少し変更して、else ifとgotoAndPlay("ending")を使い、ana(1~4)に書き加えてみたのですが エンディングに飛びませんでした。。 根本的に、玉が16個あるのもおかしいと思いつつ作っていましたが 玉のムービークリップを4つ複製すると、4つ同時に表示されたり、 ana1をクリック後ana2をクリックするとどちらにも表示されるなど、エラーになってしまいます 一つの玉ムービークリップを ↓ ●○○○    ↓ ○●○○ このように移動させる簡単な方法があるのでしょうか? X・Yを使うのはなんとなく分かるのですが、 どのように書けばよいでしょうか? また、itemは画面右の小さいアイコンで aboutは、itemの詳細画面のことです お時間とらせてしまいすいません(;;)

musasabi00
質問者

補足

先ほど自己解決しました!! else ifを使うのではなく、on(release)を新たに書いてHitTest文を追記することで、無事エンディング画面に飛びました 4つの玉をXYを使って移動させる動作も出来ています 丁寧に教えていただいたおかげです(・∀・) ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • FLASH内MCの表示・非表示

    どなたか教えて下さい。FLASHにて外部テキストを読み込み、その読み込む文によってMCを表示・非表示させたくて下記のようにソースを書いたのですが、変数のw03の部分をakairo以外の文字にしてもaka(MC)が表示されてしまいます。。。 akairo意外の文字にした場合、ao(MC)が表示になるようにしたいのですが、どなたか教えて頂けると幸いです。よろしくお願いします。 this.stop(); System.useCodepage = true; g01.loadVariables("test.txt"); //外部読み込み if (g01.w03 == akairo) { //もしg01内のダイナミックテキストw03の読み込んだ文字が akairo なら aka._visible = true; //aka(MC)を表示 ao._visible = false; //ao(MC)を非表示 }else{ //そうでなかったら ao._visible = true; //ao(MC)を表示 aka._visible = false; //aka(MC)を非表示 } 外部テキスト(test.txt)は w01=ワード01&w02=ワード02&w03=akairo になっています。

    • ベストアンサー
    • Flash
  • ムービークリッププロパティの変更

    こんにちは。 ムービークリップA_mcをロールオーバーした時にムービークリップB_mcを表示ロールアウトした時にムービークリップB_mcを非表示にしたいのです。 まずはムービークリップB_mcの_alphaを100にするスクリプトを記述しようとしています。 B_mcはアニメーションですでに_alpha=0でステージにおかれています。 A_mcに on(rollOver){ _root.B_mc._alpha=100; } on(rollOut){ _root.B_mc._alpha=0; } と記述したのですが、表示されませんでした。 試しにと on(rollOver){ _root.B_mc._visible=true; } on(rollOut){ _root.B_mc._visible=false; } としてもだめでした・・・ すみません。原因がよくわからず対処方法もわかりません・・・何方かご教授頂けないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Flash
  • FLASHで脱出ゲームを作る時の、アクションスプリクトが分かりません

    ゲットした4つの色違いの玉を、壁の穴に当てはめて、 並び順が正解なら脱出。。!というシーンを作りたいのですが、 アクションスプリクトの本を探してもなかなか見つからず 試行錯誤を繰り返してはエラーになっています どなたか教えてください(_) onclip movie(EnterFlame)と if、else if、elseを使って、なんとかできそうな気がしたんですが。。 其の場合、同じ色の玉がいくつも表示されたり、クリックしても反応しなくなりました 製作環境は、FLASH CS3のアクションスプリクト2.0です

    • ベストアンサー
    • Flash
  • perlでくじ引きプログラムを作りたい

    箱の中に、 akaが14個 aoが21個 kiiが443個 以下続く(__END__以下) という様にさまざまな色のボールが箱に入っているとします。 そこから、80個だけ取り出した場合、 aka=4 ao=9 aka=4 以下続く という様に表示させたいのですがどのようにすればよいでしょうか? ネット上で見つけた色々なプログラムをくっつけてはみたのですがいまいちです。 特に、ballの数がakaが14個ではなく、akaが1000000個、ao300000個のように膨れるとメモリも多く要りそうですし、時間もかかってしまいます・・・ もっとうまくやるやり方があると思うのですが、どうしても思いつきません。 どなたか、教えていただけ無いでしょうか? 宜しくお願い致します。 #!/usr/bin/perl print "Content-Type: text/plain\n\n"; my $cnt = 80; my ($line,@array,@data,$data); foreach $line (<DATA>){ @array = split(/\t/,$line); for(1..$array[2]){ #ここの部分がかなり問題あり・・・ $data[$datacnt++]=$line; } } srand; for (my $i = @data; --$i; ) { my $j = int rand ($i + 1); next if $i == $j; @data[$i, $j] = @data[$j, $i]; } foreach(0..($cnt-1)){ #とりあえず表示させる。 print $data[$_]; } #同名を集計して表示させるプログラムを作る予定 #空白はタブ区切りです。 __END__ ball aka 14 ball ao 21 ball kii 443 ball midori 112 ball shiro 122 ball orenji 1

    • ベストアンサー
    • CGI
  • ボタンをクリックでムービーを表示させストップ、その際、他のボタンは関係なく動いている

    FLASH MX 2004を使っているAction Script初心者です。 http://oshiete1.goo.ne.jp/qa4288529.html で前回の問題は解決できたのですが、新たな問題が発生しました。 _root   ├b01(モーショントゥイーンなどで動くボタン)   ├m01(表示/非表示 が変わるムービークリップ)   ├b02(モーショントゥイーンなどで動くボタン)   └m02(表示/非表示 が変わるムービークリップ) 動いているb01というボタンをクリックすると、m01というムービーが表示され、b01とm01はストップし、m01をクリックするとm01は消え、b01が再度動き出し、その間はb02は関係なく動いているというようにしたいのですが、全体がストップ、全体が動き出す、もしくはストップしないというようになってしまいます。 b02はb01と同様にクリックすると、m02というムービーが表示され、b02とm02はストップし、m02をクリックするとm02は消え、b02が再度動き出し、その間b01は関係なく動いているという仕様です。 【b01】 on (release) { _root.m01._visible = true; _root.m01.stop(); _root.b01.stop(); } 【m01】 onClipEvent (load) { this._visible = false; } on (release) { _root.m01._visible = false; _root.b01.play(); } 【b02】 on (release) { _root.m02._visible = true; _root.m02.stop(); _root.b02.stop(); } 【m02】 onClipEvent (load) { this._visible = false; } on (release) { _root.m02._visible = false; _root.b02.play(); } いろいろと間違っているかも知れませんが、ご教授ください。 よろしくお願い致します。

    • ベストアンサー
    • Flash
  • ActionScriptでの繰り返し記述をすっきりまとめたい

    FLASHのActionScriptを勉強中です。 繰り返し同じ様なものを記述する場合、for文か何かを使うと思うのですが、以下の場合はどうすればいいのでしょうか? *プログラムの内容は複数のインスタンスを表示してクリックで順次消えるというものです。インスタンスに記述ではなく、フレームに記述しています。(イベントハンドラメソッド) this.b1.onRelease = function(){ _root.b1._visible = false; }; this.b2.onRelease = function(){ _root.b2._visible = false; }; this.b3.onRelease = function(){ _root.b3._visible = false; };      以下繰り返し… お詳しい方、よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • ポップアップを一定時間、またはマウスが乗っている間表示させておく

    スクリプトに詳しくないので、教えていただきたいです。 画面上のあるエリアにマウスをのせるとポップアップウィンドウのようなものが表示され、 その中にあるボタンをクリックすると外部swfを読み込むという仕組みを 作りたいと思っています。 下に書いてあるスクリプトでポップアップが出てくるようにしたのですが、 その次がわからなくて困っています。 (1)マウスがエリアから外れても、一定時間(例えば1秒とか)ポップアップを 表示したままにしたい (2)ポップアップにマウスがのっている間は表示させておきたい (1)はエリア部分とポップアップが離れている場合(といってもほんの少しです)を 考えてのことです。 いい方法がありましたらぜひ教えてください。 どうぞよろしくお願いいたします。 エリア部分に書いたActionScript --------------------------------------------------------------- onClipEvent (load) { _root.popup._visible = false; } onClipEvent (enterFrame) { if (this.hitTest(_root._xmouse,_root._ymouse,1)) { _root.popup._visible = true; } else { _root.popup._visible = false; } } ---------------------------------------------------------------

    • ベストアンサー
    • Flash
  • ムービーをクリックしてボタンを動かしたい

    FLASH MX 2004を使っているAction Script初心者です。 動いているb01というボタンをクリックすると、m02というムービーが表示され、b01とm02はストップし、m02をクリックするとm02は消え、b01が再度動き出すということをしたいのですが、b01とm02のストップまではできたのですが、ストップしたb01を動かすことができません。 【b01】 on (release) { _root.m02._visible = true; stop(); } 【m02】 onClipEvent (load) { this._visible = false; } on (release) { _root.m02._visible = false; _root.b01.play(); } いろいろと間違っているかも知れませんが、よろしくお願い致します。

    • ベストアンサー
    • Flash
  • マウス位置によって画像を切り替える

    ステージ上のマウス位置を読み取り、その座標によって画像を切り替えるFlashを作成中なのですが、上手くいきません。 流れとしては 画像のファイルを読み込む ↓ 画像のファイル分だけムービークリップを作成 ↓ マウスの座標に応じて画像(ムービークリップを切り替える) というものです。 下記のようにかいています。 ●1フレーム目 //各画像の変数読み込み jpg1 = "test1.jpg"; jpg2 = "test2.jpg"; jpg3 = "test3.jpg"; jpg4 = "test4.jpg"; //初期配置 //空のMCを作成し、その中に画像変数を読み込ませる。 _root.createEmptyMovieClip("image_mc0",4); _root.createEmptyMovieClip("image_mc1",3); _root.createEmptyMovieClip("image_mc2",2); _root.createEmptyMovieClip("image_mc3",1); _root.image_mc0.loadMovie(_root.jpg1); _root.image_mc1.loadMovie(_root.jpg2); _root.image_mc2.loadMovie(_root.jpg3); _root.image_mc3.loadMovie(_root.jpg4); //マウスが押されたときに変数MCclickをオンにする _root.mouse_mc.onPress = function() { MCclick = true; trace( "押された時の変数 " +_root.MCclick); } //マウスが離れた時に変数MCclickをオフにする _root.mouse_mc.onRelease = function() { MCclick = false; trace( "離れた時の変数 " +_root.MCclick); nowpoint = (_root._xmouse); trace( "今の位置" + nowpoint); } //マウスがボタン領域外にいった時に変数MCclickをオフにする _root.mouse_mc.dragOut = function() { MCclick = false; trace( "どっかいった時の変数 " +_root.MCclick); } stop(); ●ステージ上にかぶせている透明なMC(mouse_mc) //MCclickがオンの時変数mc_xの値をとり続ける onClipEvent (mouseMove) { if (_root.MCclick) { _root.mc_x = (_root._xmouse); trace( "押された時の変数mc_xの位置 " + _root.mc_x); trace( "マウスを押したままの変数 " + _root.MCclick); //100以下の時に画像1を表示 if((_root.mc_x >= 0) || (_root.mc_x <= 100)){ _root.image_mc0._visible = true; _root.image_mc1._visible = false; _root.image_mc2._visible = false; } else if((_root.mc_x >= 100) || (_root.mc_x <= 200)){ _root.image_mc0._visible = false; _root.image_mc1._visible = true; _root.image_mc2._visible = false; } else if((_root.mc_x >= 200) || (_root.mc_x <= 300)){ _root.image_mc0._visible = false; _root.image_mc1._visible = false; _root.image_mc2._visible = true; } } } この書き方で一応動作はするのですが、1枚目と2枚目の画像の切り返しか動作が行われなくて困っています。 画像のサイズ、ステージのサイズは両方とも 400*400です。

    • ベストアンサー
    • Flash
  • Flashでボタンをクリックすると表示・非表示するには?

    お世話になります。 ボタン「buttonC」に以下のスクリプトを記入し、クリックするとターゲット「C」が表示されるようにしています。「C」はタイムライン1では非表示で、タイムライン2以降で表示されるようにしてあり、「buttonC」をクリックすると「C」のタイムラインが2に移動するという仕組みです。 on (release) {  with (C) {   if (_currentframe == 1) {    gotoAndStop(2);   } else {    stop();   }  } } on (release) {  buttonC._alpha = (50); } 更に「buttonC」はクリックするとアルファ=50%になるようにしています。 この状態で、もう一度クリックすると、「C」を非表示(タイムライン1に戻す)にし、「buttonC」のアルファを100%にするように設定したいのです。Flagを使ってみたのですがどうも上手くいきません。 以下は試したスクリプトです。 on (release) {  if (playmode=1) {   with (C) {    if (_currentframe == 1) {     gotoAndStop(2);    } else {     stop();    }   }  } } on (release) {  if (playmode=1) {   buttonC._alpha = (50);   playmode = 2;  } } on (release) {  if (playmode=2) {   buttonC._alpha = (100);   C.gotoAndStop(1);   _root.playmode = 0;  } } 他の方法でも構わないので、良い方法がありましたら教えてください。 よろしくお願いいたします。