Физическое тело не показывается только для одного спрайта? - PullRequest
0 голосов
/ 27 июня 2018

У меня проблема в том, что когда я инициализирую свой спрайт, у меня другой спрайт, определенный таким же образом, и этот спрайт показывает, что у него физическое тело, потому что я вижу зеленый контур на нем, но у этого спрайта ниже нет зеленого контура на это, я думаю, что есть проблема, когда я создаю 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()
    }

1 Ответ

0 голосов
/ 28 июня 2018

Вместо того, чтобы делать астероид SKSpriteNode необязательным, сделайте его необязательным, чтобы он не стал нулевым значением, удалив ? в var asteroid : SKSpriteNode?

Итак, вы хотите поставить var asteroid : SKSpriteNode

После внесения этого изменения появятся некоторые ошибки, указывающие на удаление некоторых ! и ? (конечно, обязательно удалите их).

затем перейдите к файлу GameViewController.swift и добавьте строку view.showsPhysics = true в view.showsNodeCount = true

Когда вы закончите, вы должны увидеть зеленый контур вокруг спрайта.

...