我正在重复使用DemoBots中用于接触检测的方法。我遇到了一个问题,因为我的代码工作方式和DemoBots的编写方式有所不同。
在DemoBots中,组件RenderComponent有一个变量“node
”
let node = EntityNode()
init(entity: GKEntity) {
node.entity = entity
}
在我的代码中,我没有使用动画,所以我的RenderComponent相当复杂一点。变量'node'已经被使用并绑定到physicsBody,所以我创建了一个新变量'entityNode
'
let node: SKSpriteNode
let entityNode = EntityNode()
init(entity: GKEntity, nodeTemplate: SKSpriteNode) {
node = SKSpriteNode(imageNamed: "animal")
entityNode.entity = entity
}
在handleContact:方法中,我尝试了两种解决方案来获取对实体的引用。 选项1:
let entityA = (contact.bodyA.node as? EntityNode)?.entity
let entityB = (contact.bodyB.node as? EntityNode)?.entity
对此运行print()检查会返回这两个实体的nil值。这是合乎逻辑的,因为我应该寻找名为“entityNode
”的属性来查找实体。当我改为
选项2:
let entityA = (contact.bodyA.entityNode as? EntityNode)?.entity
let entityB = (contact.bodyB.entityNode as? EntityNode)?.entity
我收到一个错误,即physicsBody没有成员“entityNode
”。我已经尝试了一些其他的东西,比如查找与contactBody相关联的实体,但是我得到另一个错误,说明后续代码正在寻找可选项。我已经尝试摆脱'if',但它只是将问题转移到下一个contactCallBack
电话。
if let notifiableEntity = entityA as? ContactNotifiableType, otherEntity = entityB where aWantsCallback {
contactCallback(notifiableEntity, otherEntity)
}
如何解决此问题以使contactCallBack
调用正常工作?
答案 0 :(得分:0)
如果冲突节点是具有EntityNode类型节点的实体组件,则选项1应该可以正常工作。 您创建一个EntityNode类
class EntityNode: SKSpriteNode {
weak var entity: GKEntity!
}
您的RenderComponent应该是这样的:
class RenderComponent: GKComponent{
let node: EntityNode
init(entity:GKEntity, ......) {
node = EntityNode(texture: texture, color: SKColor.whiteColor(), size: size)
node.physicsBody = SKPhysicsBody(rectangleOfSize: aCGSize, center: aCGPoint)
node.physicsBosy.categoryBitMask = PhysicsCat.Enemy
}
节点的初始化是使用EntityNode,但是你喜欢任何一个SKSpriteNode的初始化。
最后,在contactCallBack" didBeginContact或didEndContact"中,如果contact.body(A或B).categoryBitMask = = PhysicsCat.Enemy
,则您的option1将起作用类似的东西:
if (contact.bodyA.categoryBitMask == PhysicsCat.Enamy || contact.bodyB.categoryBitMask == PhysicsCat.Enamy) {
let entityA = (contact.bodyA.node as? EntityNode)?.entity
let entityB = (contact.bodyB.node as? EntityNode)?.entity
...
}
您的选项2将永远不会起作用,因为contact.bodyA和bodyB都具有类型为SKNode的属性节点,您必须首先将其强制转换为EntityNode,如选项1中所示
答案 1 :(得分:-1)
我最近遇到过类似问题 - 请确保您的iOS版本为> = 9且OSX至少为10.11