GKEntity没有被识别出来

时间:2016-01-18 13:46:55

标签: swift2 skphysicsbody gameplay-kit

我正在重复使用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调用正常工作?

2 个答案:

答案 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

相关问题