重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

「ロールオーバーで下画像を表示させる」という質問の回答がありました。

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

A 回答 (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 をクリックすれば「正しい位置」に戻ります。
「画像のランダム配置からボタンクリックでま」の回答画像2
    • good
    • 0
この回答へのお礼

>その状況を見ていない第三者にとっては
>状況を見ている人よりももっと何のことかわからないのですよ。

申し訳ありませんでした。

出力では下記で止まります。もちろん、それはボタンを押していませんからそのように
なりますね。

★↓ mc15 の座標はランダムになっているか
300,300

次に、ボタンを押しても出力しませんでした。ということはボタンに何かと思い調べました
ところ、インスタンス名が大文字になっていました。
修正したところ、動作しました。

★↓ ボタンは動作しているか
ボタンがクリックされました

早朝からの回答を頂きましてありがとうございます。

お礼日時:2011/09/24 08:43

念のためですが


「ロールオーバーで下画像を表示させる」
http://oshiete.goo.ne.jp/qa/7020788.html
http://oshiete.goo.ne.jp/qa/7020788.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 …
「画像のランダム配置からボタンクリックでま」の回答画像1
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/09/23 22:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!