问题与触摸在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这会变得更糟!
有人可以帮我吗?对不起英语=/
答
请记住,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
}
它看起来像你缺少的一个步骤是改变锚点。
如果你不喜欢改变锚点,您需要更改矩形的计算方法;加减宽度和高度的一半。
希望它有帮助。
OpenGL从iPhone的其他部分使用倒置坐标;我不知道Cocos2D如何处理这个问题,但是,这很烦人。 – 2009-08-26 12:53:48