我有一个游戏场景有2层,如下所示,当用户点击暂停按钮时,我将暂停窗口图层作为子项添加到状态栏图层。游戏正在进行中,所以到目前为止,我实现的是将一个精灵加载到我的游戏图层中并将精灵移动到用户触摸的位置。
就“游戏层”上的触摸处理而言,一切都很完美,直到用户点击暂停按钮,即使在调用[[CCDirector sharedDirector] pause]
之后,“游戏层”触摸仍然有效。我仍然能够以暂停模式在屏幕上移动我的播放器。
请说明导演暂停和触摸之间的关系是什么?
场景:游戏场景有2个孩子
- GameScene
- Status Bar Layer #1
- Pause Button
Tap
{
[[CCDirector sharedDirector] pause]
Add pause Window to Status bar layer;
}
- Score Label
- Life Status icon
- Game Layer #2
图层:暂停CCLayer
- PauseGameLayer
- Resume Button
Tap
{
Remove this layer from parent
[[CCDirector sharedDirector] resume];
}
- Restart Level
- Main menu
答案 0 :(得分:3)
当导演暂停时,触摸调度员不会暂停,它仍然会调度所有触摸事件。我用游戏状态(整数)实现了游戏暂停/恢复。
int _state;
- (void) pause{
if(_state == kGameStatePlaying){
_state = kGameStatePaused;
//TODO - pause the game
}
}
- (void) resume{
if(_state == kGameStatePaused){
_state = kGameStatePlaying;
//TODO - resume the game
}
}
- (void) ccTouchesBegan:(NSSet *) tiuches withEvent:(UIEvent *) event{
if(_state != kGameStatePlaying)
return;
//.....
}
在许多其他情况下,使用游戏状态非常有用。 在我的实施中,我暂停游戏时从不停止导演。暂停导演是暂停游戏的最简单方法,但是如果你需要在暂停层中做一些动画(例如动物跳跃,文字闪烁......),你显然不能因为导演暂停了。解决方案是暂停所有游戏角色和游戏层本身的调度程序和操作。暂停和恢复方法应该是这样的(假设您将所有游戏actor存储在名为allActors的数组中)
- (void) pause{
if(_state == kGameStatePlaying){
_state = kGameStatePaused;
[self pauseSchedulerAndActions];
[allActors performSelector:@selector(pauseSchedulerAndActions)];
}
}
- (void) resume{
if(_state == kGameStatePaused){
_state = kGameStatePlaying;
[self resumeSchedulerAndActions];
[allActors performSelector:@selector(resumeSchedulerAndActions)];
}
}
希望这会有所帮助:)
答案 1 :(得分:0)
当用户按下“暂停”按钮时添加一个新图层,使用按钮恢复“暂停图层”,它可以解决您的问题,但我不知道它是否是正确的解决方案。
也许这个链接可以帮助您Cocos2d pause
答案 2 :(得分:0)
您可以启用和禁用这样的触摸:
暂停前禁用触摸:
[self setIsTouchEnabled:NO]
恢复后再次启用:
[self setIsTouchEnabled:YES]
在cocos2d-x
中this->setTouchEnabled(false);