Swift2 未识别的实体

Swift2 未识别的实体,swift2,skphysicsbody,gameplay-kit,Swift2,Skphysicsbody,Gameplay Kit,我正在使用DemoBots中用于接触检测的方法。我遇到了一个问题,因为我的代码的工作方式和DemoBots的编写方式不同。 在Demobot中,组件RenderComponent有一个变量“节点”” let node = EntityNode() init(entity: GKEntity) { node.entity = entity } let node: SKSpriteNode let entityNode = EntityNode() init(entity: GKEnt

我正在使用DemoBots中用于接触检测的方法。我遇到了一个问题,因为我的代码的工作方式和DemoBots的编写方式不同。 在Demobot中,组件RenderComponent有一个变量“
节点”

let node = EntityNode()

init(entity: GKEntity) {
    node.entity = entity
}
let node: SKSpriteNode
let entityNode = EntityNode()

init(entity: GKEntity, nodeTemplate: SKSpriteNode) {
    node = SKSpriteNode(imageNamed: "animal")
    entityNode.entity = entity
}
在我的代码中,我没有使用动画,所以我的RenderComponent的等价物要复杂一些。变量“node”已经被使用并绑定到physicsBody,因此我创建了一个新变量“
entityNode

let node = EntityNode()

init(entity: GKEntity) {
    node.entity = entity
}
let node: SKSpriteNode
let entityNode = EntityNode()

init(entity: GKEntity, nodeTemplate: SKSpriteNode) {
    node = SKSpriteNode(imageNamed: "animal")
    entityNode.entity = entity
}
在handleContact:method中,我尝试了两种解决方案来获取对实体的引用。 备选案文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)
}

我最近遇到了类似的问题,请确保您的iOS版本>=9,并且OSX至少为10.11。如果冲突节点属于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
}
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
    ...
}
节点的初始化使用EntityNode,但使用您喜欢的SKSpriteNode的任何init

最后,在contactCallBack“didBeginContact或didEndContact”中,如果contact.body(A或B).categoryBitMask=to PhysicsCat.敌军,则选项1将起作用

大概是这样的:

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
}
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所示