【发布时间】:2014-11-18 04:29:23
【问题描述】:
我想出了如何使用 PhysicsBody 进行碰撞检测,并且此方法有效:
// Method call:
projectileDidCollideWithMonster(firstBody.node as SKSpriteNode, monster: secondBody.node as SKSpriteNode)
// Method:
func projectileDidCollideWithMonster(projectile:SKSpriteNode, monster:SKSpriteNode!) {
projectile.removeFromParent()
monster.removeFromParent()
}
方法调用被放置在用作SKPhysicsContact 接收器的方法中。它获取一对传递给它的SKPhysicsBody 对象,检查它们是否是正确的类型,然后调用另一个方法来删除这些对象。
但是,我想改变怪物的生命值。
我创建了一个名为 Monster 的单独类,其代码如下:
import Foundation
import SpriteKit
class Monster : SKSpriteNode {
var hp : Int
override init () {
let color = UIColor()
let texture = SKTexture(imageNamed: "monster")
let size = texture.size()
hp = 5
super.init (texture: texture, color: color, size: size)
self.physicsBody = SKPhysicsBody(rectangleOfSize: size)
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func subtract () {
hp--
println(hp)
}
}
所以我想运行这个为 Monster 定制的代码:
projectileDidCollideWithMonster(firstBody.node as SKSpriteNode, monster: secondBody.node as Monster)
func projectileDidCollideWithMonster(projectile:SKSpriteNode, monster:Monster!) {
projectile.removeFromParent()
monster.subtract();
}
在 Java 中,我可以直接转换它,例如 (Monster)secondBody.node。我知道 secondBody 是一个怪物。 Monster 持有对它的 PhysicsBody 的引用,并继承SKSpriteNode。
我试过这个:let theMonster = secondBody.node as Monster,但这也没有用。
精灵套件物理引擎似乎返回 PhysicsBody 对象,我可以在其上调用内置方法,如 removeFromParent()。但我想调用我自己的 subtract() 方法,它是 Monster 的一部分!
如何在通过碰撞检测收到的对象上触发自定义方法?
【问题讨论】:
-
我认为你假设碰撞体的顺序是固定的,但是 mosnter 可以随时是第一个或第二个bidy
-
代码较多,为了简洁起见,我省略了。方法调用所在的完整方法在调用该方法之前会检查以确保哪个是哪种类型,并在必要时将它们反转。
-
这段代码看起来不错(至少快速阅读)。你到底是怎么失败的,在哪里失败?
-
它编译并运行。在运行时,当它检测到冲突时,它会崩溃,并突出显示方法调用行。堆栈说“swift_dynamicCastClassUnconditional”
标签: swift sprite-kit