0

我正在重新使用 DemoBots 中使用的方法进行接触检测。由于我的代码的工作方式和 DemoBots 的编写方式之间存在差异,我遇到了一个问题。在 DemoBots 中,组件 RenderComponent 有一个变量 ' node'

let node = EntityNode()

init(entity: GKEntity) {
    node.entity = entity
}

在我的代码中,我没有使用动画,所以我的 RenderComponent 等价物有点复杂。变量“节点”已被使用并绑定到物理体,所以我创建了一个新变量“ 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关联的实体,但是我得到另一个错误,它说后续代码正在寻找一个可选的。我已经尝试摆脱“如果”,但它只是将问题转移到下一个contactCallBack电话。

if let notifiableEntity = entityA as? ContactNotifiableType, otherEntity = entityB where aWantsCallback {
    contactCallback(notifiableEntity, otherEntity)
}

有什么想法可以解决这个问题以使contactCallBack电话正常工作吗?

4

2 回答 2

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 or 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 类型的属性节点,您必须像选项 1 一样首先将其转换为 EntityNode

于 2016-04-06T18:25:10.177 回答
-1

我最近遇到了类似的问题 - 确保您的 iOS 版本 >= 9 并且 OSX 至少 10.11

于 2016-02-23T03:26:39.337 回答