3
Cocos2d-iphone 1.0.1.
  • 我的主要游戏场景要求玩家用手指按住屏幕让角色移动。
    • 角色移动时(因此手指按下屏幕),可能会发生战斗。这样的战斗触发了一个新CCScene被推入的CCDirector(所以主要的游戏场景仍然存在于记忆中)。
    • 在战斗中,玩家自然会在某个时候松开手指。
    • 当战斗结束时,这CCScenepop。因此,主游戏场景返回。
  • 现在这里有一个问题:主游戏场景仍然认为战斗前最初按下屏幕的手指仍然在同一点按下,因此操纵杆仍然“起作用”并且玩家尽管事实上仍然在移动手指不再按压屏幕。

有没有办法“重置”屏幕触摸?我想onEnter在主游戏场景的方法中这样做。我尝试了类似的东西

self.isTouchEnabled = NO;
self.isTouchEnabled = YES;

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

基本上,我需要一种方法来告诉主要游戏场景“伙计,不管你怎么想,没人会触摸屏幕”。

编辑

请注意,如果您再次按屏幕,它是固定的。

4

3 回答 3

1

为了确保我理解问题:

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

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

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

于 2012-12-10T02:39:53.770 回答
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 次触摸,您需要找到解决方法。

于 2012-12-13T23:22:31.713 回答
0

可能最简单的解决方案是让您的 CCDirector 在完成战斗场景弹出后,首先调用resignFirstResponder违规视图上的“becomeFirstResponder”;无论如何,在我的脑海中似乎应该将触球转发给另一个响应者,希望在没有其他人处理它时让它消失。

更复杂的 UIView 方法提供了这个私有调用cancelTouchTracking。它很可能会做一些类似于@skytz 放在一起的事情。警告:最后一个很可能会让你在应用商店过程中被拒绝,但为了你的信息,它在那里。

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

于 2012-12-14T07:36:43.273 回答