Swift 基于度的偏移移动精灵

Swift 基于度的偏移移动精灵,swift,xcode,sprite-kit,swift4,Swift,Xcode,Sprite Kit,Swift4,我已经能够检测到角度,但我不确定如何在360度移动精灵。 我不希望精灵只能在某些部分移动,如上图所示,而是希望它能够在一个完整的圆圈中移动。 代码: override func touchsbegind(touch:Set,带有事件:UIEvent?){ 接触{ 让位置=触摸。位置(in:self) if(球框架包含(位置)){ 粘滞=真 }否则{ 粘滞=假 } } } 覆盖功能触摸移动(touchs:Set,带有事件:UIEvent?){ 接触{ 让位置=触摸。位置(in:self) 如果(s

我已经能够检测到角度,但我不确定如何在360度移动精灵。 我不希望精灵只能在某些部分移动,如上图所示,而是希望它能够在一个完整的圆圈中移动。 代码:

override func touchsbegind(touch:Set,带有事件:UIEvent?){
接触{
让位置=触摸。位置(in:self)
if(球框架包含(位置)){
粘滞=真
}否则{
粘滞=假
}
}
}
覆盖功能触摸移动(touchs:Set,带有事件:UIEvent?){
接触{
让位置=触摸。位置(in:self)
如果(stickActive==真){
var v=CGVector(dx:location.x-base.position.x,dy:location.y-base.position.y)
让角度=atan2(v.dy,v.dx)
var deg=角度*CGFloat(180/M_-PI)
打印(度+180)
让长度:CGFloat=base.frame.size.height/2-20
设xDist:CGFloat=sin(角度-1.57079633)*长度
让yDist:CGFloat=cos(角度-1.57079633)*长度
ball.position=CGPoint(x:base.position.x-xDist,y:base.position.y+yDist)
if(基本帧包含(位置)){
ball.position=位置
}否则{
ball.position=CGPoint(x:base.position.x-xDist,y:base.position.y+yDist)
}
}
}
}
覆盖函数touchesend(touchs:Set,带有事件:UIEvent?){
如果(stickActive==真){
让我们移动:SKAction=SKAction.move(到:base.position,持续时间:0.2)
move.timingMode=.easeOut
球。跑(动)
}
}

这非常简单,尽管我花了很长时间才弄明白怎么做

触摸法:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let location = touch.location(in: self)
        if isTracking == false && DPad.contains(location) {
            isTracking = true
        }
    }
}
这些东西需要在您的
didMove(toView:)
方法之外:

var xJoystickDelta:CGFloat = 0
var yJoystickDelta:CGFloat = 0
var v = CGVector()
var isTracking:Bool = false

var DPad = SKSpriteNode()
var thumbNode = SKSpriteNode()
thumbNode.size = CGSize(width: 50, height: 50)
DPad.size = CGSize(width: 150, height: 150)
DPad.position = CGPoint(x: 0, y: 0)
thumbNode.position = DPad.position
DPad.zPosition = 3
thumbNode.zPosition = 4
DPad.texture = SKTexture(imageNamed: "yourBaseTexture")
thumbNode.texture = SKTexture(imageNamed: "yourStickTexture")

self.addChild(thumbNode)
self.addChild(DPad) 
-解释-

touchsbegind
方法中,if语句正在测试您是否没有控制thumbNode,以及您的触摸是否在DPad节点内。然后开始跟踪

touchesMoved
once
isTracking==true
中,它开始计算必要的数学,然后调整所需的各种内容。(这很复杂,最重要的是它能工作。)

touchesedend
方法中,它测试您的手指何时离开屏幕,然后为下次使用重置所有内容

update(ucurrent:)
方法中,代码计算
CGVector
的角度,然后在各种情况下设置纹理(或任何您想做的事情)。然后计算DPad中拇指节点的位置,并在场景中移动播放器(或需要移动的任何东西)。调整
xScale
yScale
向上浮动可减慢移动速度,向下浮动可增加尝试移动的物体的移动速度

-额外的必需品-

您需要在
didMove(toView:)
方法中设置
DPad
thumbNode

var xJoystickDelta:CGFloat = 0
var yJoystickDelta:CGFloat = 0
var v = CGVector()
var isTracking:Bool = false

var DPad = SKSpriteNode()
var thumbNode = SKSpriteNode()
thumbNode.size = CGSize(width: 50, height: 50)
DPad.size = CGSize(width: 150, height: 150)
DPad.position = CGPoint(x: 0, y: 0)
thumbNode.position = DPad.position
DPad.zPosition = 3
thumbNode.zPosition = 4
DPad.texture = SKTexture(imageNamed: "yourBaseTexture")
thumbNode.texture = SKTexture(imageNamed: "yourStickTexture")

self.addChild(thumbNode)
self.addChild(DPad) 

您只需将
DPad.position
移动到您想要的任何位置。拇指节点将随之移动。此外,如果您有任何问题,请务必向我咨询,以便我可以帮助您。

您正在尝试制作操纵杆吗?如果你是,我可以帮你设置这个,很简单。如果我的问题有点困惑,很抱歉,但我想制作一个操纵杆。假设你使用spritekit,我的答案将提供设置操纵杆所需的一切。我现在正在测试。感谢问题?我回答你的问题了吗?如果是这样,你需要将我的答案标记为正确,这样未来的观众就不会感到困惑。
var xJoystickDelta:CGFloat = 0
var yJoystickDelta:CGFloat = 0
var v = CGVector()
var isTracking:Bool = false

var DPad = SKSpriteNode()
var thumbNode = SKSpriteNode()
thumbNode.size = CGSize(width: 50, height: 50)
DPad.size = CGSize(width: 150, height: 150)
DPad.position = CGPoint(x: 0, y: 0)
thumbNode.position = DPad.position
DPad.zPosition = 3
thumbNode.zPosition = 4
DPad.texture = SKTexture(imageNamed: "yourBaseTexture")
thumbNode.texture = SKTexture(imageNamed: "yourStickTexture")

self.addChild(thumbNode)
self.addChild(DPad)