【问题标题】:How to change the fillColor of a SKShapeNode within the didBegin contact function?如何在 didBegin 联系函数中更改 SKShapeNode 的 fillColor?
【发布时间】:2020-05-02 22:02:49
【问题描述】:

我的目标是在 SKShapeNode 与另一个节点发生碰撞时立即更改该节点的填充颜色。我确实知道如何在碰撞点编辑物理体,但我无法弄清楚如何更改节点的填充或描边颜色等属性。

SKShapeNode:

    func addBrick() -> SKShapeNode {

    let brick = SKShapeNode(rect: CGRect(x: -100, y: -20, width: 200, height: 40), cornerRadius: 20)
    brick.fillColor = .blue
    brick.strokeColor = .blue
    brick.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 200, height: 40))
    brick.position = CGPoint(x: 0, y: -50)
    brick.zPosition = 2

    brick.physicsBody?.categoryBitMask = BrickCategory
    brick.physicsBody?.collisionBitMask = PlayerCategory
    brick.physicsBody?.contactTestBitMask = PlayerCategory

    return brick
}

然后我测试玩家和积木的接触:

    func didBegin(_ contact: SKPhysicsContact) {
    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

    switch contactMask {
    case PlayerCategory | BrickCategory:
        print("")



    default:
        print("Unknown collision")
    }
}

我知道我可以通过使用来改变物理体本身

contact.bodyB.node?.//make changes here

,但我不知道如何将 bodyB 的 fillColor 例如更改为红色。

感谢您的帮助!

【问题讨论】:

    标签: swift xcode sprite-kit skshapenode skphysicscontact


    【解决方案1】:

    如果你有一个 SKNode node 并且你知道应该是一个 SKShapeNode,那么你可以像这样转换它:

    if let shapeNode = node as? SKShapeNode {
        shapeNode.fillColor = .red
    }
    

    【讨论】:

    • 对于node,我收到错误消息:“静态成员 'node' 不能用于 'GameScene' 插入 SKNode 类型的实例”。所以我把它改成了contact.bodyB.node,但知道 if 语句根本没有被调用。
    • node 只是一个例子。碰撞中的形状节点可能来自bodyAbodyB。您必须检查类别位掩码或名称或其他任何东西来确定哪个节点是正确的。如果您尝试引用 as? 形状节点的节点不是该类型,则强制转换不会成功并且不会执行 if
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 2016-03-19
    • 2012-08-13
    • 1970-01-01
    • 2019-03-12
    相关资源
    最近更新 更多