- 締切済み
アクションスクリプトのフォトビューアの制作にあったての質問
フォトビューア作成で困っています。 http://hfm-kenchan.com/Lesson/sample/daniwell_3d.htm これがサンプルのフラッシュです。 各BOXごとにムービクリップローダーで外部からイメージ写真を読み込ませるところまでできたのですが 画面の中央に来た写真をクリックすると拡大表示されて、マウスが写真上からなくなると元に戻るようにしたいのですどうしてもできません。 これが、そのスクリプトです。 Stage.scaleMode = "exactFit"; var yoko :Number = 4; var oku :Number = 4; var edge :Number = 5; var cx :Number = 320; var cy :Number = 0; var vp :Number = 200; var sx :Number = 400; var sy :Number = 240; var sz :Number = 100; var nx :Number = 0; var nz :Array = new Array(); var ax :Array = new Array(); var az :Array = new Array(); function func_projection ( px :Number, py :Number, pz :Number, cx :Number, cy :Number, f :Number ) :Object { var s :Number = f /( f - pz ); var obj :Object = new Object(); obj.x = cx + s * px; obj.y = cy + s * py; obj.s = s * 100; return( obj ); } var mcl :MovieClipLoader = new MovieClipLoader(); var listener :Object = new Object(); listener.onLoadInit = function ( mc :MovieClip ) { mc._x = -mc._width/2; mc._y = -mc._height/2; with ( mc._parent.back ) { _width = mc._width + edge*2; _height = mc._height + edge*2; _x = mc._x - edge; _y = mc._y - edge; } } mcl.addListener( listener ); for ( var i = 0; i < yoko; i ++ ) { az[ i ] = new Array(); for ( var k = 0; k < oku; k ++ ) { var mc :MovieClip = _root.attachMovie( "box", "box"+ i +"_"+ k, (yoko-k) * yoko + i ); mc.createEmptyMovieClip( "image_load", 0 ); mcl.loadClip( "image"+ i +"/image"+k+".jpg", mc.image_load ); var obj :Object = func_projection( i * sx, sy, - k * sz, cx, cy, vp ); mc._x = obj.x; mc._y = obj.y; mc._xscale = mc._yscale = obj.s; mc.i = i; mc.k = k; mc.onPress = function ( ) { nx = this.i; for ( var i = 0; i < yoko; i ++ ) nz[ i ] = 0; nz[ this.i ] = this.k; } az[ i ][ k ] = - k * sz; } ax[ i ] = i * sx; nz[ i ] = 0; } _root.onEnterFrame = function ( ) { for ( var i = 0; i < yoko; i ++ ) { ax[ i ] += ( (i-nx) * sx - ax[ i ] ) / 5; for ( var k = 0; k < oku; k ++ ) { var mc :MovieClip = _root[ "box"+ i +"_"+ k ]; mc.swapDepths( (yoko-k+nz[i]) * yoko + i ); az[ i ][ k ] += ( (-k+nz[ i ]) * sz - az[ i ][ k ] ) / 5; if ( az[ i ][ k ] <= 0 )mc._alpha = 100; else mc._alpha = (sz-az[ i ][ k ])/sz * 100; if ( 1 < mc._alpha ) mc._visible = true; else mc._visible = false; var obj :Object = func_projection( ax[ i ], 240, az[ i ][ k ], cx, cy, vp ); mc._x = obj.x; mc._y = obj.y; mc._xscale = mc._yscale = obj.s; } } } http://hfm-kenchan.com/Lesson/contents/index.htm このサイトを参考にしています。 アクションスクリプトに詳しい方 よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- BlurFiltan
- ベストアンサー率91% (1611/1754)
書かれていらっしゃるサンプルとやらはここからDLできる分ですね↓。 http://hfm-kenchan.com/Lesson/contents/s868.htm > アクションスクリプトに詳しい方 > よろしくお願いします。 と言いますか,スクリプトに詳しい詳しくないではなくて, 3D座標系をどうするかを 「考えるアイデア」 の問題だと思います。 アイデア に沿って コーディング するわけですから アイデア=方針 によって変わると思います。 上記URLからDLできるサンプルでは, 決まった座標系(透視変換の座標系)があるのです。 > 画面の中央に来た写真をクリックすると拡大表示されて、 > マウスが写真上からなくなると元に戻るようにしたい という状態は, 完璧にこの座標系(透視変換の座標系)から逸脱した(はみだした)ものだと思います。 その 座標系 からはみだすのでしたら, いっそのこと,別のものを作り出せば簡単になると思います。 ↑というのは私の勝手なアイデアですよ。 全く別の対処法もあると思います。 ASに詳しいか詳しくないかではなくて どうするかを考える路線によってスクリプトは変わります。 上記URLからDLできるサンプルの > var ax :Array = new Array(); // x 座標計算 > var az :Array = new Array(); // z 〃 > > //----------------------------------// > > /* 座標(x,y,z), 中心(cx,cy), 視点(f) を与えると、 > x, y 座標とスケール s を持つオブジェクトを返す関数 */ > function func_projection ( px :Number, py :Number, pz :Number, cx :Number, cy :Number, f :Number ) :Object { という部分に1行付け足します↓。 var ax :Array = new Array(); // x 座標計算 var az :Array = new Array(); // z 〃 //----------------------------------// // ★付け加え // 変数 select_mc に現在選択されている MC の名前を記録 var select_mc:String = "box0_0"; /* 座標(x,y,z), 中心(cx,cy), 視点(f) を与えると、 x, y 座標とスケール s を持つオブジェクトを返す関数 */ function func_projection ( px :Number, py :Number, pz :Number, cx :Number, cy :Number, f :Number ) :Object { そして, > mc.onPress = function ( ) { // マウスで押したとき > nx = this.i; // 列番号 > > nz[ this.i ] = this.k; // 奥行き番号 > } という部分を次のようにします。 mc.onPress = function ( ) { // マウスで押したとき nx = this.i; // 列番号 // もし 変数 select_mc にこのMCの名前が入っていれば if(select_mc == this._name){ // このMC を「new_mc」という名で最高深度に複製 this.duplicateMovieClip("new_mc",_root.getNextHighestDepth()); // 「new_mc」に1フレーム進む時間毎に毎回実行する関数を定義 new_mc.onEnterFrame = function(){ // サイズを 200% に近付ける this._xscale += (200-this._xscale)/5; this._yscale += (200-this._yscale)/5; } // 「new_mc」からロールアウトしたときに実行する関数を定義 new_mc.onRollOut = new_mc.onDragOut = function(){ // このMCを消す this.removeMovieClip(); } }else{ select_mc = this._name; } for ( var i = 0; i < yoko; i ++ ) nz[ i ] = 0; // 全列の奥行き初期化(列が変わっても戻さない場合は、このループをコメントアウトする) nz[ this.i ] = this.k; // 奥行き番号 } 3D座標系からはみだすのですから, 独自のMC(ムービークリップ)「new_mc」をコピーで作ってしまって, 全く別の動作をさせるという内容です。 ※あくまでも DL できる FLA の書き換えです。 なお,duplicateMovieClip でコピーした 「new_mc」 には, > 各BOXごとにムービクリップローダーで外部から > イメージ写真を読み込ませるところまでできた という写真がロードされていないと思います。 ですから, この 「new_mc」 には再度イメージ写真をロードさせる必要があると思います。
補足
回答ありがとうございます。 遅くなって申し訳ありません。 贅沢な話ですが 「new_mc」を読み込むところまで教えていただけないでしょうか? ご教授よろしくお願いします。