我正在使用cocos2d为iOS制作游戏。当调用主游戏性层构造函数时,它会注册以接收具有以下调用的触摸:
[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self
priority:0
swallowsTouches:YES];
工作正常。当用户暂停游戏时,我将暂停菜单层推到CCDirector
上。暂停菜单层以与上述相同的方式注册以接收触摸。该菜单中的第一个选项是恢复游戏(即弹出菜单层并返回正在进行的游戏)。但是,当发生这种情况时,游戏玩法层不再响应触摸。
处理此问题的最佳方法是什么?我想我可以在每次调用Update
时将游戏性层注册为目标代理,但这看起来有点荒谬。有没有办法在关闭之前在暂停菜单中重新分配代理?这是否有可接受的方式?
答案 0 :(得分:1)
事实证明,从弹出的场景返回时,CCMenu
从基础CCLayer
对象中窃取焦点存在一个已知问题。正如我在cocos2d论坛上发现的那样,可以接受的方法是,而不是创建一个新场景,覆盖透明层(以调暗现有场景),其中包含CCMenu
。完成此CCMenu
后,只需将其从场景中删除即可。
这是我的具体实施:
-(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;
}
答案 1 :(得分:0)
如果您释放暂停菜单对象,它是否有效?或者,您可以在屏幕未激活时将暂停层移动到屏幕外部。将它的x,y设置为-1000或其他东西。