落球动画不起作用(斯威夫特)

时间:2016-08-09 16:05:08

标签: ios swift sprite-kit

此代码应该从屏幕顶部向底部丢球。一旦它触摸屏幕的底部,它应该显示回屏幕的顶部。它没有重新定位到顶部,它停止移动。我希望它是一个连续循环,每次触及底部时都会重置ball.y位置。

import SpriteKit

class GameScene: SKScene {
    let ball = SKShapeNode(circleOfRadius: 20)
    let label = SKLabelNode(fontNamed: "Futura")
    let movingObjects = SKSpriteNode()

    override func didMoveToView(view: SKView) {
        let sceneBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
        self.physicsBody = sceneBody

        //Ball Transition
        let ballTransition = SKAction.sequence([SKAction.fadeInWithDuration(1)])
        ball.runAction(ballTransition)

        //Ball function
        ball.fillColor = SKColor.redColor()

        ball.physicsBody = SKPhysicsBody(circleOfRadius: 25)
        ball.physicsBody?.affectedByGravity = false

        //Ball Movement
        ball.position = CGPoint(x: self.frame.size.width/2, y: CGFloat(self.frame.size.height*1))

        ballMovement()

        movingObjects.addChild(ball)

        self.addChild(label)
    }

    func ballMovement() {
        let moveBall = SKAction.moveToY(self.frame.size.height*0, duration: 3)
        let removeBall = SKAction.removeFromParent()
        let moveAndRemove = SKAction.sequence([moveBall, removeBall])
        ball.runAction(moveAndRemove)

        //Label Sprite
        label.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame))
        label.fontColor = SKColor.redColor()
        label.fontSize = 30
    }

    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
        label.text = "\(ball.position.y)"

        if ball.position.y < 26 {
            ball.position = CGPoint(x: self.frame.size.width/2, y: CGFloat(self.frame.size.height*1))
        }
    }
}

1 个答案:

答案 0 :(得分:1)

在动作中从其父级移除球并且仍然在其他地方对其进行操作将变得非常脆弱,因为您的程序变得更加复杂。为什么不用这些操作完成所有操作并让精灵工具包担心呢?

 let moveBall = SKAction.moveToY(0, duration: 3)
 let goBackUp = SKAction.moveToY(self.frame.size.height, duration:0)
 let keepFalling = SKAction.sequence([moveBall, goBackUp])
 ball.runAction(SKAction.repeatActionForever(keepFalling))