显示指向 CGPoint SpriteKit 的方向

Show direction to CGPoint SpriteKit

我需要一个箭头(白色圆圈)在用户移动他的图标和相机时显示指向 CGPoint 的方向。

我的意思是箭头(白色圆圈)需要位于可见屏幕的边缘并显示帮助用户return跟随CGPoint的方式。

Demo gif

您期待两件事:

  • 根据目标 CGPoint 位置将箭头放在正确的屏幕一侧
  • 将箭头指向目标 CGPoint

在你的 touchesMoved(_:) 方法中,你可以更新箭头的旋转和位置,未经测试但原理应该有效:

private func placeArrow(at sourceNode: SKNode, for targetNode: SKNode) {

    //do not display arrow if already on screen
    guard targetNode.position.x > cameraNode.position.x - screenSizeX/2 
    && targetNode.position.x < cameraNode.position.x + screenSizeX/2
    && targetNode.position.y > cameraNode.position.y - screenSizeY/2
    && targetNode.position.y < cameraNode.position.y + screenSizeY/2
    {
        arrowNode.isHidden = true
        return
    }

    //find arrow position, if on the left place to the left side, else on the right
    //place at the medium y between the 2 points
    let screenSizeX = UIScreen.main.bounds.width
    let screenSizeY = UIScreen.main.bounds.height

    let ymin = cameraNode.position.y - screenSizeY/2 + 10
    let ymax = cameraNode.position.y + screenSizeY/2 - 10
    let midY = (sourceNode.position.y + targetNode.position.y)/2

    var clampedMidY = midY
    if midY > ymax {
      clampedMidY = ymax
    } else if midY < ymin {
      clampedMidY = ymin
    }


    arrowNode.position = CGPoint(x: (targetNode.position.x < sourceNode.position.x) ? cameraNode.position.x - screenSizeX/2  : cameraNode.position.x + screenSizeX/2, y: clampedMidY)

    //find arrow orientation
    //see 
    let v1 = CGVector(dx:0, dy:1)
    let v2 = CGVector(dx: targetNode.position.x - sourceNode.position.x, dy: targetNode.position.y - sourceNode.position.y)
    arrowNode.zRotation = atan2(v2.dy, v2.dx) - atan2(v1.dy, v1.dx)
}