• ベストアンサー

画像のランダム配置からボタンクリックでまとまる

「ロールオーバーで下画像を表示させる」という質問の回答がありました。 同じような設定で、ステージを400x400、mc0~mc15をランダムに並べておき 別に置いたボタンをクリックすると正しい座標位置へゆっくり移動し、ひとつの 写真にできあがるというのを作りたく思います。 mc0~mc15は写真をスライスした画像100x100です。 ご教授願います。

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

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

#1です。 > やってみましたが、動作しないのです。 と書かれましても どこで何がどう動作しないのかがわかりません。 例えば 「エラーが出て全く動作しない(パブリッシュも不可)」 「エラーは出ないがmc0~15がランダムに配置されない」 「mc0~15はランダムに配置されるがボタンで並び変わらない」 などなど様々なことが考えられます。 その状況を見ていない第三者にとっては 状況を見ている人よりももっと何のことかわからないのですよ。 一応私の方は ActionScript 2.0 設定であれば Flash Player 6 以上 SWF パブリッシュ設定 で動作確認済みです。 どこで詰まっているのかさっぱりわかりませんので スクリプトを次のように書き替えて(★部分の trace を追加しただけ), 「制御」→「ムービープレビュー」で詰まっている部分を確認してみてください。 //---------------------------------------------------- //動くスピードの設定 var spd:Number = 12/100; //mc0~15 の最初の座標を一時的に記録する配列 var tempPosArr:Array = new Array(); //変数 i を 0~15 まで 1 ずつ加算しながらループ for (var i:Number = 0; i<=15; i++) { //mc0~15 の最初の座標(「正しい座標」)を各MC内の変数に記録 this["mc"+i].start_x = this["mc"+i]._x; this["mc"+i].start_y = this["mc"+i]._y; //mc0~15 の最初の座標を一時的に記録する配列に記録 tempPosArr[i] = [this["mc"+i]._x, this["mc"+i]._y]; trace("★↓ mc" + i + ".star_x に値が入っているか"); trace(this["mc"+i].start_x); trace("★↓ tempPosArr[" + i + "] に値が入っているか"); trace(tempPosArr[i]); } //mc0~15 を配置するランダムな座標の配列 var randPosArr:Array = new Array(); //テンポラリ配列からランダムな要素を抜き取りランダムな座標の配列に代入 for (var i:Number = 15; i>=0; i--) { randPosArr.push(tempPosArr.splice(Math.floor(Math.random()*(i+1)), 1)[0]); } trace("★↓ randPosArr に値が入っているか"); trace(randPosArr); //mc0~15 をランダムな座標に配置 for (i=0; i<=15; i++) { this["mc"+i]._x = randPosArr[i][0]; this["mc"+i]._y = randPosArr[i][1]; trace("★↓ mc" + i + " の座標はランダムになっているか"); trace(this["mc"+i]._x + "," + this["mc"+i]._y); } //ボタンクリック時の動作 btn.onRelease = function():Void { trace("★↓ ボタンは動作しているか"); trace("ボタンがクリックされました"); //変数 i を 0~15 まで 1 ずつ加算しながらループ for (var i:Number = 0; i<=15; i++) { //mc0~mc15に毎フレーム実行する動作を定義 this._parent["mc"+i].onEnterFrame = function():Void { //「正しい座標」に向けてspdの割合ずつ移動 this._x += (this.start_x-this._x)*spd; this._y += (this.start_y-this._y)*spd; }; } }; //---------------------------------------------------- それと 他のスクリプトや他のインスタンスがじゃまをしているということはないでしょうね? 例えば, 同じインスタンス名を付けた別物があるとか 他の onEnterFrame が重なって動作しているとか。 「制御」→「ムービープレビュー」で 下の【図】↓のような感じになれば良いのです。 この↓状態から btn をクリックすれば「正しい位置」に戻ります。

noname#142022
質問者

お礼

>その状況を見ていない第三者にとっては >状況を見ている人よりももっと何のことかわからないのですよ。 申し訳ありませんでした。 出力では下記で止まります。もちろん、それはボタンを押していませんからそのように なりますね。 ★↓ mc15 の座標はランダムになっているか 300,300 次に、ボタンを押しても出力しませんでした。ということはボタンに何かと思い調べました ところ、インスタンス名が大文字になっていました。 修正したところ、動作しました。 ★↓ ボタンは動作しているか ボタンがクリックされました 早朝からの回答を頂きましてありがとうございます。

その他の回答 (1)

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

念のためですが 「ロールオーバーで下画像を表示させる」 http://okwave.jp/qa/q7020788.htmlhttp://okwave.jp/qa/q7020788.html などなど の続きというわけですから, Flash CS3 の ActionScript 2.0 ですね。 まず > 正しい座標位置へゆっくり移動 この具体的方法(トランジション)を書かれていませんから これは勝手にこちらで用意するものとします。 『「最初にmc0~mc15を配置した座標」を 「正しい座標」として記録しておいてから ActionScript で mc0~mc15 ランダムな座標に配置し, その後,ボタンをクリックすると 「正しい座標」=「最初にmc0~mc15を配置した座標」に戻す。』 という方法はいかがでしょうか。 これだと ステージのサイズを変えた場合や ムービークリップを配置したい場所を変えたい場合でも スクリプトを触ることなく自由に Flash を作ることが可能になります。 ステージ上には mc0~mc15 のムービークリップを いわゆる「正しい位置」(任意の「正しい位置」)に配置しておきます。 その上のレイヤーにでもボタンを作成して そのボタンには「btn」というインスタンス名を付けるものとしておきます。 ※【図】↓参照 この状態で フレームに書くスクリプト例です。 //--------------------------------------------------- //動くスピードの設定 var spd:Number = 12/100; //mc0~15 の最初の座標を一時的に記録する配列 var tempPosArr:Array = new Array(); //変数 i を 0~15 まで 1 ずつ加算しながらループ for (var i:Number = 0; i<=15; i++) { //mc0~15 の最初の座標(「正しい座標」)を各MC内の変数に記録 this["mc"+i].start_x = this["mc"+i]._x; this["mc"+i].start_y = this["mc"+i]._y; //mc0~15 の最初の座標を一時的に記録する配列に記録 tempPosArr[i] = [this["mc"+i]._x, this["mc"+i]._y]; } //mc0~15 を配置するランダムな座標の配列 var randPosArr:Array = new Array(); //テンポラリ配列からランダムな要素を抜き取りランダムな座標の配列に代入 for (var i:Number = 15; i>=0; i--) { randPosArr.push(tempPosArr.splice(Math.floor(Math.random()*(i+1)), 1)[0]); } //mc0~15 をランダムな座標に配置 for (i=0; i<=15; i++) { this["mc"+i]._x = randPosArr[i][0]; this["mc"+i]._y = randPosArr[i][1]; } //ボタンクリック時の動作 //「mc0」 ~ 「mc15」ロールオーバー時の動作定義 btn.onRelease = function():Void { //変数 i を 0~15 まで 1 ずつ加算しながらループ for (var i:Number = 0; i<=15; i++) { //mc0~mc15に毎フレーム実行する動作を定義 this._parent["mc"+i].onEnterFrame = function():Void { //「正しい座標」に向けてspdの割合ずつ移動 this._x += (this.start_x-this._x)*spd; this._y += (this.start_y-this._y)*spd; }; } }; //--------------------------------------------------- ランダムシャッフルの方法ですが このスクリプトで書いたもの以外に 次のような考え方(方法)などなどもあります。 「配列を偏りなくランダムに並替える」 http://fumiononaka.com/TechNotes/Flash/FN0212003.html

noname#142022
質問者

お礼

いつもありがとうございます。 やってみましたが、動作しないのです。

関連するQ&A