0

この問題は、かなりの時間私を苛立たせてきました。私は基本的に を使用する必要があるゲームを持っていますUITapGestureRecognizerが、画面に CCButton がある場合、このタップ ジェスチャはボタンのタップをオーバーライドします。この問題を回避するために、以下にリストされているメソッドをコードに実装します-(BOOL)gestureRecognizer。これが認識されるようにするには、UITapGestureRecognizerのデリゲートをself(少なくとも私の知る限り) に設定する必要があります。

私のボタンは単独で問題なく動作し、バグはありません。のデリゲートを宣言しなくてもUITapGestureRecognizer、タップは完全に記録され、すべてが機能し、バグはありません (CCButton をクリックすることはできません)。これをまとめて実装し、デリゲートを設定して次のことを行うと、バグが発生します。my に入り、LevelScenemainMenu ボタンをタップしてメイン メニューに戻り、再生ボタンをもう一度クリックすると、アプリがスレッド 1: EXC_BAD_ACCESS (code = 1, address = 0xe000000c)でクラッシュしmain.mます。

なぜこれが起こっているのかわかりません。また、Spritebuilder を使用していますが、それが何かに影響するかどうかはわかりません。以下は関連するコードです (myはSpritebuilder を介しGridて my に追加されます)。LevelSceneコードが長くて申し訳ありませんが、すべて必要だと思います。

main.m

#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;
    }
}

LevelScene.m

@implementation LevelScene {
    Grid *_grid;
}

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


@end

Grid.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;
}

Grid.h

#import "CCNodeColor.h"

@interface Grid : CCNodeColor <UIGestureRecognizerDelegate>

@end
4

0 に答える 0