0

我有几个图层并向它们添加了一些精灵;尝试以这种方式访问​​它们:

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

    if(CGRectContainsPoint([[self getChildByTag:tagNumber] boundingBox], location)) {
        CCLOG(@"You've touched the sprite!");
    }
}

奇怪的是,如果没有这个方法:

-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    return YES;
}

当我触摸屏幕时,我的应用程序崩溃了。知道可能是什么吗?

更新:

-(void) registerWithTouchDispatcher
{
    [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self 
                                                     priority:0 swallowsTouches:YES];
}
4

2 回答 2

1

如果您收到 ccTouchBegan 事件但未收到 ccTouchesBegan(请注意复数),则您使用的是CCTargetedTouchDelegate协议。您可能已经使用 CCTouchDispatcher addTargetedDelegate 注册了您的类,因此必须坚持使用 CCTargetedTouchDelegate 协议,其方法是 ccTouchXXXX 的单一版本,而不是 ccTouchesXXXX。

您还应该注意 Xcode 向您显示的警告。如果您不实施 ccTouchBegan,我确信可能会出现“可能不响应选择器”警告。所有警告都应该认真对待(事实上,我建议打开“将所有警告视为错误”)。

于 2011-12-21T15:00:22.393 回答
0

控制台中产生的任何错误?关于无法识别的选择器?自从我参与 cocos2D 以来已经有一段时间了,但是您应该检查第二种方法是否覆盖第一种方法。如果它确实存在,那么当它不存在时,您的程序将使用第一个(返回 void 的那个),从而偶然发现代码实现中的实际错误。我会在 '-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event' 的第一行内设置一个断点,删除返回 BOOL 的函数,然后我会一步一步地看到当使用调试器。

请发布您的控制台日志。我相信您应该有“未找到选择器”、“未找到子项”或“由于 nil 参数导致的无效参数异常”问题。

只是一个想法。

于 2011-12-21T13:16:34.400 回答