Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 相同代码的不同精灵位置_Ios_Swift_Sprite Kit - Fatal编程技术网

Ios 相同代码的不同精灵位置

Ios 相同代码的不同精灵位置,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我的sprite位置有一个奇怪的问题,我尝试了清理构建,重新启动xcode,并在不同的模式下运行Phone5s,iPhone6,它们都返回相同的奇怪问题。 我试图通过以下方式设置精灵的位置: balls.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame) + self.frame.size.width) 所以当我将lnballs.position打印到控制台时,它返回0.0,0.0 但是当我试着

我的sprite位置有一个奇怪的问题,我尝试了清理构建,重新启动xcode,并在不同的模式下运行Phone5s,iPhone6,它们都返回相同的奇怪问题。 我试图通过以下方式设置精灵的位置:

balls.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame) + self.frame.size.width)
所以当我将lnballs.position打印到控制台时,它返回0.0,0.0

但是当我试着

println(CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame) + self.frame.size.width)
它返回512.01408.0,这是球应该在的正确位置

我对最后一个函数func ballPosition有异议,它用于确定精灵球的位置。出于某种原因,它总是0,0

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

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)

        }

    }

}

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

潜在的问题是,您的代码结构会导致混乱和错误。你应该保持你的职能单一化。他们应该言行一致。名为randomColor的函数不应移动球或设置球的大小。位置功能不应设置颜色

我重新整理了代码并运行了它。那个bug已经修复了。你可以看到我改变了什么,现在应该可以更进一步了。祝你好运

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)")
    }
}

屏幕的中间是512.0384.0,精灵应该从屏幕顶部移动到屏幕中。但是,精灵总是来自屏幕左下角的外部。控制台中的位置总是打印0,0谢谢,我也会编辑代码,以便人们可以轻松阅读。我发现了问题,并提供了代码工作版本的示例。您可能会发现您想要替换节点或添加多个节点,但这只是一个小小的调整。非常感谢。这对我帮助很大,因为我是编程新手。我真的很感激你为我付出的努力和帮助!我相信通过复习你提供的例子,我会学到很多东西。再次感谢大家!这基本上是非常好的代码,而且做得很聪明。对于一个新的程序员来说,这是值得尊敬的努力。我从事编程工作已经35年了,其中大部分都是为硅谷公司和许多重大项目工作的。如果您能够理解我所做的更改及其原因,并了解它如何帮助我发现您的错误,并将帮助您编写更易于故障排除的可维护代码,您将成为一名非常可靠和有能力的程序员。谢谢你的勾选并让我知道!祝你好运@f_qi顺便说一句:如果我必须做进一步的改进,我通常会尽量避免在函数中设置全局变量,而是将参数传递给函数并通过返回值返回结果。当不同的函数开始修改来自难以查看和跟踪的位置和情况的共享数据时,您可能会遇到问题。当您开始处理多线程代码时,它真的会变得一团糟。因此,研究函数参数和返回值。Swift/iOS中使用的全局变量很方便,但在语言中是一个有争议的部分。您可以更轻松地完成很多事情,但如果您至少不了解安全编程实践并尽量减少全局使用,您也可以编写蹩脚的代码。当你做这样的事情时,试着用一种尽可能自我记录的方式来编写代码,这样,如果你几个月或几年后再回来看看,你可能会很快理解你在做什么。如果您还没有发现这一点,很快您就会发现最“直接”的代码以后很难理解。非常有意识地和描述性地命名您的函数和变量,您将真正为自己省去很多麻烦,因为这样您的代码读起来更像一本书。它实际上告诉你它在做什么。如果你不得不在以后破译所有东西,那将是如此的麻烦和浪费时间。你会比想象中更快地忘记你在想什么:-纪律、良好的习惯和干净的代码可以帮助你避免一些真正的调试噩梦