【问题标题】:UISwipeGestureRecognizer with SpriteKit using Swift使用 Swift 的带有 SpriteKit 的 UISwipeGestureRecognizer
【发布时间】:2014-08-14 20:43:09
【问题描述】:

我正在用 swift 创建一个游戏,其中涉及用字母组成单词。这些字母是单独的 SKSpriteNode,位于作为 SKSpriteNode 的“架子”上。为了从“架子”中删除字母,我试图介绍向上滑动。不幸的是,我遇到了字母被滑动的问题。架子似乎正在吸收它,有时甚至是 SKScene。我已禁用货架节点上的用户交互。

这是我的设置:

swipeRecognizer = UISwipeGestureRecognizer(target: self, action: Selector("move:"))
swipeRecognizer.direction = UISwipeGestureRecognizerDirection.Up
self.view.addGestureRecognizer(swipeRecognizer)

我将 swipeRecognizer 添加到视图中,然后在 move 方法中,我有以下内容:

func move(swipe:UISwipeGestureRecognizer){        
    if(swipe.state == UIGestureRecognizerState.Ended && swipe.numberOfTouches() == 1){

        var touchLocation = swipe.locationInView(swipe.view)
        touchLocation = self.convertPointFromView(touchLocation)            
        var sprite = self.nodeAtPoint(touchLocation)

        if sprite is Letter{
            let letter = sprite as Letter
            if(gameManager.letterOnShelf(letter)){
                gameManager.letterFlicked(letter)
            }
        }
    }
}

只有有时它会将精灵识别为一个字母,80% 的时间精灵是架子,我不知道正确的工作方式是什么.....

非常感谢任何帮助。

大家加油!!

【问题讨论】:

  • 可以发一张布局图吗?如果不是,这些字母是在黑板下方/上方吗?它们有多远?
  • zPosition 为:shelf.zPosition = 0 letter.zPosition = 3。对于添加到屏幕的所有字母。这能回答你的问题吗?

标签: ios swift sprite-kit ios8 uiswipegesturerecognizer


【解决方案1】:

我会推荐:

  1. 使用 UILongPressGestureRecognizer 并将 minimumPressDuration 设置为 0。
  2. 当手势处于UIGestureRecognizerStateBegan 状态时,查看您的触摸结束的精灵是否为Letter 并保存对该图块的引用。
  3. UIGestureRecognizerStateEnded 状态下,您应该能够看到您的手势结束的位置(或者可能是轨迹等),然后移动您之前存储引用的磁贴。

【讨论】:

  • 是的,这听起来是个不错的方法。不过,它似乎不符合条件 if(swipe.state == UIGestureRecognizerState.Began) 。仅注册 UIGestureRecognizerState.Ended。我设置了一个断点,并且唯一一次移动:被称为结束状态。 ;目标=)>;方向=向上>
  • 我必须尝试稍微调整一下我的代码,因为我已经在使用 {touchesBegan touchesMoved touchesEnded}。使用 {UILongPressGestureRecognizer} 似乎已经彻底改变了它们
  • 好的,所以我回到了这个人那里并找到了解决方案。与您的略有不同,但使用一些相同的原则。我创建了一个名为 letterSwiped 的 SKSpriteNode。当 touchesBegan 发生时,我保存了 Letter 类型的字母。然后如果调用了 swipeGesture 方法,我会检查 letterSwiped 变量的类型。即,如果它的类型为 Letter,则执行操作,如果其类型为 SKSpriteNode,则不执行任何操作。
  • 听起来不错!我会小心在你无意的单元格上刷卡。也许您应该在一段时间后使单元格选择无效。但无论如何,很高兴你找到了有用的东西!
猜你喜欢
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多