不同的精灵位置使用相同的代码

时间:2015-04-06 03:17:01

标签: ios swift sprite-kit

我的精灵位置有一个奇怪的问题,我试过干净的构建,重新启动xcode,并运行不同的方案(iPhone5s,iPhone6),它们都返回同样的奇怪问题。 我试图通过以下方式设置精灵的位置:

balls.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame) + self.frame.size.width)

所以当我将println(balls.position)打印到控制台时,它返回(0.0,0.0)

但是当我尝试

println(CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame) + self.frame.size.width)

它返回(512.0,1408.0),这是球的正确位置。

我遇到了最后一个函数func ballPosition的问题,它用于确定精灵“球”的位置。由于某种原因它总是(0,0)。< / p>

以下是我的测试项目的完整代码:

import SpriteKit

class GameScene: SKScene, SKPhysicsContactDelegate {

    var circle = SKShapeNode()
    var balls = SKShapeNode()
    var ballColor = ["red", "blue", "green", "yellow"]
    var points = ["up", "down", "left", "right"]

    override func didMoveToView(view: SKView) {

        backgroundColor = SKColor.whiteColor()

        // set circle position and size

        circle = SKShapeNode(circleOfRadius: 100 ) // Size of Circle
        circle.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))  //Middle of Screen
        circle.strokeColor = SKColor.whiteColor()
        circle.fillColor = SKColor.orangeColor()
        self.addChild(circle)

    }

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        /* Called when a touch begins */

        circleRotate()

        ballPosition()
        // test ball position, this is the part with the issue I mentioned above.
        println(balls.position) // (0, 0)
        println(CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame) + self.frame.size.width)) // (512.0,1408.0)

    }

    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */

    }

    func circleRotate() {

        let circleAction = SKAction.rotateByAngle(CGFloat(-M_PI * 2 / 3), duration: 0.1)

        circle.runAction(SKAction.repeatAction(circleAction, count: 1))

    }

    func ballMove() {

        let ballMovement = SKAction.moveTo(CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)), duration: 5)
        balls.runAction(ballMovement)

    }

    func randomColor() {

        let ballColorIndex = Int(arc4random_uniform(UInt32(ballColor.count)))

        balls = SKShapeNode(circleOfRadius: 10 )

        if ballColorIndex == 0 {

            balls.strokeColor = SKColor.whiteColor()
            balls.fillColor = SKColor.redColor()
            // balls.zPosition = 10
            ballMove()

        } else if ballColorIndex == 1 {

            balls.strokeColor = SKColor.whiteColor()
            balls.fillColor = SKColor.blueColor()
            // balls.zPosition = 10
            ballMove()

        } else if ballColorIndex == 2 {

            balls.strokeColor = SKColor.whiteColor()
            balls.fillColor = SKColor.greenColor()
            // balls.zPosition = 10
            ballMove()

        } else if ballColorIndex == 3 {

            balls.strokeColor = SKColor.whiteColor()
            balls.fillColor = SKColor.yellowColor()
            // balls.zPosition = 10
            ballMove()

        }

    }

    func ballPosition() {

        let ballPointIndex = Int(arc4random_uniform(UInt32(points.count)))

        if ballPointIndex == 0 {

            balls.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame) + self.frame.size.width)
            randomColor()
            self.addChild(balls)

        } else if ballPointIndex == 1 {

            balls.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame) - self.frame.size.height)
            randomColor()
            self.addChild(balls)

        } else if ballPointIndex == 2 {

            balls.position = CGPoint(x:CGRectGetMidX(self.frame) - self.frame.size.width, y:CGRectGetMidY(self.frame))
            randomColor()
            self.addChild(balls)


        } else if ballPointIndex == 3 {

            balls.position = CGPoint(x:CGRectGetMidX(self.frame) + self.frame.size.width, y:CGRectGetMidY(self.frame))
            randomColor()
            self.addChild(balls)

        }

    }

}

1 个答案:

答案 0 :(得分:0)

问题是您在randomColor()中覆盖了球 - 您正在创建一个尚未添加到父视图中的新节点。

潜在的问题是您以一种导致混淆和错误的方式构建代码。你应该保持你的功能单一用途。他们应该做他们所说的。一个名为randomColor()的函数不应移动球移动或设置球的大小。位置功能不应设置颜色。

我重新安排了代码然后运行它。那个错误是固定的。你可以看到我改变了什么,现在应该能够进一步发展。祝你好运。

import SpriteKit

class GameScene: SKScene, SKPhysicsContactDelegate {

    var circle = SKShapeNode()
    var ball = SKShapeNode(circleOfRadius: 10)
    var ballColor = ["red", "blue", "green", "yellow"]
    var points = ["up", "dowm", "left", "right"]

    override func didMoveToView(view: SKView) {
        backgroundColor = SKColor.whiteColor()
        circle = SKShapeNode(circleOfRadius: 100 ) // Size of Circle
        circle.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))  //Middle of Screen
        circle.strokeColor = SKColor.whiteColor()
        circle.fillColor = SKColor.orangeColor()
        self.addChild(circle)
        self.addChild(ball)
        ball.position = CGPointMake(150, 0)
        println("Initial Ball Pos:   \(ball.position)")
    }

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        circleRotate()
        setRandomBallPosition()
        setRandomColor()
        ballMove()
        // test ball position
        println("--------------")
        println("Ball Pos:   \(ball.position)")
        println("Circle pos: \(circle.position)")
        println("Midpoint:   \(CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame) + self.frame.size.width))")
        println("--------------")
    }

    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
    }

    func circleRotate() {
        let circleAction = SKAction.rotateByAngle(CGFloat(-M_PI * 2 / 3), duration: 0.1)
        circle.runAction(SKAction.repeatAction(circleAction, count: 1))
    }

    func ballMove() {
        let ballMovement = SKAction.moveTo(CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)), duration: 5)
        ball.runAction(ballMovement)
    }

    func setRandomColor() {
        ball.strokeColor = SKColor.whiteColor()
        let ballColorIndex = Int(arc4random_uniform(UInt32(ballColor.count)))
        switch(ballColorIndex) {
        case 0:
            ball.fillColor = SKColor.redColor()
        case 1:
            ball.fillColor = SKColor.blueColor()
        case 2:
            ball.fillColor = SKColor.greenColor()
        case 3:
            ball.fillColor = SKColor.yellowColor()
        default:
            println("Unexpected random index value ", ballColorIndex)
        }
    }

    func setRandomBallPosition() {
        let ballPointIndex = Int(arc4random_uniform(UInt32(points.count)))
        println("ballPointIndex = \(ballPointIndex)")
        switch(ballPointIndex) {
        case 0:
            ball.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame) + (self.frame.size.width / 2))
        case 1:
            ball.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame) - (self.frame.size.height / 2))
        case 2:
            ball.position = CGPoint(x:CGRectGetMidX(self.frame) - (self.frame.size.width / 2), y:CGRectGetMidY(self.frame))
        case 3:
            ball.position = CGPoint(x:CGRectGetMidX(self.frame) + (self.frame.size.width / 2), y:CGRectGetMidY(self.frame))
        default:
            println("Unexpected random index value: ", ballPointIndex)
        }
        println("ball position = \(ball.position)")
    }
}