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

root上のaaa_mcの位置にb_mcのなかのc_mcをa_btnを押すと、移動させたいのですが、localTogrobalを使ってやりたいのですが、どうやればいいでしょうか?

A 回答 (1件)

昔(Flash 5)からあるムービークリップクラス(ムービークリップオブジェクト)のメソッドですが,


わかりにくく,使いにくいメソッドですよね。

> どうやればいいでしょうか?

というご質問なので,
以下はほとんどやり方だけの説明です。


ご質問は,

 _root
  ├ aaa_mc
  └ b_mc
      └ c_mc

となっていて,

 c_mc →移動→ a_mc

ですね。
この場合は「a_btn」に,

-----------------------------------------
on (release) {
// 基準となるオブジェクトの作成
var myPoint = new Object();
//
// 基準座標の設定(この場合 _root の基準点)
myPoint.x = 0;
myPoint.y = 0;
//
// aaa_mc の座標をグローバル座標に変換
_root.aaa_mc.localToGlobal(myPoint);
//
// 変換した座標を b_mc (c_mc の親)のローカル座標に変換
_root.b_mc.globalToLocal(myPoint);
//
// その座標に c_mc を持ってくる
_root.b_mc.c_mc._x = myPoint.x;
_root.b_mc.c_mc._y = myPoint.y;
}
-----------------------------------------

こう書けば行けると思います。
と言うか,
「aaa_mc」の座標は元からグローバルな座標なので,
ご質問の localToGlobal は必要なく,

-----------------------------------------
on (release) {
// 基準となるオブジェクトの作成
var myPoint = new Object();
//
// 基準座標の設定
myPoint.x = _root.aaa_mc._x;
myPoint.y = _root.aaa_mc._y;
//
// その座標を b_mc(c_mcの親)のローカル座標に変換
_root.b_mc.globalToLocal(myPoint);
//
// その座標に c_mc を持ってくる
_root.b_mc.c_mc._x = myPoint.x;
_root.b_mc.c_mc._y = myPoint.y;
}
-----------------------------------------

これで良いのです。




 _root
  ├ aaa_mc
  │  └ bbb_mc
  │      └ccc_mc
  └ b_mc
      └ c_mc

 c_mc →移動→ ccc_mc

この場合は,

-----------------------------------------
on (release) {
// 基準となるオブジェクトの作成
var myPoint = new Object();
//
// 基準座標の設定(この場合 _root の基準点)
myPoint.x = 0;
myPoint.y = 0;
//
// aaa_mc の座標をグローバル座標に変換
_root.aaa_mc.bbb_mc.ccc_mc.localToGlobal(myPoint);
//
// 変換した座標を b_mc (c_mc の親)のローカル座標に変換
_root.b_mc.globalToLocal(myPoint);
//
// その座標に c_mc を持ってくる
_root.b_mc.c_mc._x = myPoint.x;
_root.b_mc.c_mc._y = myPoint.y;
}
-----------------------------------------

または,

-----------------------------------------
on (release) {
// 基準となるオブジェクトの作成
var myPoint = new Object();
//
// bbb_mc親 の座標をグローバル座標に変換
myPoint.x = _root.aaa_mc.bbb_mc.ccc_mc._x;
myPoint.y = _root.aaa_mc.bbb_mc.ccc_mc._y;
_root.aaa_mc.bbb_mc.localToGlobal(myPoint);
//
// 変換した座標を b_mc (c_mc の親) のローカル座標に変換
_root.b_mc.globalToLocal(myPoint);
//
// その座標に c_mc を持ってくる
_root.b_mc.c_mc._x = myPoint.x;
_root.b_mc.c_mc._y = myPoint.y;
}
-----------------------------------------

と書けば行けると思います。




 _root
  └ aaa_mc
      ├ bbb_mc
      │  └ ccc_mc
      └ b_mc
          └ c_mc

 c_mc →移動→ ccc_mc

この場合は,

--------------------------------
on (release) {
// 基準となるオブジェクトの作成
var myPoint = new Object();
//
// 基準座標の設定
myPoint.x = 0;
myPoint.y = 0;
//
// ccc_mc の座標をグローバル座標に変換
_root.aaa_mc.bbb_mc.ccc_mc.localToGlobal(myPoint);
//
// 変換した座標を b_mc(c_mcの親)のローカル座標に変換
_root.aaa_mc.b_mc.globalToLocal(myPoint);
//
// その座標に c_mc を持ってくる
_root.aaa_mc.b_mc.c_mc._x = myPoint.x;
_root.aaa_mc.b_mc.c_mc._y = myPoint.y;
}
--------------------------------

または,

--------------------------------
on (release) {
// 基準となるオブジェクトの作成
var myPoint = new Object();
//
// ccc_mc の座標をグローバル座標に変換
myPoint.x = _root.aaa_mc.bbb_mc.ccc_mc._x;
myPoint.y = _root.aaa_mc.bbb_mc.ccc_mc._y;
_root.aaa_mc.bbb_mc.localToGlobal(myPoint);
//
// 変換した座標を b_mc (c_mcの親)のローカル座標に変換
_root.aaa_mc.b_mc.globalToLocal(myPoint);
//
// その座標に c_mc を持ってくる
_root.aaa_mc.b_mc.c_mc._x = myPoint.x;
_root.aaa_mc.b_mc.c_mc._y = myPoint.y;
}
-------------------------------

これで行けると思います。



行けますが… やはりイヤなメソッドですね。
イヤですし,上のようにできても,
考えれば考えるほどこんがらがってきて,うまく説明できません。
考えるよりパターンとして使う方が良いのかもしれません。
私は,やっぱり,相対座標(ローカル座標)を足し算引き算する方が好きです。

まあ,何というか,

 _root.aaa_mc.bbb_mc ._globalx

とか,

 _root.aaa_mc.bbb_mc ._rootx

みたいな座標プロパティがあれば良いと思いますが,これがないのですよ。



Flash 8 のヘルプですが,参考URL。

「localToGlobal (MovieClip.localToGlobal メソッド)」
http://livedocs.macromedia.com/flash/8_jp/main/0 …

「globalToLocal (MovieClip.globalToLocal メソッド)」
http://livedocs.macromedia.com/flash/8_jp/main/0 …


ネットも探しましたが,
ちゃんと説明されているサイトは見つけることができませんでした。
唯一,ココが参考になるかもしれません。
他の方の回答です。

「2つの異なる階層のMCを操作する方法」
http://oshiete1.goo.ne.jp/qa2004666.html
 ↑教えて!goo ↓OKWave (同じです)
http://okwave.jp/qa2004666.html
    • good
    • 0

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