cocos2D中的触摸问题

时间:2009-08-24 18:07:35

标签: iphone cocos2d-iphone

嘿伙计们,我准备了许多关于这一点的问题,但我真的没有找到合适的问题。

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

这是我的第一个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 时,这甚至会变得更糟!

有人可以帮助我吗?!抱歉英语不好= /

2 个答案:

答案 0 :(得分: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
}

看起来你唯一缺少的就是改变锚点。

如果您不想更改锚点,则需要更改矩形的计算方式;加减宽度和高度的一半。

希望它有所帮助。

答案 1 :(得分:0)

请记住,Cocos2D中的坐标系统与Cocoa的坐标系统相反。 (真的,Cocoa是我的颠倒,但这只是一个惯例)。

我自己一直忘记这一点!