是否可以“重置”任何现有的触摸?

时间:2012-12-04 18:30:41

标签: cocos2d-iphone

Cocos2d-iphone 1.0.1.
  • 我的主要游戏场景要求玩家用手指按下屏幕以移动角色。
    • 角色移动(因此手指按下屏幕)时,可能会发生战斗。这样的战斗会触发一个新的CCScene 推送进入CCDirector(因此主游戏场景仍然存在于内存中)。
    • 在战斗中,自然,玩家可能会在某个时候释放他的手指。
    • 战斗结束后,此CCScene 弹出。因此,主游戏场景返回。
  • 现在有一个问题:主游戏场景仍然认为在战斗之前最初按下屏幕的手指仍然在同一点按下它,因此操纵杆是尽管手指不再按屏幕,但仍然“正在运作”且播放器仍在移动

有没有办法“重置”屏幕触摸?我想在主游戏场景的onEnter方法中这样做。我试过像

这样的东西
self.isTouchEnabled = NO;
self.isTouchEnabled = YES;

希望这会重新注册触摸调度程序,从而导致某种重置。它不起作用。

基本上,我需要一种方法来告诉主要游戏场景“伙计,无论你想到什么,没有人触摸屏幕。”

修改

请注意,如果再次按屏幕,则会固定。

3 个答案:

答案 0 :(得分:1)

为了确保我理解这个问题:

在弹出战斗场景后,角色继续四处移动,好像用户从未将手指从操纵杆上松开一样?

我最初的想法是你在代码中的某个地方有更深层次的设计缺陷。我的理解是你想使用至少一个层来处理输入。尝试将“游戏”CCScene中的所有内容转移到“游戏”CCLayer,并将该层添加为场景的子项。然后注册图层以接收触摸输入。

如果这不起作用,您可以随时使用标志。将您所在的场景与您想要进入的场景进行比较,如果不是,请不要激活操纵杆控制器。有点hack-y但它有效。

答案 1 :(得分:0)

我自己遇到过这种问题。

我是如何修理的:

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
for (UITouch *touch in touches){
[touchesOnScreen addObject:touch];
}
}

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
for (UITouch *touch in touches){
[touchesOnScreen removeObject:touch];
}}

- (void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{

[touchesOnScreen removeAllObjects];
}

所以基本上iOS会保持指向屏幕上每一次触摸的指针。你做的是用NSSet管理那些自己的触摸。当你按下场景时,只需将每个UITouch从设置设置为nil。这相当于UITouchPhaseCancelled。这将取消屏幕上的所有触摸。如果用户仍然将他的手指放在屏幕上,那么触摸将不再被注册......即使他移动它或其他东西。

注意:您需要删除ccTouchesCancelled中的所有对象(当用户在屏幕上有6个或更多触摸时调用它),否则当他再次触摸应用程序崩溃时。如果您的应用需要超过5次触摸,则需要找到解决方法。

答案 2 :(得分:0)

最简单的解决方案可能是让你的CCDirector完成弹出你的战斗场景后,首先在违规视图上调用resignFirstResponder然后调用'becomeFirstResponder`;无论如何,似乎应该向另一个响应者转发,希望当没有其他人处理它时,它会失败。

对UIView方法的更复杂的深入探讨提供了这个私人调用cancelTouchTracking。最有可能它与@skytz所做的类似。 警告:最后这种情况很可能会让您在应用商店流程中遭到拒绝,但对于您的信息却是如此。

我会选择更简单的解决方案并希望它有效。 O_O