2015-04-06 3 views
1

У меня странная проблема с моей позицией спрайта, я попробовал чистую сборку, перезагрузил 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).

Вот полный код из моего тестового проекта:

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) 

     } 

    } 

} 
+0

середина экрана (512.0, 384.0), спрайт должен перемещаться из верхней части экрана в экран. но вместо этого спрайт всегда приходит из-за пределов слева внизу экрана. позиция на консоли всегда печатает (0, 0) –

+0

Большое спасибо! –

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

Большое спасибо. Это очень помогает мне, поскольку я новичок в программировании. Я очень ценю усилия, которые вы вложили и помогли мне! Я уверен, что я многому научусь, перейдя пример, который вы предоставили. Еще раз большое спасибо! –

+0

Это был в основном очень хороший код и разумно выполнен. Респектабельное усилие для нового программиста. Я занимаюсь программированием на протяжении 35 лет, большинство из которых профессионально работают в компаниях из Силиконовой долины и многих крупных проектах. Если вы можете понять изменения, которые я сделал, и почему я их создал, и почувствовать, как это помогло мне найти вашу ошибку, и поможет вам написать более удобный код, который легче устранить, вы будете на пути к тому, чтобы быть очень прочным и компетентным программистом , Спасибо за галочку и дайте мне знать! Удачи! – clearlight

+0

@f_qi BTW: Если бы мне пришлось делать дальнейшие улучшения, я бы попытался (как правило) избегать установки глобальных переменных внутри функций и вместо этого передавать параметры для функции и возвращать результаты через возвращаемое значение. Вы можете столкнуться с проблемами, когда различные функции начинают изменять общие данные из мест и ситуаций, которые трудно увидеть и отслеживать. И это * действительно * становится беспорядком, когда вы начинаете работать с многопоточным кодом. Поэтому изучите параметры функции и возвращаемые значения. – clearlight

Смежные вопросы