- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在这里使用了一个名为 Enemy
的子类,它继承自 SKShapeNode
,这里的问题是当我检查 bullet
和 enemy
我捕获了敌人的 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/
我的应用程序中有一个轮子。我需要检索它停止的切片/楔形的值。 这段代码: print(wheelScene.atPoint(CGPoint(x: wheelScene.frame.midX,
我有一个 SKShapeNode,如果满足特定条件,它需要将它的每个角都变圆。阅读下面链接提供的答案,这似乎很容易,因为我会简单地使用 |= 来圆角需要舍入的加角(4x if 语句)。 How to
我正在尝试用图像/图案填充 SKShapeNode,但仍然不成功。 你能帮我解决这个问题或者给我一个替代方案吗? 我想创建一个可碰撞的自定义形状(来自任何 SpriteKit 类型),并填充图案图像。
我正在使用 SKShapeNodes 绘制一条线。这条线不断地“生长”,或者说总是向上移动。当用户点击屏幕时,线条应以 45 度角向右或向左改变方向。它会这样做,但是由于某种原因,当它改变方向时,线中
在我的应用程序中,我有两个凹形SKShapeNode,即nodeA和nodeB,nodeA在屏幕上固定,而nodeB可以由用户手指在屏幕上拖动。 NodeA 需要能够检测 NodeB 是否与它重叠。首
我正在尝试为要遵循的节点创建 CGPath,但是当我尝试使用 608_hd_best_practices_for_building_spritekit_games 中的操作和常量幻灯片中定义的 SKS
我有一个 SKShapeNode,它有多个 SKSpriteNode 作为其子节点,这些子节点位于其中心周围的不同位置。我还旋转了 SKShapeNode,这实际上旋转了它的所有子节点。但是,当我循环
我正在开发一个小游戏,我必须匹配一些颜色。我只使用 SKShapeNodes;但我似乎无法让这段代码工作。我只得到“不同颜色”的打印结果。 func didBegin(_ contact: S
我无法让 SKShapeNode 的子类接受初始化程序。为了解决这个问题,我尝试按照此处发布的示例 Adding Convenience Initializers in Swift Subclass
我正在尝试将渐变纹理应用于从路径创建的 SKShapeNode,以便线条从纯色变为透明。这适用于 SKSpriteNode,但我无法让它在 SKShapeNode 上工作。有谁知道这个问题的解决方案?
我想在另一个正方形里画一个正方形;但我无法以正确的方式定位第二个。根据第一个平方坐标进行定位可以做什么? var tileBackground = SKShapeNode(rectOfSize
我用来生成行的代码是这样的: func populate(num: Int) { for var i = 0; i < num; i++ { let lines = Line
如何对没有实例方法初始化器的 SKShapeNode 进行子类化?我能想到的唯一方法是: + (id)withColor:(UIColor *)aColor radius:(CGFloat)aRadi
我正在开发一个应用程序,我正在根据用户手指的触摸来绘制线条。一旦收到触摸结束事件,该行将转换为最后一条路径。当收到新的触摸开始事件时,将绘制一条名为“当前路径”节点的新线。我为具有相反接触位掩码的两条
我打开了 spritekit 应用程序示例并添加了这段代码 override func didMoveToView(view: SKView) { /* Setup your scene he
最近我一直在创建一个游戏,我在屏幕上放了圆圈。但是,我注意到这些圆形不是圆形,而是椭圆形。 y 轴被拉伸(stretch),x 轴被收缩。为了弄清楚这个问题,我现在正在尝试用一个矩形进行调试。我使矩形
我可以在一个 SkShapenode 中有一条具有多种线宽和颜色的路径吗?例如 我可以在一个节点中添加三个具有不同填充和描边大小边框的不同颜色的圆圈吗? 最佳答案 skshapenodes 真的不应该
我创建了一个名为“Character”的 SKShapeNode 子类,我尝试使用 rectOfSize 对其进行初始化,但是由于必须使用指定的初始化程序,我不能这样做。 我一直在阅读有关此机制的信息
在我的简单游戏中,我需要在下一步发生之前移除所有 SKShapeNodes。这是我的代码: for child in self.children(){ if(child==SKShapeNod
有没有办法围绕某个任意点旋转 SKShapeNode,特别是矩形? 我在 gameScene 类的开头声明了我的 SKShapeNode var bladeTouch = SKShapeNode()
我是一名优秀的程序员,十分优秀!