gpt4 book ai didi

swift - 为什么不能使用 SKShapenode 的子类?

转载 作者:搜寻专家 更新时间:2023-11-01 06:17:13 24 4
gpt4 key购买 nike

我在这里使用了一个名为 Enemy 的子类,它继承自 SKShapeNode,这里的问题是当我检查 bulletenemy 我捕获了敌人的 health 它说 found nil while unwrapping

这是我的代码:

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
}

}

当我在 didBegin 函数中检查 health 是否大于 0 时出现错误

最佳答案

您没有正确地子类化,您将 Enemy 对象用作工厂和实例,将两者分开。

工厂:

public class EnemyFactory
{
public func createEnemy(color: SKColor, radius: CGFloat, position: CGPoint) -> Enemy{
let enemy = Enemy(circleOfRadius: radius)
enemy.setup(color:color, radius: radius, position: position)
return enemy
}
}

实例类:

public class Enemy: SKShapeNode {
static let Factory = EnemyFactory()
public var health: Int = 5

func setup (color: SKColor, radius: CGFloat, position: CGPoint) {
self.position = position
fillColor = color
glowWidth = 0.5
self.health = 5
strokeColor = color
let physicsBody = SKPhysicsBody(circleOfRadius: radius)
physicsBody.affectedByGravity = false
physicsBody.isDynamic = true
physicsBody.collisionBitMask = GameScene.bodyType.player.rawValue
physicsBody.categoryBitMask = GameScene.bodyType.enemy.rawValue
physicsBody.contactTestBitMask = GameScene.bodyType.player.rawValue
physicsBody.usesPreciseCollisionDetection = true
self.physicsBody = physicsBody
}
override init(){
super.init()

}

required public init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

我采取了一些自由:我删除了局部冗余变量,如颜色和场景,你可以直接从对象中获取这些变量,不需要另一个变量来保存它们。您也不需要 getter 和 setter,Swift 已经为您做好了。

关于swift - 为什么不能使用 SKShapenode 的子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41879264/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com