2010-12-20 13 views
0

私はこの話題に巨大なスレッドを知っていますが、おそらく私は遅れていますが、これは単に機能しません。localToGlobalが機能していません - 実際には

私はスプライト_testTargetと_testParentをこのようにネストしていると言います。

_testParent = new Sprite(); 
this.addChild(_testParent); 

_testTarget = new Sprite() 
_testParent.addChild(_testParent); 

そして、_testTargetのグローバルコードを取得したいとします。私はそれぞれlocalToGlobalを行うと、私はそれが助け場合は200100

var point:Point = new Point(_testTarget.x, _testTarget.y); 
    point = _testTarget.localToGlobal(point); // returns 0,0 

var point:Point = new Point(_testTarget.x, _testTarget.y); 
    point = _testTarget.parent.localToGlobal(point); // returns 0,0 

var point:Point = new Point(this.x, this.y); 
    point = this.localToGlobal(point); // returns 0,0 

var point:Point = new Point(this.x, this.y); 
    point = this.parent.localToGlobal(point); // Breaks, "parent" is null 

のように、このクラス/スプライトは、スプライトの内側に、スプライトの内部でインスタンス化された実際のコードがある事実を知ったとき、私はいつも内側に、バック0,0を取得しますスプライトの...とそのコードが200,100の理由は、親コンテナの1つがそれに設定されているからです - しかし、私はlocalToGlobalが非常に最上位レイヤまで進んでいると思いましたか?助けて?あなたの最初のブロック、この文句を言わない仕事で

答えて

0

だから、すべての皆さんへの小道具は、それが、はい、私はハハ遅れだということが判明したので、私は自分のコードの残りの部分に目を通すことを示唆しています。 (あなたのアドバイスから)奇妙なことに、問題はlocalToGlobalとは何の関係もないことがわかりました。問題は、ステージが準備されるのを忘れることでした。解決策は非常に簡単でした:

public function ClassConstructorOrWhatever(){ 
    addEventListener(Event.ADDED_TO_STAGE, handleAddedToStage); 

    _testParent = new Sprite(); 
    this.addChild(_testParent); 

    _testTarget = new Sprite() 
    _testParent.addChild(_testTarget); 
} 

private function handleAddedToStage(e:Event):void { 
    var point:Point = new Point(_testTarget .x, _testTarget .y); 
     point = _testTarget.localToGlobal(point); // RETURNS 200,100!!!! :) 
} 

だから、それは問題でした - もう一度ありがとう!

0

_testParent.addChild(_testParent); 

あなたは、自身の子として表示オブジェクトを追加することはできませんので。

+0

申し訳ありませんが、そのタイプ-o(実際のアプリはそれを持っていません: - p) – Jason

4

他の場所で問題が発生している必要があります(貼り付けたコードに誰も表示されませんが、TandemAdamに記載されているものは除きます)。

予想通り、この作品:経験則として

var _testParent:Sprite; 
var _testTarget:Sprite; 
var _yetAnotherParent:Sprite; 

_yetAnotherParent = new Sprite(); 
this.addChild(_yetAnotherParent); 

_testParent = new Sprite(); 
_yetAnotherParent.addChild(_testParent); 

_testTarget = new Sprite() 
_testParent.addChild(_testTarget); 

_testParent.y = 100; 
_yetAnotherParent.y = -500; 

var point:Point = new Point(_testTarget.x, _testTarget.y); 
    point = _testTarget.parent.localToGlobal(point); 

trace(point); // (x=0, y=-400) 

座標空間の間で変換するとき、あなたはlocalToGlobalglobalToLocalを呼び出すするオブジェクトは、ほとんどの場合、あなたがしているオブジェクトの親であります興味があるのは、オブジェクトのxとyがその親に対するオフセットであるからです。

+0

返信いただきありがとうございます。うん、それはちょっと私が思ったことです - 私は親と呼んでいますが、私がそうしようとするとnullを返します(私は奇妙です)。私はちょうどコンストラクタのチェーンをより厳密に見て、globalToLocalを呼び出す前にすべてがinit(ed)であり、準備が整っていることを確認します。ありがとう。 – Jason

+0

localToGlobalまたはglobalToLocalを使用する前に、クリップをステージに追加する必要があります。動的にクリップを作成している場合は、コンストラクターが呼び出されたときにステージに置かれません。その前にEvent.ADDED_TO_STAGEを待つ必要があります。 –

0

これは期待どおりに動作します - 返信(x = 600、y = 600)。だからあなたのアプリに何か間違っているように見えるでしょうか?

var a:Sprite = new Sprite(); 
var b:Sprite = new Sprite(); 
var c:Sprite = new Sprite(); 
var d:Sprite = new Sprite(); 
var e:Sprite = new Sprite(); 

a.x = b.x = c.x = d.x = e.x = 100; 
a.y = b.y = c.y = d.y = e.y = 100; 

this.addChild(a); 
a.addChild(b); 
b.addChild(c); 
c.addChild(d); 
d.addChild(e); 

var point:Point = new Point(e.x, e.y); 

point = e.localToGlobal(point); 

trace(point); 
+0

'localToGlobal'行は' e.parent.localToGlobal(point); 'を読み込むべきだと思います。グローバル座標の 'e.x'と' e.y'は600,600ではなく500,500でなければなりません。あなたのコードが実際にやっていることは、100,100 *を 'e'スプライトをグローバル座標にマッピングすることです。あなたが通常望むものではないと思います(exとeyをマップしたいので、eの親に対して' localToGlobal' ) –

関連する問題