【问题标题】:Spritekit move camera only if not dragging from spriteSpritekit 仅在不从 sprite 拖动时才移动相机
【发布时间】:2017-01-10 12:33:36
【问题描述】:

在我正在构建的游戏中,用户可以通过在屏幕上拖动来移动相机,类似于滚动视图。这一切都由 touchesBegan 和 touchesMoved 方法在主场景文件中处理。但是,我还希望用户能够从 SKSpriteNode(实际上并不移动它)拖动到另一个 SKSpriteNode - 然后我基于 2 个节点执行操作。我可以分别做这两件事。但是当用户从一个节点拖动到另一个节点时,我不希望相机平移。

我再次设法使用在 touchesBegan 上设置的布尔标志解决了这个问题,如果他们触及了一个节点。但是,如果用户开始触摸其中一个精灵但完成了一个精灵,则屏幕不会平移,例如他们实际上快速执行了碰巧在节点上开始的平移。有人对此有什么好的解决方案吗?

我的一个想法是将所有触摸事件存储在 touchesMoved 中,然后在 touchesEnded 中循环遍历它们,执行相同的移动逻辑,前提是它们没有在精灵上开始和结束。例如

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

        for touch in touches {
            movingTouches.append(touch)
        }
    }


override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {


        if startedOnSprite && !endedOnSprite || !(startedOnSprite && endedOnSprite) {

                let location = movingTouches.last().location(in: self)
                let previousLocation = movingTouches.first().location(in: self)
                let deltaY = location.y - previousLocation.y
                let deltax = location.x - previousLocation.x


                gameCamera?.position.y -= deltaY

                view.frame.size.height
                gameCamera?.position.y = (gameCamera?.position.y)! > viewHeight/2 ? viewHeight/2 : (gameCamera?.position.y)!
                gameCamera?.position.y = (gameCamera?.position.y)! < -(viewHeight/2) ? -(viewHeight/2) : (gameCamera?.position.y)!
                gameCamera?.position.x -= deltax
                gameCamera?.position.x = (gameCamera?.position.x)! < -(viewWidth/2) ? -(viewWidth/2) : (gameCamera?.position.x)!
                gameCamera?.position.x = (gameCamera?.position.x)! > (viewWidth/2) ? (viewWidth/2) : (gameCamera?.position.x)!
            }

        movingTouches = [UITouch]()
        endedOnSprite = false
        startedOnSprite = false
    }

为了使事情复杂化,我还希望 Sprite 在它们上进行点击事件以及拖动。我正在努力寻找在 SpriteKit 中完成这一切的好方法

不幸的是,上面的内容根本不是很流畅,并且认为它似乎甚至没有滚动我期望的距离(如果我不担心它是否开始,完全相同的代码确实可以正确滚动一个精灵)

为了清楚起见,我想要滚动行为,前提是用户实际上并未使用手指从一个精灵“绘制”到另一个

【问题讨论】:

    标签: sprite-kit sknode


    【解决方案1】:

    Gesture recognisors 在你的场景中会做你需要的事情,保持点击和滑动分开。

    【讨论】:

    • 他们愿意吗?从理论上讲,从一个精灵拖动到另一个精灵会被归类为滑动,这不会导致平移行为吗?
    • 您在手势识别器中有很多精细控制,状态指示手势是否已完成。
    • 此外,每个手势都是不同的,旨在不相互干扰,并且可以通过了解目标位置(即精灵或背景节点)来处理不同类型的平移?
    • 我很欣赏对手势识别器的控制,但我仍然不确定它们是否允许我执行我想要的控制以能够拖动节点但如果它没有完成在另一个节点上执行滚动。说我会在stackoverflow.com/questions/5111828/…这里调查这篇文章,当我有更多时间时,看看我是否能完成我想做的事情。感谢您的意见
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多