- ベストアンサー
AS3でムービークリップを減速して中央に移動する方法
- AS3でステージのサイズを変えた時にムービークリップが減速して中央に移動させたいです。
- 現在はリサイズするとムービークリップはステージ中央にありますが、参考にしているサンプルのように減速して中央に移動する方法がわかりません。
- どなたかアドバイスをいただけないでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1(#2)です。 #2の補足より > どこが間違っているのでしょうか? わけわからん人のわけわからんスクリプトを鵜呑みにして改造するより 普通に(←普通の算数レベル)で「自分で考える」をすれば良いのではないでようか。 ↓↓↓ ------------------------------------- stage.align=StageAlign.TOP_LEFT; stage.scaleMode=StageScaleMode.NO_SCALE; // ↓★この2行を加えるだけ my_mc.x = (stage.stageWidth - my_mc.width)/2; my_mc.y = (stage.stageHeight - my_mc.height)/2; const spd:Number=1/5; my_mc.addEventListener(Event.ENTER_FRAME, center_movie); function center_movie(event:Event):void { my_mc.x += ((stage.stageWidth - my_mc.width)/2 - my_mc.x)*spd; my_mc.y += ((stage.stageHeight - my_mc.height)/2 - my_mc.y)*spd; } -------------------------------------- 間違っているのは, 質問者さんのやりかた(考え方)の方針です。 なぜ妙なスクリプトを意味もなく真似ていじろうとするのですか? ※あまり他サイトの人の悪口は言いたくありませんが, 私はその質問されているサイトの管理者(K氏)の好い加減で 間違いだらけで古くさい(当時から古くさい)スクリプトや論に 迷惑を被っている多くの人たちのうちの1人です。 かつては彼のわけわからん論の尻ぬぐいが多かったです。 ※そのサイトのBBSでボランティアで回答している K氏を除く方々は良い回答をされる方が多いです。
その他の回答 (2)
- BlurFiltan
- ベストアンサー率91% (1611/1754)
#1 です。 > それで「こまかいところで変な場所もありますが」っていうのが > ちょっと気になったんですが、 細かいことというか, 「何???」 なことですね。 ご質問で書かれていらっしゃるスクリプトの骨組みです。 // ステージリサイズ時に実行する関数を定義 function resize_control(eventObject:Event):void { ~略~ // 定数 1/5 を設定 const spd:Number=1/5; // my_mcにイベントリスナーを登録 my_mc.addEventListener(Event.ENTER_FRAME, center_movie); // 1フレーム進む時間毎に実行する関数を定義 function center_movie(event:Event):void { ~略~ } } ステージがリサイズされるたびに同じ定数を何度も定義するのは変です。 同じ変数を何度も定義するのでも同じです。 また同じく, ステージがリサイズされるたびに同じイベントリスナーや同じ関数を何度も定義するのは変です。 変な上に無駄なCPUを使います。 ついでに, Event.ENTER_FRAME 指定で実行される関数の初回実行は, そのスクリプトを書いた次のフレーム時間です。 つまりプログラム的に言えば,かなり後ということになります(人間的に言えば一瞬ですが。)。 ちなみに, 私が #1 で書いた, var spd:Number=1/5; の部分は, 勝手に書き換えた物をそのまま貼り付けてしまったもので, const spd:Number=1/5; のままでもかまいません。
補足
あっそういうことなんですね、わかりました。 それで減速してステージ中央に動かすことはできましたが、このままだとswfにアクセスした瞬間左上から中央に向かってのアニメーションから始まってしまいます。そこで上記のサンプルFlashみたいに function setPos() { mc._x=(Stage.width-mc._width)/2; mc._y=(Stage.height-mc._height)/2; } sL=new Object(); setPos(); sL.onResize=function() { if (getTimer()<1000) { setPos(); } }; Stage.addListener(sL); を真似て stage.addEventListener(Event.RESIZE, FirstCenter); function FirstCenter(event:Event):void { if (getTimer()<1000) { my_mc.x=(stage.stageWidth - my_mc.width)/2; my_mc.y=(stage.stageHeight - my_mc.height)/2; } } とやって追加しましたが、左上からのアニメーションから始まってしまいます。 どこが間違っているのでしょうか?
- BlurFiltan
- ベストアンサー率91% (1611/1754)
こまかいところで変な場所もありますが, そういう細かい点は抜きにして, パッと見大きく間違っているところは次の部分です ステージがリサイズされます。 そのときに my_mc.x = (stage.stageWidth - my_mc.width)/2; my_mc.y = (stage.stageHeight - my_mc.height)/2; が実行されます。 つまりこれで,ステージがリサイズされると,瞬時にムービークリップmy_mcが中央配置されてしまいます。 その後,徐々にムービークリップmy_mcをステージ中央にしようとしても, すでに中央なんですから,それ以上中央に行くはずがありません。 したがってこれだけで良いでしょう?↓ ----------------------------------------- stage.align=StageAlign.TOP_LEFT; stage.scaleMode=StageScaleMode.NO_SCALE; var spd:Number=1/5; my_mc.addEventListener(Event.ENTER_FRAME, center_movie); function center_movie(event:Event):void { my_mc.x += ((stage.stageWidth - my_mc.width)/2 - my_mc.x)*spd; my_mc.y += ((stage.stageHeight - my_mc.height)/2 - my_mc.y)*spd; } ----------------------------------------- なお, 参考にされた元のFlashは, 表示されてから最初の1秒以内のステージリサイズに限って, ムービークリップmy_mcを,即中央配置しているのですよ。 1秒経過後以降のリサイズでは, ムービークリップmy_mcの中央配置は実行されません。 1秒経過後以降は, ムービークリップ自体に書いてあるこれ↓のみが動作します。 ----------------------------------- onClipEvent (enterFrame) { xm = (Stage.width-this._width)/2; ym = (Stage.height-this._height)/2; this._x += (xm-this._x)/4; this._y += (ym-this._y)/4; } ----------------------------------- だから,参考サンプルは徐々に近づくのです。
補足
あっ問題なくできました。ありがとうございます。 それで「こまかいところで変な場所もありますが」っていうのがちょっと気になったんですが、 自分のコーディングどう直したらもっと良くなりますか? きちんとしたコーディングができるようになりたいので、もしよかったら教えてください。
お礼
> 間違っているのは, > 質問者さんのやりかた(考え方)の方針です。 > なぜ妙なスクリプトを意味もなく真似ていじろうとするのですか? 確かに鵜呑みにしていました。正直あのサイトのサンプルを参考にしていました。 実際質問2をした後自分で以下↓を追加したら、狙い通りできました。 my_mc.x = (stage.stageWidth - my_mc.width)/2; my_mc.y = (stage.stageHeight - my_mc.height)/2; ですが参考にしていたファイルにはif (getTimer()<1000) {...が書いてあったので、 そうしないといけないものだと思い込んでいたのでまた質問させてもらったのです。 たしかにあのサイトのサンプルはソースが複雑で分かりにくいコーディングがしてあります。でもそれが当たり前のものだと思いなんとか理解しようとしていました。 今回のBlurFiltanさんの指摘を受けて初めてそのサイトの実態を知ったので、これから自分の方針を正して行こうと思います。 ありがとうございました。