问题与触摸在cocos2D

问题描述:

嘿家伙,我准备了很多关于这一点的问题,但我真的没有得到正确的一个呢。问题与触摸在cocos2D

所以..这就是问题所在..

这是我与cocos2d的第一个项目,因为这很遗憾。

我有一个场景叫游戏里面,我有一个名为电网一层,该网格内,有很多很多(LAYER太)。

我需要检查,当你触摸一个,我这样做与Interface Builder之前,所以当我打电话touchesBegin我有一个视图中的确切触摸。但在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); 
      } 
     } 

    } 
} 

的第一个问题是:这看起来颠倒!当我点击第一行的这个块之一时!我得到最后一行的块!我真的不明白!对我来说这次击球并不完美!而当我convertCoordinate这会变得更糟!

有人可以帮我吗?对不起英语=/

+0

OpenGL从iPhone的其他部分使用倒置坐标;我不知道Cocos2D如何处理这个问题,但是,这很烦人。 – 2009-08-26 12:53:48

请记住,Cocos2D中的坐标系与Cocoa的坐标系颠倒了。 (真的,Cocoa对我来说是颠倒的,但这只是一个惯例)。

我自己一直都忘记这个!

有两件事情要记住......

  • 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 
} 

它看起来像你缺少的一个步骤是改变锚点。

如果你不喜欢改变锚点,您需要更改矩形的计算方法;加减宽度和高度的一半。

希望它有帮助。