【问题标题】:SKAction follow UIBezierPath function not working SpriteKit - SwiftSKAction 遵循 UIBezierPath 函数不起作用 SpriteKit - Swift
【发布时间】:2016-05-17 16:02:29
【问题描述】:

在我的应用程序中,我有一个 Sprite 围绕另一个 sprite 盘旋。我希望这个精灵在屏幕被按住时加速。我已经实现了加速功能,但我似乎无法弄清楚为什么当屏幕被点击和放开后精灵会重置回某个位置。我有一种感觉,我知道为什么,但我已经尝试修复它,但我似乎无法更接近解决方案。代码如下。

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    let dx = Slider.accessibilityActivationPoint.x
    let dy = Slider.accessibilityActivationPoint.y

    let rad = atan2(dx, dy)

    let Path = UIBezierPath(arcCenter: CGPoint(x: self.frame.width / 2, y: self.frame.height / 2), radius: 90, startAngle: rad, endAngle: rad + CGFloat(M_PI * 4), clockwise: true)

    let follow = SKAction.followPath(Path.CGPath, asOffset: false, orientToPath: true, speed: 400)
    //let rotate = SKAction.rotateByAngle(75, duration: 100)

    Slider.runAction(SKAction.repeatActionForever(follow).reversedAction())
}

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {


    let dx = Slider.accessibilityActivationPoint.x
    let dy = Slider.accessibilityActivationPoint.y

    let rad = atan2(dy, dx)

    let Path = UIBezierPath(arcCenter: CGPoint(x: self.frame.width / 2, y: self.frame.height / 2), radius: 90, startAngle: 9, endAngle: rad + CGFloat(M_PI * 4), clockwise: true)

    let follow = SKAction.followPath(Path.CGPath, asOffset: false, orientToPath: true, speed: 150)


    Slider.runAction(SKAction.repeatActionForever(follow).reversedAction())
}

func moveClockWise(){

    let dx = Slider.position.x / 2
    let dy = Slider.position.y / 2

    let rad = atan2(dy, dx)


    let Path = UIBezierPath(arcCenter: CGPoint(x: self.frame.width / 2, y: self.frame.height / 2), radius: 90, startAngle: rad, endAngle: rad + CGFloat(M_PI * 4), clockwise: true)

    let follow = SKAction.followPath(Path.CGPath, asOffset: false, orientToPath: true, speed: 150)
    //let rotate = SKAction.rotateByAngle(75, duration: 100)

    Slider.runAction(SKAction.repeatActionForever(follow).reversedAction())
    //Slider.runAction(SKAction.repeatActionForever(rotate).reversedAction())
}

【问题讨论】:

    标签: swift sprite-kit uibezierpath


    【解决方案1】:

    旁注:你不应该在变量上使用大写。大写是为类名保留的..

    例如:

    let slider = Slider()
    

    这是几乎所有编程语言都使用的命名约定 :)

    无论如何..尝试做

    import SpriteKit
    
    class GameScene: SKScene {
    
        let Slider = SKSpriteNode(color: SKColor.redColor(), size: CGSizeMake(10, 10))
    
        override func didMoveToView(view: SKView) {
            Slider.position = CGPointMake(size.width/2, size.height/2)
            addChild(Slider)
        }
    
        override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    
    
            let dx = Slider.accessibilityActivationPoint.x
            let dy = Slider.accessibilityActivationPoint.y
    
            let rad = atan2(dx, dy)
    
            let Path = UIBezierPath(arcCenter: CGPoint(x: self.frame.width / 2, y: self.frame.height / 2), radius: 90, startAngle: rad, endAngle: rad + CGFloat(M_PI * 4), clockwise: true)
    
            let follow = SKAction.followPath(Path.CGPath, asOffset: false, orientToPath: true, speed: 400)
            //let rotate = SKAction.rotateByAngle(75, duration: 100)
    
            if !Slider.hasActions() {
                Slider.runAction(SKAction.repeatActionForever(follow).reversedAction())
            } else {
                Slider.runAction(SKAction.speedTo(1, duration: 0))
            }
    
    
    
        }
    
        override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
            Slider.runAction(SKAction.speedTo(0.4, duration: 0))
    
        }
    
        func moveClockWise(){
    
            let dx = Slider.position.x / 2
            let dy = Slider.position.y / 2
    
            let rad = atan2(dy, dx)
    
    
            let Path = UIBezierPath(arcCenter: CGPoint(x: self.frame.width / 2, y: self.frame.height / 2), radius: 90, startAngle: rad, endAngle: rad + CGFloat(M_PI * 4), clockwise: true)
    
            let follow = SKAction.followPath(Path.CGPath, asOffset: false, orientToPath: true, speed: 150)
            //let rotate = SKAction.rotateByAngle(75, duration: 100)
    
            Slider.runAction(SKAction.repeatActionForever(follow).reversedAction())
            //Slider.runAction(SKAction.repeatActionForever(rotate).reversedAction())
    
        }
    }
    

    【讨论】:

    • 我在每一个之前都试过这个,但它不起作用。还有其他想法吗?
    猜你喜欢
    • 1970-01-01
    • 2017-06-06
    • 2016-04-08
    • 2016-03-07
    • 1970-01-01
    • 2019-08-11
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多