2011-01-03 3 views
0

Ich mache ein Spiel mit cocos2d für iOS. Wenn der Gameplay-Hauptkonstruktor aufgerufen wird, registriert er sich, um Berührungen mit dem folgenden Aufruf zu empfangen:cocos2d-Ebene reagiert nicht auf Berührungen, nachdem eine Menüebene geöffnet wurde

Das funktioniert gut. Wenn der Benutzer das Spiel pausiert, schiebe ich eine Pause-Menü-Ebene auf die CCDirector. Die Pausenmenüebene registriert sich, um Berührungen auf die gleiche Weise wie oben zu empfangen. Die erste Option in diesem Menü besteht darin, das Spiel fortzusetzen (d. H. Die Menüebene zu öffnen und zum laufenden Spiel zurückzukehren). In diesem Fall reagiert die Gameplay-Ebene jedoch nicht mehr auf Berührungen.

Was ist der beste Weg, damit umzugehen? Ich denke, ich könnte den Gameplay-Layer als Zieldelegierten bei jedem Anruf bei Update registrieren, aber das scheint irgendwie lächerlich. Gibt es eine Möglichkeit, den Delegaten im Pausenmenü neu zuzuweisen, bevor Sie ihn schließen? Gibt es einen akzeptierten Weg, dies zu tun?

Antwort

1

Wie sich herausstellt, gibt es ein bekanntes Problem mit CCMenu stiehlt den Fokus von dem zugrunde liegenden CCLayer Objekt bei der Rückkehr aus einer Pop-Szene. Der akzeptierte Weg dahin, wie ich in den cocos2d Foren gefunden habe, ist es, anstatt eine neue Szene zu erstellen, eine transparente Ebene (um die bestehende Szene zu dimmen) mit einer CCMenu darin zu überlagern. Wenn Sie mit diesem CCMenu fertig sind, entfernen Sie es einfach aus der Szene.

Hier ist meine spezifische Implementierung:

-(void)pauseMenuButtonPressed 
{  
    if(!paused) 
    { 
     paused = TRUE; 

     [[CCDirector sharedDirector] pause]; 

     CGSize s = [[CCDirector sharedDirector] winSize]; 
     pauseLayer = [CCColorLayer layerWithColor: ccc4(150, 150, 150, 125) width: s.width height: s.height]; 
     pauseLayer.position = CGPointZero; 
     [self addChild: pauseLayer z:8]; 

     CCMenuItem *pauseMenuItemResume =[CCMenuItemImage itemFromNormalImage:@"menuItemResumeSmall.png" 
                   selectedImage: @"menuItemResumeSmallSelected.png" 
                     target:self 
                    selector:@selector(pauseMenuResumeSelected)]; 


     CCMenuItem *pauseMenuItemMainMenu =[CCMenuItemImage itemFromNormalImage:@"menuItemMainMenuSmall.png" 
                   selectedImage: @"menuItemMainMenuSmallSelected.png" 
                     target:self 
                    selector:@selector(pauseMenuExitToMainMenuSelected)]; 

     // Create the pause menu and add the menu items to it 
     pauseMenu = [CCMenu menuWithItems:pauseMenuItemResume, pauseMenuItemMainMenu, nil]; 

     // Arrange the menu items vertically 
     [pauseMenu alignItemsVertically]; 

     // add the menu to the scene 
     [self addChild:pauseMenu z:10]; 

     [hudButtons setIsTouchEnabled:NO]; 
    } 

} 

-(void)pauseMenuResumeSelected 
{ 
    [self removeChild:pauseMenu cleanup:YES]; 
    [self removeChild:pauseLayer cleanup:YES]; 
    [hudButtons setIsTouchEnabled:YES]; 
    [[CCDirector sharedDirector] resume]; 
    paused = FALSE; 
} 
0

Funktioniert es nicht, wenn Sie Ihr Pausenmenüobjekt freigeben? Oder Sie können die Pauseschicht einfach außerhalb des Bildschirms verschieben, wenn sie nicht aktiv ist. Setze es auf x, y bis -1000 oder so.

+0

Leider geschieht dies nach der Pause-Menü Szene aufgetaucht ist. Dies gibt das Objekt frei. – jonmorgan

Verwandte Themen