swift - 如何在不接触 Swift 的情况下拖动 SKSpriteNode

标签 swift sprite-kit uipangesturerecognizer

我试图通过拖动水平移动 SKSpriteNode。要了解我尝试实现的目标,您可以 watch this .我希望玩家能够在不触摸 Sprite 的情况下拖动它。但我真的不知道如何正确实现它。 我尝试做类似的事情:

 override func didMoveToView(view: SKView) {
    /* Setup your scene here */

    capLeft.size = self.capLeft.size
    self.capLeft.position = CGPointMake(CGRectGetMinX(self.frame) + self.capLeft.size.height * 2, CGRectGetMinY(self.frame) + self.capLeft.size.height * 1.5)
    capLeft.zPosition = 1

    self.addChild(capLeft)

    let panLeftCap: UIPanGestureRecognizer = UIPanGestureRecognizer(target: capLeft, action: Selector("moveLeftCap:"))

当我设置 moveLeftCap 函数时,我为 UIPanGestureRecognizer 找到的代码需要“查看”并给我一个错误。我还想限制 Sprite 不应通过的最小和最大位置。 有什么想法可以实现吗?

最佳答案

您可能会遇到该错误,因为您不能只从树中的任何节点访问 View 。您可以将其称为 scene!.view 或您在场景中处理手势,如果您想让事情变得简单,这是更可取的。

我试了一下,想出了这个基本场景:

import SpriteKit

class GameScene: SKScene {

    var shape:SKNode!

    override func didMoveToView(view: SKView) {
        //creates the shape to be moved
        shape = SKShapeNode(circleOfRadius: 30.0)
        shape.position = CGPointMake(frame.midX, frame.midY)
        addChild(shape)

        //sets up gesture recognizer
        let pan = UIPanGestureRecognizer(target: self, action: "panned:")
        view.addGestureRecognizer(pan)
    }

    var previousTranslateX:CGFloat = 0.0

    func panned (sender:UIPanGestureRecognizer) {
        //retrieve pan movement along the x-axis of the view since the gesture began
        let currentTranslateX = sender.translationInView(view!).x

        //calculate translation since last measurement
        let translateX = currentTranslateX - previousTranslateX

        //move shape within frame boundaries
        let newShapeX = shape.position.x + translateX
        if newShapeX < frame.maxX && newShapeX > frame.minX {
            shape.position = CGPointMake(shape.position.x + translateX, shape.position.y)
        }

        //(re-)set previous measurement
        if sender.state == .Ended {
        previousTranslateX = 0
        } else {
            previousTranslateX = currentTranslateX
        }
    }
}

当您在屏幕上移动手指时,圆圈会相应地沿 x 轴移动。

如果您想在 x 和 y 两个方向上移动 Sprite ,请记住从 View 中反转 y 值(在 View 中向上在场景中向下)。

关于swift - 如何在不接触 Swift 的情况下拖动 SKSpriteNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31928324/

相关文章:

ios - iPad 2 上的节点位置错误

ios - 向 UIPanGestureRecognizer 添加惯性

ios - UITableView 上的手势冲突滑动以删除 iOS

ios - 在运行时定义类型别名

ios - SpriteKit 和 swift : Changing size of scrolling ground node depending on screen size does not work

ios - 如何更改所选图表数据集图表中 LineChartView 中 xAxis 和 yAxis 的不同突出显示颜色?

ios - 按下主页按钮时暂停 Sprite Kit 场景

ios - UIPanGestureRecognizer 当滑动单元格以获得更多按钮时如果用户滑动不到一半如何使 View 反弹

ios - swift OutputStream 找不到成员 "write"

ios - 使用 CoreData 时出现 NSFetchedResultsController fatal error (尝试获取)