- ベストアンサー
FLASHアクションスクリプトでオブジェクトを常にセンター表示させる方法とは?
- アクションスクリプトを使用して、FLASHの画面上でオブジェクトを常にセンターに表示する方法について質問があります。
- 具体的には、オブジェクトを座標x600 y500で始まるように設定し、画面のサイズを拡大縮小してもオブジェクトが常にセンターに表示されるようにする方法を教えてください。
- また、提供されたアクションスクリプトではオブジェクトが指定の位置に表示されるものの、画面サイズの変更に伴って動きがなくなってしまいます。そのため、より正確にオブジェクトをセンターに表示する方法を知りたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
まず大前提の確認ですが, back_mc【背景】も,main_mc【オブジェクト】も, 基準点を左上のコーナーにしてあるムービークリップですよね (基準点の座標によってスクリプトは変わります)。 また,back_mc【背景】も,main_mc【オブジェクト】も, _root の直下に配置されていますよね。 そういう前提だと, ご質問の日本語通りにスクリプトを書き直すと次のようになります。 ----------------------------------- Stage.align = "TL"; Stage.scaleMode = "noScale"; // // main_mc を初期座標 (600,500) に配置 _root.main_mc._x = 600; _root.main_mc._y = 500; // back_mc のサイズをステージ全体に合わせる _root.back_mc._width = Stage.width; _root.back_mc._height = Stage.height; // // この階層(MC)を Stage クラスのリスナーとして登録 Stage.addListener(this); // // ステージのサイズが変わった時に実行 this.onResize = function() { // main_mc を ステージ中央に配置 _root.main_mc._x = (Stage.width-_root.main_mc._width)/2; _root.main_mc._y = (Stage.height-_root.main_mc._height)/2; // back_mc のサイズをステージ全体に合わせる _root.back_mc._width = Stage.width; _root.back_mc._height = Stage.height; }; ----------------------------------- ActionScriptという言語や, 座標の計算のなどの問題ではなくて, 肝腎の 「何がどうなったときに何をどうしたいのか」 ということ。 これがコーディングに欠けていると思います。 『最初はx=600,y=500 でステージがリサイズされたときに 中央』 これをそのままスクリプトにすると(コーディングすると), 上のようになると思います。 ======================= ちなみにどうでも良いことですが, 「私の個人的な好みのイメージ」として 上のようなスクリプトにしても 私が思う良い動き ではありません。 また,そうする意味をあまり感じません。 個人的には次のような動きにすると, x=600,y=500 にする意味もわかりますし,イメージ的にもしっくり来ます。 ----------------------------------- Stage.align = "TL"; Stage.scaleMode = "noScale"; // // 中央配置するスピードの変数 spd を設定 // (0以上1未満の数で好みによって変える) spd = 1/8; // // main_mc を初期座標 (600,500) に配置 _root.main_mc._x = 600; _root.main_mc._y = 500; // // この階層(MC)を Stage クラスのリスナーとして登録 Stage.addListener(this); // // ステージのサイズが変わった時に実行 this.onResize = function() { // back_mc のサイズをステージ全体に合わせる _root.back_mc._width = Stage.width; _root.back_mc._height = Stage.height; // 表示を即更新 updateAfterEvent(); }; // 上の this.onResize を即実行 this.onResize(); // // 1フレーム進む時間毎に随時実行 this.onEnterFrame = function() { // main_mc を ステージ中央に徐々に移動 _root.main_mc._x += ((Stage.width-_root.main_mc._width)/2-_root.main_mc._x)*spd; _root.main_mc._y += ((Stage.height-_root.main_mc._height)/2-_root.main_mc._y)*spd; }; ----------------------------------- back_mc【背景】 は, 最初表示されたときも,ステージのサイズが変わったときも, ステージのフィットさせています。 一方, main_mc【オブジェクト】 は, x=600,y=500 から徐々に中央配置させています。 つまり, back_mc【背景】 も main_mc【オブジェクト】 も, 全く別のタイミングで全く別の動きをさせています。 イベントハンドラも別々です。 上のスクリプトのようにするにしても,下のスクリプトのようにするにしても, どっちにしても, 「何がどうなったときに何をどうしたいのか」 をしっかりと持つことが肝腎だと思います。
その他の回答 (1)
- ryo2501
- ベストアンサー率46% (15/32)
Stage.scaleMode = "noScale"; Stage.align = "TL"; main_mc._x = 600; main_mc._y = 500; var stage_obj :Object = new Object(); stage_obj.onResize = function() { onEnterFrame = mover; } function mover() { var sx :Number = Stage.width / 2; var sy :Number = Stage.height / 2; main_mc._x += (sx - main_mc._x) / 5; main_mc._y += (sy - main_mc._y) / 5; } Stage.addListener(stage_obj);
お礼
回答ありがとうございます。
お礼
ご親切にありがとうございました。 とても勉強になりました。