アプリ版:「スタンプのみでお礼する」機能のリリースについて

画面のサイズを拡大縮小しても
常にセンターに表示させる
アクションスクリプトで質問がございます。

back_mcが【背景】
main_mcが【オブジェクト】

_root.main_mc._x = ( Stage.width - _root.main_mc._width ) /2;
_root.main_mc._y = ( Stage.height - _root.main_mc._height) /2;

このアクションスクリプトで【オブジェクト】が最初から常にセンター表示になる事は分かるのですが、例えば座標x600 y500で始まるようにするのはどうしたら良いのでしょうか。


下記のアクションスクリプトでは、【オブジェクト】がx600 y500の位置に最初はあるのですが画面のサイズを拡大縮小してもピクリとも動きません。


Stage.align = "TL";
Stage.scaleMode = "noScale";

Stage.addListener(this);
this.onResize = function() {
_root.main_mc._x = 600;( Stage.width - _root.main_mc._width ) /2;
_root.main_mc._y = 500;( Stage.height - _root.main_mc._height) /2;

_root.back_mc._width = Stage.width;
_root.back_mc._height = Stage.height;
}

this.onResize();


いまいち分かりにくい質問ですが伝わりますでしょうか。
分かる方、宜しくお願い致します。

A 回答 (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【オブジェクト】 も,
全く別のタイミングで全く別の動きをさせています。
イベントハンドラも別々です。


上のスクリプトのようにするにしても,下のスクリプトのようにするにしても,
どっちにしても,
「何がどうなったときに何をどうしたいのか」 をしっかりと持つことが肝腎だと思います。
    • good
    • 0
この回答へのお礼

ご親切にありがとうございました。
とても勉強になりました。

お礼日時:2008/11/17 08:17

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);
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2008/11/17 08:17

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