spritekit / ios中sprite上手指的连续最小速度跟踪

时间:2015-12-14 05:37:16

标签: sprite-kit sprite uigesturerecognizer swipe gesture

连续跟踪用户在没有抬起手指的情况下在精灵上上下移动手指的速度有什么好方法?如果他们没有足够快(设定最低限度)来执行某项行动。

1 个答案:

答案 0 :(得分:0)

这是一些可用于根据手指加速度以不同速度在屏幕上拖动精灵的代码。您可以添加自己的代码来检测更改的大小,并执行您想要的任何操作。

enter image description here

class GameScene: SKScene {

    // time values
    var delta:NSTimeInterval = NSTimeInterval(0)
    var last_update_time:NSTimeInterval = NSTimeInterval(0)

    // our sprite
    let sprite = SKSpriteNode(color: SKColor.redColor(), size: CGSize(width: 20, height: 30))

    // tracking difference between touches
    var currentTouchY: CGFloat = CGFloat(0)
    var lastTouchY: CGFloat = CGFloat(0)

    // the magnitude of change between current and last touch
    var forceMag: CGFloat = CGFloat(0)
    // max mag so our sprite doesnt travel at crazy speed
    let forceMagMax: CGFloat = CGFloat(7)
    // direction of our sprites travel
    var forceDir: CGFloat = CGFloat(0)
    // arbitrary speed we want sprite to move
    let velocity: CGFloat = CGFloat(70)

    // we use this to stop moving our sprite when we let go
    var intervalsWithoutChange = 0

    override func didMoveToView(view: SKView) {
        sprite.position.x = 100
        sprite.position.y = size.width/2
        self.addChild(sprite)
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)
            let yCoord = location.y

            lastTouchY = yCoord
        }
    }

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)
            let yCoord = location.y

            intervalsWithoutChange = 0
            currentTouchY = yCoord
            let diff = currentTouchY - lastTouchY
            forceMag = abs(diff)
            forceMag = forceMag > forceMagMax ? forceMagMax : forceMag
            forceDir = diff < 0 ? -1 : 1
            lastTouchY = yCoord
        }
    }

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
        intervalsWithoutChange = 1
        currentTouchY = 0
        lastTouchY = 0
    }

    override func update(currentTime: NSTimeInterval) {

        if last_update_time == 0.0 {
            delta = 0
        } else {
            delta = currentTime - last_update_time
        }

        last_update_time = currentTime

        if intervalsWithoutChange > 0 {
            forceMag -= CGFloat(15) * CGFloat(delta)
        }

        if forceMag < 0.01 {
            forceMag = 0
        }

        let change = forceDir * pow(forceMag, 1.29)

        sprite.position.y += change * CGFloat(delta) * velocity
    }
}