if文での記述の仕方がわからなくて困っています

このQ&Aのポイント
  • winxp flash8です。if文で分岐したいが記述方法が違い、スクリプトが通らない。
  • 30個のブロックをfor文で処理し、ボールとブロックが当たったときに条件分岐を行い、処理を行う。
  • atariという変数が0の場合はシルエットを取り、それ以外の場合はブロックを非表示にする。
回答を見る
  • ベストアンサー

if文での記述の仕方がわからなくて困っています

winxp flash8です。いつもありがとうございます。 if分で分岐したいのですが記述の仕方が違っているらしくスクリプトが通らなくて困っています。下記のようにかいています。 if (eval ("atari" + i) == 0)が違うようです。 // 30個のブロックをfor文で処理する for (i = 0; i < 30; i++) { if (flg[i] == 1) { continue; } // 次のループへ // ボールとブロック t i 番目 が当たったとき if (this._parent.tama0.hitTest (eval ("this._parent.t" + i))) { trace((eval ("atari" + i))); if (eval ("atari" + i) == 0) { //シルエットをとる eval ("this._parent.t" + i).gotoAndStop (1); set(eval ("atari" + i), 1); } else if (eval ("atari" + i) == 1) { // ブロックを非表示に eval ("this._parent.t" + i)._x = 77; eval ("this._parent.t" + i)._y = -100; flg[i] = 1; // 消えた事をあらわすフラグ

  • Flash
  • 回答数3
  • ありがとう数2

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

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

問題は if文 ではありません。 しかし,かなり古いスクリプトと構造を作られていらっしゃいますね。 Flash Lite 1.x 対応のゲームを作られているとか? とも一瞬思いましたが, Flash Lite 1.x では hitTest が使えませんからそうではありませんよね。 古くからやっている者だとわかります。 スクリプトやムービークリップの構造の原型は Flash5 ですね。 雰囲気は Flash 4 と 5 の中間あたりの感じです。 今の人が見れば 「this._parent.t 何それ?? そんなまわりくどい書き方をする状況がわからない。」 「set って何? クラスファイルの定義でも作成しようとしているの???」 みたいに見えて,状況がわからないと思いますが, Flash 3 ~ Flash 5 では確かにそのようにせざるを得ないことがありました。 またクラスファイルも全く関係ありませんね。 簡単なサンプル例です。 新規ドキュメント作成で次のような3つのムービークリップを作成します。  _root   ├ 無名のムービークリップ(スクリプト記述用)   ├ ムービークリップ 「tama0」   └ ムービークリップ 「t1」 (ドラッグで動かす) そして, 無名のムービークリップ "自体"には次のように記述。 ----------------------------------- onClipEvent (load) { // ★ 変数 atari0 ~ atari29 の初期化 for (i=0; i<30; i++) { set("atari"+i, 0); } } onClipEvent (enterFrame) { // 30個のブロックをfor文で処理する for (i=0; i<30; i++) { // ボールとブロック t i 番目 が当たったとき if (this._parent.tama0.hitTest(eval("this._parent.t"+i))) { if (eval("atari"+i) == 0) { // ブロック t i を半透明にする eval("this._parent.t"+i)._alpha = 50; // ★↓ココを訂正 set("atari"+i, 1); } else if (eval("atari"+i) == 1) { // ブロックを非表示に eval("this._parent.t"+i)._x = 77; eval("this._parent.t"+i)._y = -100; } } } } ----------------------------------- そして, ムービークリップ 「t1」 (ドラッグで動かす) 自体には次のように記述。 ----------------------------------- on(press){ this.startDrag(); } on(release, releaseOutside){ this.stopDrag(); } ----------------------------------- それでムービープレビューしてみて, 「t1」 をドラッグして,一瞬だけ「tama0」に接触させれば, 「t1」 はちゃんと半透明になって, ずっと接触させ続ければ消えると思います((77,-100)に移動すると思います)。 上のスクリプトにも ★印 を付けていますが,  // ★ 変数 atari0 ~ atari29 の初期化  for (i=0; i<30; i++) {   set("atari"+i, 0);  } このように, 変数 atari0 ~ atari29 に初期値 0 を入れるのを忘れているのではないでしょうか。 また,  // ★↓ココを訂正  set("atari"+i, 1); set関数はこのように使わなくてはなりません。 この使い方を間違えていらっしゃるから無事に動作しないのではないでしょうか。 ※ ココで言う set関数 とは   クラスファイルで使用する set ステートメント ではなく,   set variable ステートメント のことです。   Flash 4 では変数に値を設定するとき   次のように書いていました。    Set Variable:"atari" & i =1    [現在の set("atari"+i, 1); と同じ意味]   set variable ステートメントとは,これの   ActionScript1.0 での代替版の関数のことです。   こんなの滅多に使いません(普通は使う必要なし)。   Flashドキュメンテーション「set variable ステートメント」   http://livedocs.adobe.com/flash/8_jp/main/00001884.html ====================== 一応,上のように修正&変更させていただきましたが, それにしてもしくみやスクリプトが古すぎますね。 修正した自分でも恥ずかしい状況です。 今や ActionScript3 の時代が来ようとしているのに, その先々代の ActionScript1 でも,このような古いスクリプトは普通用いません。 それに, 上で作成した「無名のムービークリップ」などという妙なものは作成しません。 以下では, 上で書いた内容をさらに普通な方法とスクリプトに書きなおします。 新規ドキュメント作成で次のような2つのムービークリップを作成します。  _root   ├ ムービークリップ 「tama0」   └ ムービークリップ 「t1」 (ドラッグで動かす) そして, _root のフレームには次のように記述。 ----------------------------------- // 変数 atari0 ~ atari29 の初期化 for (i=0; i<30; i++) { _root["atari"+i] = 0; } _root.onEnterFrame = function() { // 30個のブロックをfor文で処理する for (i=0; i<30; i++) { // ボールとブロック t i 番目 が当たったとき if (_root.tama0.hitTest(_root["t"+i])) { if (_root["atari"+i] == 0) { // ブロック t i を半透明にする _root["t"+i]._alpha = 50; _root["atari"+i] = 1; } else if (_root["atari"+i] == 1) { // ブロックを非表示に (★普通は _visible を使わない?) _root["t"+i]._x = 77; _root["t"+i]._y = -100; } } } }; ----------------------------------- そして, ムービークリップ 「t1」 (ドラッグで動かす) 自体には次のように記述。 (これは上と同じで変更ありません。) ----------------------------------- on(press){ this.startDrag(); } on(release, releaseOutside){ this.stopDrag(); } ----------------------------------- そして,ムービープレビューしてみて, 「t1」 をドラッグして,一瞬だけ「tama0」に接触させてみて検証します。 だいたいこれが, 普通の ActionScript1.0 の書き方です。 evalは使用しません。 evalを使用するから,等式(代入式)の左辺に持って来れなくなって, set関数などというさらに妙なものを出没させなければならなります。 普通は eval ではなく,配列アクセス演算子 [ ] を使用します。 eval の場合は,まとめて1つのパスを示しますが, 配列アクセス演算子を使うと [ ] の中は1階層のみを示します。 階層までもが動的に変動する処理ではないので,配列アクセス演算子で十分です。 また, 色々なものを監視したり,色々なものを総合的に動かすのに, Flash 5 までは 「ぜんぜん関係のないムービークリップを作成する」 必要がありました。 ですから,兄弟階層から兄弟階層に司令を出すというような妙なことをしなければならないこともありましたが, FlashMX以降はその必要はありません。 「ぜんぜん関係のないムービークリップを作成する」という考え方自体は, 「オブジェクトを見える形で用意する」ということとなって, 例えば Mouseオブジェクト や Keyオブジェクト がイメージしやすくなるので, 知っていても全く損ではない方法ですが,実際には使うことは普通ありません(Flash Lite 1.x を除く)。 ====================== あと, バラバラと沢山の変数を作成するのは私は嫌ですし, その変数を操作するときもバラバラの変数では操作しにくいので, 私なら,変数 atari0 ~ atari29 のようなものは作成せずに,1つの配列として管理します。 それにその変数群の作成は,配列をエミュレートしていることと同じだと思います。 Flashドキュメンテーション 「eval 関数」 http://livedocs.adobe.com/flash/8_jp/main/00001726.html それと, 場合によるので何とも言えませんが,  // ブロックを非表示に (★普通は _visible を使わない?)  _root["t"+i]._x = 77;  _root["t"+i]._y = -100; この部分も MC._visible = false にするか, もしくは動的に作成した t0 ~ t29 であれば, MC.removeMovieClip() で全く削除すると思います。 ---例----------------------------- // 配列 atariArr の作成 atariArr = new Array(); // atariArr の [0] ~ [29] 要素の初期化 for (i=0; i<30; i++) { atariArr[i] = 0; } _root.onEnterFrame = function() { // 30個のブロックをfor文で処理する for (i=0; i<30; i++) { // ボールとブロック t i 番目 が当たったとき if (_root.tama0.hitTest(_root["t"+i])) { if (atariArr[i] == 0) { // ブロック t i を半透明にする _root["t"+i]._alpha = 50; atariArr[i] = 1; } else if (atariArr[i] == 1) { // ブロックを非表示に _root["t"+i]._visible = false; } } } }; ---------------------------------- 長々と書きましたが, とりあえず 最初に書いたような書き方 でやってみてください。 set関数の使い方がおかしいという部分です。 そしてその点がクリアされて,もし余裕があれば, もっとスクリプトや構造を今風(と言っても上で私が書いたものでも5年くらい前の書き方でこれでも古いです)な構造やスクリプトにしてみてください。 eval や set など, 今やほとんど見ることがなく参考サイトも少ないようなスクリプトでは使い方事例も見つからないと思います。 もっと今風(と言ってもせめて5年くらい前の書き方)にすれば,もっと楽に作成できますし,エラーも起こりにくくなります。

Flash-love
質問者

補足

丁寧なご回答、ありがとうございました。 悩んでいるうちに古いスクリプトをひっぱりだしてきたら何とかなってそのうちにごちゃごちゃになっていました。 いつも行き当たりばったりで作っていて悲しくなることも。 ブロックを消すのにvisibleを使ったら、見た目は消えたのに1度玉をミスして初期値にもどった時、当たり反応があったので力技で外に飛ばしてしまいました。また、MC.removeMovieClip()はmcがスクリプトでできたものではないので使えませんでした。配列はいつも苦手でどこに[]を入れたらいいのかわからなくなりますが、使うようにします。 階層の書き方ですが、絶対パスを使うのが一般的なのでしょうか?親のswfに読み込んだ時に階層がおかしくなっていまったことがあったので相対パスで書くのがいいのかと思いました。とにかく、ありがとうございました。今風に書けるようにがんばってみます。

その他の回答 (2)

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

#2です > 絶対パスを使うのが一般的なのでしょうか? それは場合によるので一概には言えませんね。 > 親のswfに読み込んだ時に > 階層がおかしくなっていまったことがあったので そういう場合は, ムービークリップの _lockrootプロパティ(一応プロパティらしいです)を使えば良いと思います。 a_mc に外部 SWF を読み込んだ場合, a_mc._lockroot = true; と書くかもしくは, 読み込まれる外部 SWF のフレーム1などに this._lockroot = true; と書くと, その SWF 内で _root がロックされるので,_root が親SWFに移動しなくなります。 プロパティを設定するタイミングなどが色々ややこしいので, 普通は,読み込まれる外部 SWF のフレーム1の方に, this._lockroot = true; を書くのが一般的なようです。 読み込まれる側の SWF を単体で動作させるときにすでに書いてあっても,何の支障もありません。 FlashMX2004(Flash Player 7)以上。

Flash-love
質問者

お礼

ありがとうございました。 _lockrootプロパティの件は、目からうろこです。 勉強不足では、ありますが。 描きたい、作りたいから始まってしまうので、その都度、本を開きながら探しながら何とかしてしまっていました。 いろいろとわかりやすく丁寧なご回答、ありがとうございました。 独学で突き進んでいる身には、大変ありがたい場です。 ご親切を感謝します。

  • zari514
  • ベストアンサー率48% (26/54)
回答No.1

...状況が分かりません。 ステージにどんな要素があって、どこにスクリプトが書かれてて、 何をどうしたくて、どううまくいかないのかを、ご説明ください。

Flash-love
質問者

補足

説明が足りなくてすみません。ブロック崩しゲームです。 ステージに4種のブロックが30個ランダムに並べています。 このブロックがはじめはシルエットになっていて、1回目ヒットで シルエットがなくなり2回目でブロックが消えるということをしたいのです。このスクリプトが書かれているのは、ステージ外に配置したブロックと玉のヒットテストを管理するコントロールmcです。 ヒットが1回目か2回目かを判断させて、その場合の処理を入れようとしたのですが、if文が通らなくてブロックにヒットテストされません。 入れ方なのか、書き方なのかわからない状況です。上記はスクリプトの一部ですが、trace((eval ("atari" + i)));で結果が出てこないのでこれがいけないのかと思っているところです。よろしく、お願いします。

関連するQ&A

  • 良いソースの書き方について(複数のインスタンスをまとめてヒットテストする方法)

    ■例文: ---------------------------------------------------------------- onClipEvent (enterFrame) { if ( this.hitTest(_root.char1)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char2)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char3)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char4)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char5)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char6)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char7)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char8)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char9)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char10)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char11)) { _parent.nextFrame(); } } ---------------------------------------------------------------- 上記は、_root.char1 から_root.char11までインタンス名をつけたムービークリップとのヒット確認をするアクションスクリプトです。 こういう動作をしたい場合。 for文を駆使する等で、ソースを短くまとめる方法はありませんでしょうか。 いい案がありましたら、是非ご教授の程宜しくお願い致します。

    • ベストアンサー
    • Flash
  • for文での配列の書き方で質問です

    CS3でゲームを作っています。 レモンが31個あり落ちてくるのをうけとります。 この受け取るときのfor文に以下のように書きました。 lemon_s.lemon0.hana.kajituの0~30までを参照したいのですが 配列のところがわかりません。 _root["lemon_s.lemon"] + i+["hana.kajitu"] というのがたぶん違っていてうまくいかないのだと思いますが 正しい書き方を教えてください。 onClipEvent (enterFrame) { for (i = 0; i < 30; i++) { if (this.in_ok.hitTest (_root["lemon_s.lemon"] + i+["hana.kajitu"])) { _root.point++; trace (_root.point); _root["lemon_s.lemon"] + i+["hana"].gotoAndStop (3); } } }

  • 格納式の動くメニューとヒット領域判定について

    ロゴをさわると格納されていたメニューがモーションを伴いながらでて、そのまま消えずに維持、一定以上左のエリアにいってしまうとメニューが消えるメニューを作りたいと思っています。 http://fashion.dior.com/dior.html イメージとしてはこちらのどれかリンクを選んでいただいて各コンテンツを表示させるメニューをクリックした時の動きが近いです。 格納→維持→エリア外にいくと消えるしくみまではなんとか作れたのですが、不思議なことにメニューが現れるときにモーションをともなわず、最後のフレームだけが再生されるようになってしまいました。 なお、ロゴには下記のスクリプトをつけました。 ヒットテストにしていないのはその後も条件をつけるためにはヒットテストだとできない?かなと思ったからです。 onClipEvent (mouseMove) { if (this._parent._xmouse>749.6 && this._parent._xmouse<966.6 && this._parent._ymouse<228.6 && this._parent._ymouse>28.6) { this._parent.menu.gotoAndPlay(2); } else if (this._parent._xmouse<698.9) { this._parent.menu.gotoAndStop(1); } else { this._parent.menu.gotoAndStop(7); } } 表示させるメニューのムービークリップ(menu)には onClipEvent (mouseMove) { if (this._parent._xmouse>698.9) { this.gotoAndStop(7); } else if (this._parent._xmouse<698.9) { this.gotoAndStop(1); } } と書きました。 かなり無理矢理なスクリプトだと思いますがご教授お願いします。! ちなみに制作環境はflashMX2004です。

  • if文について

    ソートのプログラムにおいて昇順・降順を選択して表示させるプログラムを書いてるのですが 下記のように記述するとエラーが出てしまいます。 よく調べたのですがエラー表示もよくわからないものなのでした。 どのようにすればうまく動くようになるのでしょうか? #include <stdio.h> #define swap(type, x, y) do {type t = x; x = y; y = t; } while (0) void bubble(int a[], int n) { int i, j; for (i = 0; i < n - 1; i++) { for (j = n - 1; j > i; j--) if (a[j - 1] > a[j]) swap(int, a[j - 1], a[j]); } } void bubble2(int a[], int n) { int i, j; for (i = 0; i < n - 1; i++) { for (j = n - 1; j > i; j--) if (a[j - 1] < a[j]) swap(int, a[j - 1], a[j]); } } int main(void) { int i; int x[7]; int nx = sizeof(x) / sizeof(x[0]); int select; printf("%d個の整数を入力せよ。\n", nx); for (i = 0; i < nx; i++) { printf("x[%d] : ", i); scanf("%d", &x[i]); } printf("昇順ですか降順ですか? 0:昇順/1:降順 >"); scanf("%d",&select); if (select == 0) bubble(x, nx); puts("昇順にソートしました。"); for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]); else bubble2(x, nx); puts("降順にソートしました。"); for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]); return (0); }

  • 配列アクセスで困っています

    WINXP Flash8です。とても基本的な質問ですみません。 t0.gotoAndStop (2); t1.gotoAndStop (2); t2.gotoAndStop (2); をt19まで続けたいのですが、for文がうまくできません。 for (i = 0; i < 20; i++) { t[i].gotoAndStop (2); } ではないようで、どうしたらいいのか悩んでいます。 よろしく、お願いします。

    • ベストアンサー
    • Flash
  • getTaimerがうまく動作してくれません

    いつも、ありがとうございます。FlashMXです。 衝突の後の少しの時間ボタンの使用を無効にしたいので以下のようなスクリプトをムービークリップに入れましたが、無効になった後に戻りません。 getTimerが効いていないのでしょうか?困っています。 onClipEvent (enterFrame) { if (_parent._parent.shin.hitTest(this)) { _parent._parent.shin.gotoAndStop("hit"); start = getTimer(); timer = 0.05*1000; if (getTimer()>start+timer) { _parent._parent.btn_l._visible = true; _parent._parent.btn_u._visible = true; _parent._parent.btn_r._visible = true; } else { _parent._parent.btn_l._visible = false; _parent._parent.btn_u._visible = false; _parent._parent.btn_r._visible = false; } } }

    • ベストアンサー
    • Flash
  • 衝突している間、違うポーズに変えたい

    いつもありがとうございます。MAXOS10でFlash8です。 障害物に衝突している間は、違うポーズにしたいのでhitTestを使って以下のようなスクリプトを障害物のmcに入れました。 衝突すると、泳ぐ人は立ち上がるポーズになるのですが、その後、障害物がなくなっても立ったまま、泳いでいってしまいます。 ポーズは、泳ぐ人のmcに複数作ってフレーム移動で変えています。 衝突していた、障害物がなくなったら元のように泳いでほしいのですが、 うまくいきません。よろしく、お願いします。 onClipEvent (enterFrame) { tmp = this.hitTest (this._parent._parent.swim_02); if (tmp == true) { _parent._parent.swim_02.gotoAndPlay ("gool"); _parent._parent.swim_02._x = this._x; } }

  • 続ドラッグ&ドロップ

    前に回答頂いたのですが、 お皿に乗った果物の上にさらに置くことができてしまうところを 置けないようにしたいのですが、どのようにしたらいいでしょうか? もう1点なのですが、果物をお皿以外でreleaseしたら、果物の位置を 元の位置に戻にはどうしたらいいでしょうか? たいへん申し訳ないのですがよろしくお願いします。 onClipEvent (load) { // osara の枚数を登録 var o_num = 3; // kudamono の個数を登録 var k_num = 5; } // on (press) { // ドラッグ開始(中央に吸着) startDrag(this, true); // 全ての osara を フレーム2 に進ませる for (var i = 0; i<o_num; i++) { _root["osara"+i].gotoAndStop(2); } // もし,osara が kudamono のどれかとヒットしていれば for (var i = 0; i<o_num; i++) { for (var j = 0; j<k_num; j++) { if (_root["osara"+i].hitTest(_root["kudamono"+j])) { // その osara を フレーム1 へ _root["osara"+i].gotoAndStop(1); } } } } // on (release) { for (var i = 0; i<o_num; i++) { //ドラッグ中のMCの真下にosara? があれば if (_root["osara"+i].hitTest(_root._xmouse, _root._ymouse, true)) { // ドラッグ中のMCを osara? に吸着 this._x = _root["osara"+i]._x; this._y = _root["osara"+i]._y; } } // // 全ての osara を フレーム1 に進ませる for (var i = 0; i<o_num; i++) { _root["osara"+i].gotoAndStop(1); } // ドラッグ終了 stopDrag(); } // onClipEvent (mouseMove) { updateAfterEvent(); }

  • If分の記述???

    1~31までの数字のうち、重複しない5つの数字をランダムに選び出し、ページ表示させるプログラムを作っているのですが、どういう訳か、最初のIf分の箇所が構文エラーでひっかかるんです。 一体、記述がどう間違っているんでしょうか? PerlCGIはまだまだ初心者なので、どなたかHelpMe!(T_T) #! c:/perl/bin/perl #----------------------------------------数字生成 for ($i = 0; $i < 5; ++$i) { #重複確認フラグリセット $j = 0 while ($j = 1) { #数字を選ぶ $NUM = int(rand 31) + 1; #重複チェック #1個目確認処理なし if ($i == 0) { ++$j; } #2個目確認処理 elsif ($i == 1) { if ($Res[0] != $NUM) { ++$j; } } #3個目確認処理 elsif ($i == 2) { if ($Res[0] != $NUM and $Res[1] != $NUM) { ++$j; } } #4個目確認処理 elsif ($i == 3) { if ($Res[0] != $NUM and $Res[1] != $NUM and $Res[2] != $NUM) { ++$j; } } #5個目確認処理 elsif ($i == 4) { if ($Res[0] != $NUM and $Res[1] != $NUM and $Res[2] != $NUM and $Res[3] != $NUM) { ++$j; } } } #値代入 $Res[$i] = "$NUM"; } #---------------------------------------ページ出力 print qq(Content-type: text/html; charset=Shift_JIS\n\n); print qq(<HTML>\n); print qq(<Head><Title>Test</Title></Head>\n); print qq(<Body><Center><P>数字は...<BR><Big>\n); for ($i = 0; $i < 5; ++ $i) { print qq($Res[$i]<BR>\n); } print qq(</Big>です。</P><Center></Body></HTML>\n);

    • ベストアンサー
    • CGI
  • FlashMXアクションスクリプトの記述で分からないのですが…

     現在FlashMXのアクションスクリプトを勉強中で購入した書籍に、マウスカーソルを動かすとカーソルに着いていき波紋が広がるというのがあるのですが、マウスカーソルがステージ上からなくなっても波紋が残ってしまいます。この波紋を残さないようにする記述方法をどなたか教えて下さい。WindowsXP環境です。 onClipEvent (load) { if (_name == "mc") { _visible=false; max = 10; //複製する個数 for (i=0; i<max; i++) { this.duplicateMovieClip(i, 100+i);//複製 } } } onClipEvent (mouseMove) { if (_name == "0") {//一つ目のmcはマウスの座標とする _x = _parent._xmouse; _y = _parent._ymouse; } else {//それ以後は自分の名前から-1引いたインスタンス名の座標を取得する _x = _parent[int(_name)-1]._x; _y = _parent[int(_name)-1]._y; } updateAfterEvent(); } と記述されています。インスタンスmcはシェイプトゥイーンで、円が徐々に大きくなり、消えていくアニメーションを設定しています。

専門家に質問してみよう