Sprite kit Spritekit仅在不从sprite拖动时移动摄影机

Sprite kit Spritekit仅在不从sprite拖动时移动摄影机,sprite-kit,sknode,Sprite Kit,Sknode,在我正在构建的一个游戏中,用户可以通过在屏幕上拖动来移动相机,类似于滚动视图。所有这些都在主场景文件中通过ToucheSBegind和touchesMoved方法进行处理。但是,我也希望用户能够从一个SKSpriteNode(而不是实际移动它)拖动到另一个SKSpriteNode,然后根据这两个节点执行一个操作。我可以分别做这两件事。但当用户从一个节点拖动到另一个节点时,我不希望摄影机平移 我再次尝试使用一个布尔标志来解决这个问题,该标志设置在touchsbegind上,如果他们已经接触到一个节

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

我再次尝试使用一个布尔标志来解决这个问题,该标志设置在touchsbegind上,如果他们已经接触到一个节点。但是,如果用户开始触摸其中一个精灵,但结束了其中一个精灵,则屏幕不会平移。例如,他们实际上快速执行了一个恰好在节点上启动的平移。有人有什么好的解决办法吗

我的一个想法是将所有触摸事件存储在touchesMoved中,然后在ToucheSEnd中循环它们,执行相同的运动逻辑,前提是它们不是在精灵上开始和结束的。e、 g

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
    }
override func touchesMoved(touch:Set,带有事件:UIEvent?){
接触{
movingTouches.append(触摸)
}
}
覆盖函数touchesend(touchs:Set,带有事件:UIEvent?){
如果启动了Prite&!endedOnSprite | |!(启动了Prite&&endedOnSprite){
let location=movingTouches.last().location(in:self)
让previousLocation=movingTouches.first().location(in:self)
设deltaY=location.y-previousLocation.y
设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)!
}
移动触摸=[UITouch]()
endedOnSprite=false
startedOnSprite=false
}
为了使事情复杂化,我还希望精灵在它们身上有一个点击事件以及拖动。我正在努力寻找一种在SpriteKit中实现这一切的好方法

不幸的是,上面的代码一点也不平滑,而且在我看来,它似乎也没有达到我预期的滚动距离(如果我不担心它是否在精灵上启动的话,完全相同的代码确实会正确滚动)


所以说得很清楚,我想要滚动行为,只要用户不是真的用手指从一个精灵到另一个精灵“画画”

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

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

他们会吗?从理论上讲,从一个精灵拖动到另一个精灵会被归类为滑动,这不会导致平移行为吗?手势识别器中有很多精细的控制,状态指示手势是否已完成。此外,每个手势都是不同的,并且设计为不会相互干扰,通过知道目标位置(即精灵或背景节点)可以处理不同类型的平移?我很感激能够控制手势识别器,但是我仍然不确定他们是否允许我进行我想要的控制,以便能够拖动一个节点,但是如果它没有在另一个节点上完成,则执行滚动。说我会在这里调查这篇文章,当我有更多的时间,看看我是否能完成我想做的。谢谢你的意见,好吗?从理论上讲,从一个精灵拖动到另一个精灵会被归类为滑动,这不会导致平移行为吗?手势识别器中有很多精细的控制,状态指示手势是否已完成。此外,每个手势都是不同的,并且设计为不会相互干扰,通过知道目标位置(即精灵或背景节点)可以处理不同类型的平移?我很感激能够控制手势识别器,但是我仍然不确定他们是否允许我进行我想要的控制,以便能够拖动一个节点,但是如果它没有在另一个节点上完成,则执行滚动。说我会在这里调查这篇文章,当我有更多的时间,看看我是否能完成我想做的。谢谢你的意见