无法修改 didBeginContact 中的contact.bodyA

Posted

技术标签:

【中文标题】无法修改 didBeginContact 中的contact.bodyA【英文标题】:Can't modify contact.bodyA in didBeginContact 【发布时间】:2014-10-20 19:15:37 【问题描述】:

我是 SpriteKit 和 Swift 的新手。花了太多时间尝试将位置/速度更改应用于 didBeginContact 中的主体,只是在 Apple 文档中读取联系人是只读的。修改碰撞中涉及的物体的好方法是什么?

struct PhysicsCategory

    static let None: UInt32 = 0
    static let All: UInt32 = UInt32.max
    static let LeftWall: UInt32 = 0b1
    static let Food: UInt32 = 0b10


override func didMoveToView(view: SKView)

    for(var i = 0; i < 10; ++i)
    
        var temp = SKSpriteNode(color: UIColor(red: 0.0, green: 0.7, blue: 0.0, alpha: 1.0), size: CGSizeMake(size, size))
        temp.position.x = self.scene!.size.width/2.0
        temp.position.y = self.scene!.size.height/2.0
        temp.physicsBody = SKPhysicsBody(rectangleOfSize: temp.size)
        temp.physicsBody!.categoryBitMask = PhysicsCategory.Food
        temp.physicsBody!.contactTestBitMask = PhysicsCategory.LeftWall
        temp.physicsBody!.collisionBitMask = PhysicsCategory.None
        temp.physicsBody!.velocity.dx = self.randomBetweenNumbers(0.0, secondNum: 0.5) - 0.25
        temp.physicsBody!.velocity.dy = self.randomBetweenNumbers(0.0, secondNum: 0.5) - 0.25
        self.addChild(temp)
    


func didBeginContact(contact: SKPhysicsContact)

    if (contact.bodyA.categoryBitMask & PhysicsCategory.Food != 0) && (contact.bodyB.categoryBitMask & PhysicsCategory.LeftWall != 0)
    
        contact.bodyA!.velocity.dx = 0.0
        println("\(contact.bodyA.velocity.dx)") //isn't 0.0
    
 

【问题讨论】:

说明你想做什么? 本质上,我想修改参与碰撞的物理物体的速度。 我要否定速度,所以“食物”会从“墙上”反弹。 也许你可以试试 SKFieldNode : developer.apple.com/library/ios/documentation/SpriteKit/…: 如果你想让Food节点从墙上反弹,设置collisionBitMask而不是contactTestBitMask。墙壁和食物位掩码都需要适当设置。 【参考方案1】:

课外

    let firstObjectCategory:UInt32 = 0x1 << 0
    let secondObjectCategory:UInt32 = 0x1 << 1

    var marker:Int= 0

在你的 DidMoveToView 中

    node1.physicsBody?.categoryBitMask = firstObjectCategory
    node1.physicsBody?.contactTestBitMask = secondObjectCategory
    if marker=1
     
        node1.velocity.dx = 0.0
    else
        node1.velocity.dx = what you want
    

    node2.physicsBody?.categoryBitMask = secondObjectCategory
    node2.physicsBody?.contactTestBitMask = firstObjectCategory

测试两个实体之间的接触:

    func didBeginContact(contact: SKPhysicsContact!)
    
        var firstBody: SKPhysicsBody
        var secondBody: SKPhysicsBody


        if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
        
            firstBody = contact.bodyA
            secondBody = contact.bodyB

        
        else
        
            firstBody = contact.bodyB
            secondBody = contact.bodyA
        


        if ((firstBody.categoryBitMask & firstObjectCategory) != 0 && (secondBody.categoryBitMask & secondObjectCategory) != 0)
        
          marker=1
        
    

希望对你有帮助

【讨论】:

抱歉,我应该更具体一些。我已经设置了类别,将它们设置到我的节点。我成功地检测到碰撞。问题是我无法修改通过contact参数传递给didBeginContact()的物理体。 你的屏幕上只有一个节点吗? 如果你的屏幕上只有 2 个physicsBody,你只需要设置一个标记。在你的节点属性中写:ìf marker=1node.velocity.dx = 0 else node.velocity.dx = whatYouWant你的变量var marker:Int = 0需要是全局的(类外) 没有。现在,我正在测试 10 个“食物”块和一个“墙”块的碰撞。我想没有办法修改 didBeginContact() 中的物理体。看起来会出现很多全局变量黑客攻击,谢谢。 好的,你只需要编辑与墙壁接触的精灵吗?

以上是关于无法修改 didBeginContact 中的contact.bodyA的主要内容,如果未能解决你的问题,请参考以下文章

didBeginContact 委托方法未触发 ARKit 碰撞检测

如何在没有 SKTexture 的情况下更改 didBeginContact 中的 SKSpriteNode 大小和颜色?

在使用 Swift 的 SpriteKit 中的 didBeginContact(日志)中未检测到 contactTestBitMask

didBeginContact:(SKPhysicsContact *)联系人未调用

didBeginContact 未调用 swift3 Xcode8

同一个 SKPhysicsBody 多次调用 didBeginContact