2012-10-04 21 views
5

cocos2dでは、座標系はかなり簡単です。左下は(0,0)です。 私は何かの位置を設定するたびにうまくいきます。Cocos2d座標系

レイヤーがTouchEnabledであるとします。私のスプライトの位置を設定イムは、それは大丈夫です

..

[crab setPosition:ccp(20, 50)]; 

しかし、私は、xを取得し、yはタッチの座標が(と私はスプライトをクリックすると仮定。):

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"Touches began!"); 
    NSArray *touchArray = [touches allObjects]; 
    UITouch *one = [touchArray objectAtIndex:0]; 
    pointOne = [one locationInView:[one view]]; 
    CCLOG(@"points are: %f and %f", pointOne.x, pointOne.y); 
} 

y座標は、yが上から下に向かって増加するにつれて、cocos2dの座標系が示唆しているのと反対です。

私はビューの座標系がマックの座標系とは異なると仮定しています。これはかなり直観的です..正しいですか?

ありがとうございました!

答えて

4

タッチを処理するiOSと従ってUIKitのトップ(0、0のまま使用しながらOpenGLは(0、0)下の左使用し)。それはあなたのポイントを変換するのは簡単です、あなたはそれを行うことを忘れてはならない。

正しい方法はcocos2d 2です。0は

CGPoint uiKitPoint = [touch locationInView:touch.view]; 
CGPoint cocos2dPoint = [[CCDirector sharedDirector] convertToGL:uiKitPoint]; 
0

Cocos2Dはすでにあなたのためにこれを扱うことができ、画面の左上隅です。 CCDirectorにはいくつかの方法があります。これより古い年齢のpostをご覧ください。

0

通常、ほとんどのグラフィック関連アプリケーションでは、左下に(0、0)を配置する傾向があります(これはMacの場合です).iOS上では、あなたが気づいたように残しました。私は十分に2.0で遊んでいませんしました - - あなたはココスで入力を処理しているとき、あなたはすぐに、少なくとも1.1でconvertTouchToNodeSpace方法を(使用してそれを上に変換することができます

が、私はそれがconvertToNodeSpaceだと考えています迅速な文書チェックから)。これにより、必要な変換が行われ、正しい座標が得られます。

(NB:もう一度チェックするために私の他のコードをいくつか掘り起こす必要がありますが、カメラのオフセットもカウントしているかどうかは頭の上から覚えていません。 &を確認してください。)

0

タッチはUIKitの左上が(0,0)なので、このデータを処理する前にcocos2dの座標系に変換する必要があります。

のUIKitについて

[[CCDirector sharedDirector] convertToGL]; 

がある - > cocos2d

+0

です。convertToNodeSpaceは、現在のノードの座標系にない点をそれ自身に変換します。例えばノード座標系に対するワールド座標(それでもなおOpenGL形式)。 –

+0

converttoglメソッドを追加して私の答えを更新してください – lukaswelte

+0

それはまだ間違っています。ノードスペースに変換するのは、ユビットのポイントではありません –