首页 > 解决方案 > 物理身体不只显示一个精灵?

问题描述

我遇到的问题是当我初始化我的精灵时,我有另一个精灵以相同的方式定义,并且那个精灵显示它有一个物理主体,因为我看到了绿色轮廓,但是下面的这个精灵上面没有绿色轮廓,我认为当我创建时存在问题,SKPhysicsBody或者可能是因为我在随机位置创建了 13 个相同精灵的副本,如第二段代码所示。

    @objc func CreateNewAsteroid() {
     var asteroid : SKSpriteNode?

     let moveAsteroidDown = SKAction.repeatForever(SKAction.moveBy(x: 0, y: -1, duration: 0.01))
     let rotateAsteroid = SKAction.repeatForever(SKAction.rotate(byAngle: 25, duration: 5))

     let asteroidXpos = randomNum(high:  self.frame.size.width/2, low: -1 * self.frame.size.width/2)
     let asteroidYpos = randomNum(high:  2.5*self.frame.size.height, low: self.frame.size.height/2)
     let asteroidOrigin : CGPoint = CGPoint(x: asteroidXpos, y: asteroidYpos)

     asteroid = SKSpriteNode(imageNamed: possibleAsteroidImage[Int(arc4random_uniform(4))])
     asteroid?.scale(to: CGSize(width: player.size.height, height: player.size.height))
     asteroid?.position = asteroidOrigin
     asteroid?.run(moveAsteroidDown)
     asteroid?.run(rotateAsteroid)
     let asteroidRadius : CGFloat = (asteroid?.size.width)!/2

     asteroid?.physicsBody? = SKPhysicsBody(rectangleOf: (asteroid?.size)!)
     asteroid?.physicsBody?.categoryBitMask = asteroidCategory
     asteroid?.physicsBody?.affectedByGravity = false
     asteroid?.physicsBody?.isDynamic = false
     asteroid?.physicsBody?.allowsRotation = false

     asteroid?.physicsBody?.categoryBitMask = asteroidCategory
     asteroid?.physicsBody?.collisionBitMask = 0
     asteroid?.physicsBody?.contactTestBitMask = shipCategory

     asteroidArray.append(asteroid!)
     self.addChild(asteroid!)
}

我创建了 13 个这样的精灵

        for _ in 0...13 {
        CreateNewAsteroid()
    }

标签: swiftxcodesprite-kitskphysicsbody

解决方案


不要将 SKSpriteNode 小行星设为可选,而是将其设为非可选,这样它就不会通过删除?in var asteroid : SKSpriteNode?

所以你想放var asteroid : SKSpriteNode

进行此更改后,会出现一些错误,告诉您删除一些!'s 和?'s(当然要确保删除这些)。

然后转到您的文件并在下面GameViewController.swift添加行view.showsPhysics = trueview.showsNodeCount = true

完成后,您应该会在精灵周围看到一个绿色轮廓。


推荐阅读