- ベストアンサー
3つ以上のインスタンスの移動
まだ初心者ですので、少々わかりにくい質問になっているかもしれませんが、よろしくお願いします。 5マスが2列の計10マスのマス目があったとして、そこの1列目の各マスに1つずつ計5個のボールが並べてあるとします。ボールをクリックすると2列目の中央に移動し、他のボールをクリックするとそのボールが2列目の中央に表示され、その前のボールは元の位置に戻る、という内容のモノを作ろうとしたのですが、上手くいきません。 私のやった事としては、グローバル変数の宣言を各ボール毎に設定して、 on (release) { _global.Hflag = 2; if (_global.Hflag == 2) { this._x = 300; this._y = 200; } else { this._x = 200; this._y = 100; } } と書いて見たのですが、どうも見当違いだったようで、移動はするものの他のボールをクリックしてもボール2は元の位置に戻ってくれません。 上記載の様な事をしたい場合、どの様な方法があるでしょうか? ご教授いただければと思います。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
on (release) {//このインスタンスをクリックしたら _global.Hflag = 2;//グローバル変数 Hflag に 2 を代入するよ if (_global.Hflag == 2) {//もしグローバル変数 Hflag が 2 だったら 中略 } else {//グローバル変数 Hflag が 2 じゃなかったら 後略 これが質問者さんの記述したスクリプトの流れです 「クリックしたらまず Hflag が 2 になるので else のほうは絶対通らない」 というのがこれを見て理解できるでしょうか そして、「このインスタンスをクリックしたら」なので、 例えば A をクリックしても B のクリック用のスクリプトは実行されないことを頭に入れておきましょう 実現方法は数多く考えられますが、質問者さんの内容の延長で考えると下記のような感じでどうでしょうか //ムービークリップで作られたボール5つ毎の設定が必要です //質問の際に書かれたのは左から2番目のon(release)として //書かれたのではと仮定しています onClipEvent (load) {//読み込んだらまず実行 //自分の番号 this.Hflag = 2;//2番目のだから 2 。 3番目だったら 3 等 } on (release) {//クリックしたら _global.Hflag = this.Hflag;//グローバル変数 Hflag に自分の番号を入れる } onClipEvent (enterFrame) {//フレームレートに同期して実行 if (_global.Hflag == this.Hflag) {//グローバル変数 Hflag と自分の番号が一緒だったら this._x = 300; this._y = 200; } else { this._x = 200;//1番目だったら 100 5番目だったら 500 等 this._y = 100; } }
その他の回答 (1)
「3つ以上のインスタンスの移動」という題名と, ご質問内容がずれていますし (ご質問内容は2つのインスタンスの移動に見えます), この後,どう発展するのわかりませんので, ちゃんとした回答は書けませんが, 私なら次のようにします。 まずボールにインスタンス名を付けます。 ボールの並びが横並びなのか縦並びなのかわかりませんが, なんとなく座標の数値から 一応横並びということと解釈して↓, ● ● ● ● ● ○←移動位置 例えば左の端のボールから順に, 「ball1」, 「ball2」, 「ball3」, 「ball4」, 「ball5」 というインスタンス名を付けます。 そしてフレームに次のようなスクリプトを書けば完成です。 ------------------------------------- // ボールを戻す関数 ballMove0 の定義 _global.ballMove0 = function() { _root.ball1._x = 100; _root.ball1._y = 100; _root.ball2._x = 200; _root.ball2._y = 100; _root.ball3._x = 300; _root.ball3._y = 100; _root.ball4._x = 400; _root.ball4._y = 100; _root.ball5._x = 500; _root.ball5._y = 100; }; // // ballMove0 の実行(初期位置整列のため) ballMove0(); // // 各ボールのクリック動作を定義(全て同じ) for (var i = 1; i<=5; i++) { _root["ball"+i].onRelease = function() { // ballMove0 の実行 ballMove0(); this._x = 300; this._y = 200; }; } ------------------------------------- また, ボールが,ボタンシンボルのインスタンスではなく, ムービークリップインスタンスである場合, 上のスクリプトの -------------------------------- // 各ボールのクリック動作を定義(全て同じ) for (var i = 1; i<=5; i++) { ~略~ }; } -------------------------------- この部分は,フレームに書かずに, 各ボールに全て同じように, ------------------------------------- on (release) { // ballMove0 の実行 ballMove0(); this._x = 300; this._y = 200; } ------------------------------------- と書きつづけても良いです。 同じ事ばかり書くのは面倒なので, フレームに for文 でまとめて書いただけです。 ボール自身は,クリックされたら必ず, this._x = 300; this._y = 200; に移動するのですから if文 は不要です。 またクリックされなかったボールは, 何が何でも元の位置に帰るのですからこれまた if文 は不要です。 この後どう発展するのかはわからないので, これが良いとは絶対に言えません。 「ご参考までに」という回答です。
お礼
sassakunさん書き込みありがとうございます。 for文はまだ数回しか書いた事がないという感じで、なれていないのですが、sassakunさんの書き込みを例にforにも取り組んでみようと思っています。 貴重な書き込みありがとうございます。勉強させていただきます。 書き込みありがとうございました(^0^。
お礼
suzukiさん、書き込みありがとうございます。 ご指導いただいた内容とても分かりやすく、理解が出来たきがします。 enterFrameでなければならない事や変数の宣言の仕方が悪かった事など大変参考になりました。 説明不足な点なども補っていただくかたちで、ご教授いただきありがとうございます。 大変わかりやすく、とても勉強になりました。 ありがとうございました(^0^。