2012-02-13 12 views
1

ジェスチャー認識機能を1つのシーンからしかアクセスできないようにするにはどうすればいいですか?UITapGestureRecognizerが間違ったシーンから呼び出されています

私は2つのシーンを持つシンプルなcocos2dアプリを持っています。素晴らしい作品

CCScene *gameScene = [GameLayer scene]; 
GameLayer *gameLayer = (GameLayer *) [gameScene.children objectAtIndex:0]; 

// Capture a tap 
UITapGestureRecognizer *tapRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:gameLayer action:@selector(handleTapFrom:)] autorelease]; 
[tapRecognizer setDelegate:viewController]; 
[viewController.view addGestureRecognizer:tapRecognizer]; 

[[CCDirector sharedDirector] runWithScene:gameScene]; 

は、私はタッチイベントを取得し、すべてがダンディです:私はAppDelegateにそうようUITapGestureRecognizerを作成します。しかし、私はとても好きですこれは、私の一時停止画面用に別のシーンに切り替えたい:

PauseMenuScene *pauseMenu = [PauseMenuScene node]; 
    [[CCDirector sharedDirector] replaceScene:pauseMenu]; 

そのシーンは、私はそれ上の任意の場所に触れると、それがクラッシュした、しかし起動します。これは、タッチがgameSceneに行くことにあると思われます。これは、静止しています。

どうすればよいですか?


andrewxが私の疑惑を確認した後、私はこれを解決できました。個々のシーンにUIGestureRecognizersを追加する方法はまだ分かりませんでしたが、代わりにジェスチャーを代理人に直接送信してから、自分のシーンにそれらを表示させるようにしました。ここでは、スニペットがあります:

AppDelegateでジェスチャー認識を作成します(自己に指示する変更):

UITapGestureRecognizer *tapRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)] autorelease]; 
[tapRecognizer setDelegate:viewController]; 
[viewController.view addGestureRecognizer:tapRecognizer]; 

次に、私は(私はつもりだった私は実際に私のメインクラスのCCSceneクラスを持っていたことを確認しましたベースのHelloWordクラスをオフにして、CCLayerクラスのみを持っていました)。

@implementation GameScene 
@synthesize layer = _layer; 

-(id) init 
{ 
    if (self = [super init]) 
    { 
     self.layer = [GameLayer node]; 
     [self addChild:_layer]; 
    } 

    return self; 
} 

-(void) dealloc 
{ 
    [_layer release]; 
    _layer = nil; 
    [super dealloc]; 
} 

@end 

そして最後に、私はタップ委任:

-(void) handleTapFrom: (UITapGestureRecognizer *) recognizer 
{ 
    CCScene *currentScene = [[CCDirector sharedDirector] runningScene]; 

    if ([currentScene isKindOfClass:[GameScene class]]) 
    { 
     GameLayer *gLayer = ((GameScene *) currentScene).layer; 
     [gLayer handleTapFrom:recognizer]; 
    } 
} 

答えて

1

あなたのジェスチャー認識は、1つのシーンのターゲットで初期化されていますreplaceSceneは、そのターゲットが存在しなくなったときに、そのクラスは次のようになります右?だからあなたのジェスチャーレコグナイザーは、そこにないレイヤーにタッチを送信しようとしています。私はこれがあなたのクラッシュの原因だと思う。

タッチコントロールを個々のココスクラスに追加することをお勧めします。これにより、各シーンで独自のタッチを処理できるようになります。その場面が解放され、別の場面に置き換えられるとき、それはまたそれ自身の接触認識装置を有する。これは、App Delegateにタッチコントロールを追加するよりもはるかに安全です。実際には、このタイプのシーン固有のロジックのための場所ではありません(通常は)。

関連する問題