2009-08-24 7 views
0

こんにちは、私はその点について多くの質問を準備していますが、実際にはまだ正しいことを得ていませんでした。cocos2Dのタッチでの問題

..だから、これは問題..です

これは、そのためにとても残念cocos2d、と私の最初のプロジェクトです。

私は1つのシーンを持っているが、私は名前グリッドと、このグリッドの内側に一つの層を持っている内ゲームプレイと呼ばれる、(あまりにも層)ブロック多くの多くを持っています。

ブロックに触れるときにチェックする必要があります。これはInterface Builderでこれを行うので、touchesBeginを呼び出すと正確なタッチが1つのビューに表示されます。しかし、cocos2Dでは、私はオブジェクトの位置を確認し、右のテストをヒットしていないことを理解していますか?

だから私のtouchesBeginは、このようなものです:

- (void)ccTouchesBegan:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInView: [touch view]]; 
    //location = [[Director sharedDirector] convertCoordinate: location]; 

    for(int i = 0; i < [arrAllBlocks count]; i++) 
    { 
     for (int j = 0; j < [[arrAllBlocks objectAtIndex:i] count]; j++) 
     { 
      Block *tempBlock = [[arrAllBlocks objectAtIndex:i] objectAtIndex:j]; 
      CGRect mySurface = (CGRectMake(tempBlock.position.x, tempBlock.position.y, tempBlock.contentSize.width,tempBlock.contentSize.height)); 
      if(CGRectContainsPoint(mySurface, location)) 
      { 
       NSLog(@"Hit Positions %fl:%fl",location.x,location.y); 
       NSLog(@"Object Positions %fl:%fl",tempBlock.position.x,tempBlock.position.y); 
       NSLog(@"Object Color:%@ hited", tempBlock.strName); 
      } 
     } 

    } 
} 

最初の問題がある:これは逆さに見えます!最初の行でこのブロックの1つをクリックすると!私は最後の行にブロックを取得する!私は本当にそれを取得しないでください!そして、ヒットは私に完璧なseens!そして、私がconvertCoordinateこれはさらに悪い!

誰かが私を助けることができますか?そして悪い英語のために残念です=/

+0

OpenGLは、残りのiPhoneの仕組みから上下逆の座標を使用します。私はCocos2Dがどのようにその問題を処理しているのかわかりませんが、はい、迷惑です。 –

答えて

0

Cocos2Dの座標系は、Cocoaの座標系と逆になっています。 (本当に、ココアは私には逆さまですが、ただの大会です)。

私はいつもこのことを忘れています!覚えておくべき二つのことがあります

1

は...

  • Cocos2Dシステムの原点は左下隅座標。
  • デフォルトでは、表示要素のアンカーポイントはその中心です。

これは、私は、この問題を解決する方法である:

も同様に左下する要素のアンカーポイントを設定します。

[block setAnchorPoint:ccp(0, 0)]; 

ccTouchesBeganでconvertCoordinateを使用します。

-(BOOL)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint pt = [touch locationInView:[touch view]]; 
    CGPoint ptConv = [[Director sharedDirector] convertCoordinate:pt]; 
} 

要素の矩形を計算し、比較

...それはあなたが不足している唯一のステップのように見える

CGSize size = [block contentSize]; 
CGPoint point = [block position]; 
rect = CGRectMake(point.x, point.y, size.width, size.height); 

if (CGRectContainsPoint(rect, ptConv)) 
{ 
    // touched 
} 

は、アンカーポイントを変更することです。

アンカーポイントを変更したくない場合は、四角形の計算方法を変更する必要があります。幅と高さの半分を加算して減算します。

希望します。

関連する問題