Я использую класс суб здесь под названием Enemy
, наследуемый от SKShapeNode
, проблема здесь, когда я проверить столкновение между bullet
и enemy
и я хватаю противника health
это говорит found nil while unwrapping
.Зачем использовать подкласс SKShapenode?
вот мой код:
private func drawEnemy() {
let (color, edge) = randomColorandEdge()
let nextEnemyPosition = determineNextEnemyPosition(edge: Int(edge))
let enemyPosition = spawnAtRandomPosition(edge: nextEnemyPosition)
let enemyCircle = Enemy(scene: self, color: color, radius: globalRadius, position: enemyPosition)
let enemy = enemyCircle.drawEnemy()
world.addChild(enemy)
numberOfEnemies += 1
enemy.name = String(numberOfEnemies)
runToCenter(enemy: enemy)
}
func didBegin(_ contact: SKPhysicsContact) {
if (contact.bodyB.categoryBitMask == bodyType.bullet.rawValue) && (contact.bodyA.categoryBitMask == bodyType.enemy.rawValue) {
let hitter = contact.bodyB.node as? SKShapeNode
let enemy = contact.bodyA.node as? Enemy
hitter?.removeFromParent()
let health = enemy?.getHealth()
if health! > 0 {
enemy?.setHealth(amount: health! - 1)
}else {
enemy?.removeFromParent()
}
}
}
и вот мой Enemy
класс:
class Enemy: SKShapeNode {
private var health: Int = 5
private var color: SKColor!
private var radius: CGFloat!
private var s: SKScene!
private var pos: CGPoint!
private var enemy: SKShapeNode!
init(scene: SKScene, color: SKColor, radius: CGFloat, position: CGPoint) {
self.color = color
self.radius = radius
self.health = 5
self.s = scene
self.pos = position
super.init()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setHealth(amount: Int) {
self.health = amount
}
func getHealth() -> Int {
return self.health
}
func drawEnemy() -> SKShapeNode {
enemy = SKShapeNode(circleOfRadius: radius)
enemy.fillColor = color
enemy.glowWidth = 0.5
enemy.strokeColor = color
enemy.physicsBody = SKPhysicsBody(circleOfRadius: radius)
enemy.physicsBody?.affectedByGravity = false
enemy.physicsBody?.isDynamic = true
enemy.physicsBody?.collisionBitMask = GameScene.bodyType.player.rawValue
enemy.physicsBody?.categoryBitMask = GameScene.bodyType.enemy.rawValue
enemy.physicsBody?.contactTestBitMask = GameScene.bodyType.player.rawValue
enemy.physicsBody?.usesPreciseCollisionDetection = true
enemy.position = pos
return enemy
}
}
ошибка возникает, когда я проверяю, если health
терке чем 0
или не в didBegin
функции
Вы не подклассифицируете правильно, ваш враг имеет тип SKShapeNode, а не типа Enemy – Knight0fDragon
'enemy = SKShapeNode (circleOfRadius: radius)' <----- см. – Knight0fDragon
да, но если я сделаю его врагом, как я делаю радиус?] –