Физическое тело SKSpriteNode, созданное из текстуры, приводит к нулевому значению - PullRequest
2 голосов
/ 06 февраля 2020

Я сейчас работаю над маленькой iOS игрой. В текущей итерации 20 целей появляются и перемещаются по стилю космических захватчиков, и вы управляете небольшим кораблем, чтобы стрелять и уничтожать их. Код для моих целей, маркеры корабля игрока и простая функция обнаружения столкновений, которую я написал в промежуточный период, таковы:

class Red_Target: SKSpriteNode{

    var game_scene: GameScene!
    private var ship_texture: SKTexture!

    convenience init(scale: CGFloat, game_world: GameScene){
        self.init(texture: SKTexture(imageNamed: "Proto Target"))
        self.ship_texture = SKTexture(imageNamed: "Proto Target")
        self.setScale(scale)
        game_scene = game_world
        game_scene.addChild(self)
        self.position = CGPoint(x: game_scene.view!.bounds.width/10, y: 9 * game_scene.view!.bounds.height/10)
        //self.physicsBody = SKPhysicsBody(texture: ship_texture, size: self.size)
        self.physicsBody = SKPhysicsBody(circleOfRadius: 13)
        self.physicsBody!.affectedByGravity = false
        self.physicsBody!.collisionBitMask = 0x0
        self.physicsBody!.categoryBitMask = CollisionType.Enemy.rawValue
        self.physicsBody!.contactTestBitMask = CollisionType.Player_Bullet.rawValue
    }

    func move() {
        self.run(space_invaders(scene: game_scene))
    }

}

class PC_Bullet: SKSpriteNode{

    convenience init(scale: CGFloat){
        self.init(imageNamed: "Goodbullet")
        self.setScale(scale)
        self.physicsBody = SKPhysicsBody(circleOfRadius: 3)
        self.physicsBody!.affectedByGravity = false
        self.physicsBody!.categoryBitMask = CollisionType.Player_Bullet.rawValue
        self.physicsBody!.collisionBitMask = 0x0
        self.physicsBody!.contactTestBitMask = CollisionType.Enemy.rawValue
    }


}

    func didBegin(_ contact: SKPhysicsContact) {
        contact.bodyA.node!.removeFromParent()
        contact.bodyB.node!.removeFromParent()
    }

}

Этот код в своей текущей итерации работает просто отлично. Однако, если строка, определяющая физическое тело цели как ее текстуру, не закомментирована, а линия, определяющая физическое тело как circleOfRadius, удалена, игра будет последовательно обрабатывать sh после уничтожения 5-й цели, утверждая, что didBegin разворачивает нулевое значение. Почему это происходит только с физическими телами с текстурами? Можно ли как-нибудь изменить код, чтобы это работало? Мне бы хотелось иметь возможность позже использовать физическое тело из функции текстуры при работе с более неправильными формами.

1 Ответ

1 голос
/ 07 февраля 2020

Вы тянете классическую ошибку c nooby. Вы удаляете свои тела слишком рано. Если вы просмотрите Stackoverflow, вы найдете множество способов ее решения.

Основная идея c заключается в том, чтобы не удалять ваши спрайты до конца фазы физики, поскольку ваш 1-й спрайт может иметь несколько контактных точек для ручка. Так что придумайте способ помечать спрайты, которые необходимо удалить, и удалять их во время функции didSimulatePhysics.

...