0

这个问题让我沮丧了好几个小时。我基本上有一个我需要使用的游戏UITapGestureRecognizer,但是如果屏幕上有一个 CCButton,这个轻击手势会覆盖按钮上的轻击。为了解决这个问题,我在我的代码中实现了下面列出的方法-(BOOL)gestureRecognizer。为了使这一点得到认可,我必须将UITapGestureRecognizer's 委托设置为self(至少据我所知)。

我的按钮本身就可以正常工作,没有错误。如果不声明 的委托UITapGestureRecognizer,则轻拍被完美记录,一切正常,没有错误(我只是无法点击 CCButton)。当我一起实现这一切并设置委托并执行以下操作时,我得到了一个错误。我输入我的LevelScene,点击我的 mainMenu 按钮,这使我回到我的主菜单,然后再次单击我的播放按钮,然后我的应用程序崩溃,并在我的文件中出现Thread 1: EXC_BAD_ACCESS (code = 1, address = 0xe000000c) 。main.m

我不确定为什么会发生这种情况,另外我正在使用 Spritebuilder,但我不确定这是否会影响任何事情。下面是相关代码(我是通过SpritebuilderGrid添加到我的)。LevelScene对不起,代码很长,但我认为这一切都是必要的。

主文件

#import <UIKit/UIKit.h>

int main(int argc, char *argv[]) {

    @autoreleasepool {
        //error occurs right below this line
        int retVal = UIApplicationMain(argc, argv, nil, @"AppController");
        return retVal;
    }
}

水平场景.m

@implementation LevelScene {
    Grid *_grid;
}

- (void)mainMenuFromLevelScene {
    [[LevelManager sharedInstance] reset];
    CCScene *levelScene = [CCBReader loadAsScene:@"MainScene"];
    [[CCDirector sharedDirector] replaceScene:levelScene];
}


@end

网格.m

@implementation Grid

- (void)didLoadFromCCB {
    UITapGestureRecognizer * gridTapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gridTapped)];
    [[[CCDirector sharedDirector] view] addGestureRecognizer:gridTapped];
    gridTapped.delegate = self;
}

- (void)gridTapped {
    //correctly logs Grid tapped when screen is tapped
    CCLOG(@"Grid tapped");
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    //everything works correctly here too
    CGPoint touchLocation = [touch locationInNode:self];    
    if ((touchLocation.y < 0 || levelWonBool)) {
        CCLOG(@"returning no");
        return NO;
    }
    return YES;
}

网格.h

#import "CCNodeColor.h"

@interface Grid : CCNodeColor <UIGestureRecognizerDelegate>

@end
4

0 回答 0