【问题标题】:Is it possible to "reset" any existing touches?是否可以“重置”任何现有的触摸?
【发布时间】:2012-12-04 18:30:41
【问题描述】:
Cocos2d-iphone 1.0.1.
  • 我的主游戏场景要求玩家用手指按住屏幕,角色才能移动。
    • 角色移动时(因此手指按下屏幕),可能会发生战斗。这样的战斗触发了一个新的CCScene,该CCScene推入CCDirector中(所以主要的游戏场景仍然存在于内存中)。
    • 在战斗中,玩家自然会在某个时候松开手指。
    • 战斗结束后,这个CCScene弹出。因此,主游戏场景返回。
  • 现在这里有一个问题:主游戏场景仍然认为战斗前最初按下屏幕的手指仍然在同一点按下,因此操纵杆是尽管手指不再按屏幕,但仍然“正常工作”并且播放器仍在移动

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

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

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

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

编辑

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

【问题讨论】:

    标签: cocos2d-iphone


    【解决方案1】:

    为了确保我理解问题:

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

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

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

    【讨论】:

      【解决方案2】:

      我自己也遇到过这种问题。

      我是如何解决的:

      - (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 次触摸,您需要找到解决方法。

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-05-18
          • 1970-01-01
          • 1970-01-01
          • 2017-02-24
          • 1970-01-01
          • 1970-01-01
          • 2016-07-19
          相关资源
          最近更新 更多