嘿伙计们,我准备了许多关于这一点的问题,但我真的没有找到合适的问题。
所以......这就是问题..
这是我的第一个cocos2d项目,很抱歉。
我有一个名为游戏玩法的场景,我有一个名为网格的图层,在此网格内部,有许多阻止 (层也是)。
当你触摸一个阻止时我需要检查,我之前使用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 :(得分:1)
要记住两件事......
所以这就是我解决这个问题的方法:
将元素的锚点设置为左下角。
[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
}
看起来你唯一缺少的就是改变锚点。
如果您不想更改锚点,则需要更改矩形的计算方式;加减宽度和高度的一半。
希望它有所帮助。
答案 1 :(得分:0)
请记住,Cocos2D中的坐标系统与Cocoa的坐标系统相反。 (真的,Cocoa是我的颠倒,但这只是一个惯例)。
我自己一直忘记这一点!