【问题标题】:How to set ball's random position in Spritekit?如何在 Spritekit 中设置球的随机位置?
【发布时间】:2016-11-10 00:36:15
【问题描述】:

我正在制作一个游戏,场景中有两个球,但用户将点击正确的球。但是,当用户点击正确的球时,我想为我的第二个球设置一个随机位置,当用户点击正确的球时,我还希望第二个球随机移动。 这是我设置球的随机位置的代码:

let currentBall = SKShapeNode(circleOfRadius: CGFloat(size))
let shape = SKShapeNode()

  currentBall.fillColor = pickColor()

 //Rectangle
shape.path = UIBezierPath(roundedRect: CGRect(x: 64, y: 64, width: 160,height: 160), cornerRadius: 50).cgPath

    shape.fillColor = pickColor()

    self.addChild(shape)

 func randomBallPosition() -> CGPoint {
        let xPosition = view!.scene!.frame.midX - viewMidX + CGFloat(arc4random_uniform(UInt32(viewMidX*2)))
        let yPosition = view!.scene!.frame.midY - viewMidY + CGFloat(arc4random_uniform(UInt32(viewMidY*2)))


        return CGPoint(x: xPosition, y: yPosition)

    }


   func handleTap() {
          currentBall.position = randomBallPosition()
         shape.position = randomBallPosition()

    }

【问题讨论】:

  • 你有什么问题?

标签: ios swift sprite-kit


【解决方案1】:

问题在于您设置的位置与您用于第一个球的位置完全相同。据我了解,两个球都应该出现在随机的独立位置。您应该创建一个函数来返回一个新位置并为每个球调用它:

class MyScene: SKScene {
    var currentBall: SKShapeNode!
    var shape: SKShapeNode!

    override func didMove(to view: SKView) {
        super.didMove(to: view)

        let currentBall = SKShapeNode(circleOfRadius: CGFloat(size))
        currentBall.fillColor = pickColor()

        let shape = SKShapeNode()
        shape.path = UIBezierPath(roundedRect: CGRect(x: 64, y: 64, width: 160,height: 160), cornerRadius: 50).cgPath
        shape.fillColor = pickColor()
        self.addChild(shape)
    }

    func handleTap() {
        //your code here, except that you don't create new nodes, just modify existing ones
        //at some point you will change balls' positions like this:
        currentBall.position = randomBallPosition()
        secondBall.position = randomBallPosition()
    }

    func randomBallPosition() -> CGPoint {
        let xPosition = CGFloat(arc4random_uniform(UInt32((view?.bounds.maxX)! + 1)))
        let yPosition = CGFloat(arc4random_uniform(UInt32((view?.bounds.maxY)! + 1)))
        return CGPoint(x: xPosition, y: yPosition)
    }
}

希望对你有帮助

【讨论】:

  • 谢谢。这样可行。但是也有这个小问题,。应用该功能时,现在当用户点击球时,它只会一遍又一遍地复制第二个球。
  • 你不应该每次都创建一个新的shape。在场景变量中创建一次,然后只需更新它的位置并在需要时隐藏/取消隐藏。
  • 嘿,Alex,我尝试了与您编写上面代码相​​同的方式,但没有按照我想要的方式工作。 currentBall 效果很好,但 secondBall 一次都没有。每次用户点击球时, secondBall 都会重复。我尽量不要每次都放一个新的形状。但是想不通。你知道有什么办法可以尝试吗?
  • 你能用你当前的代码更新你的问题吗?
  • 有什么想法吗? @alexburtnik
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
相关资源
最近更新 更多