Показать направление к CGPoint SpriteKit - PullRequest
0 голосов
/ 01 июля 2018

Мне нужна стрелка (белый кружок), которая показывает направление на CGPoint, когда пользователь перемещает свой значок и камеру.

Я имею в виду, что стрелка (белый кружок) должна занимать позицию на краю видимого экрана и показывает путь, который помогает пользователю вернуться к следующей CGPoint.

Демо GIF

1 Ответ

0 голосов
/ 02 июля 2018

Вы ожидаете двух вещей:

  • поместите стрелку на правильную сторону экрана, учитывая целевую позицию 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 https://stackoverflow.com/questions/38411494/rotating-a-sprite-towards-a-point-and-move-it-towards-it-with-a-duration
    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)
}
...