【问题标题】:didBeginContact not being invokeddidBeginContact 未被调用
【发布时间】:2014-07-29 01:45:24
【问题描述】:

我有 2 个 SKSpriteNodes 需要检测其联系。我尝试了各种方法并查找了很多东西,但似乎无法得到答案。下面是我的代码。 controlCircle 是一个类级别的变量,因为它需要在其他方法中使用。对象生成良好。

class GameScene: SKScene, SKPhysicsContactDelegate {

var controlCircle = SKSpriteNode()
var mainCategory : UInt32 = 1 << 0
var dropCategory: UInt32 = 1 << 1



override func didMoveToView(view: SKView) {

    self.physicsWorld.contactDelegate = self
    self.physicsWorld.gravity = CGVectorMake(0,0)

    //CREATING FIRST OBJECT AND ADDING PHYSICS BODY
    var mainRadius = 20.0;
    var controlCircle = SKSpriteNode(color: UIColor.clearColor(), size:CGSizeMake(mainRadius    * 2, mainRadius * 2))

    var circleBody = SKPhysicsBody(circleOfRadius: mainRadius)
    circleBody.dynamic = false
    circleBody.usesPreciseCollisionDetection = true

    controlCircle.physicsBody = circleBody

    var bodyPath = CGPathCreateWithEllipseInRect(CGRectMake((controlCircle.size.width/2),   controlCircle.size.height/2, controlCircle.size.width, controlCircle.size.width),
        nil)

    var circleShape = SKShapeNode()
    circleShape.fillColor = UIColor.brownColor()
    circleShape.lineWidth = 0
    circleShape.path = bodyPath
    controlCircle.addChild(circleShape)
    controlCircle.position = CGPointMake(self.frame.width/2, self.frame.height/2)

    self.addChild(controlCircle)
    controlCircle.physicsBody.categoryBitMask = mainCategory
    controlCircle.physicsBody.contactTestBitMask = dropCategory


    //CREATING SECOND OBJECT AND ADDING PHYSICS BODY 
    var radius = 10.0;
    var drop = SKSpriteNode(color: UIColor.clearColor(), size:CGSizeMake(radius * 2, radius * 2))

    var dropBody = SKPhysicsBody(circleOfRadius: radius)
    dropBody.dynamic = false
    dropBody.usesPreciseCollisionDetection = true

    drop.physicsBody = dropBody

    var dropPath = CGPathCreateWithEllipseInRect(CGRectMake((drop.size.width/2), drop.size.height/2, drop.size.width, drop.size.width),
        nil)

    var dropShape = SKShapeNode()
    dropShape.fillColor = UIColor.blackColor()
    dropShape.lineWidth = 0

    drop.name = "dropMask"
    dropShape.path = dropPath


    drop.addChild(dropShape)
    drop.position = CGPointMake(CGFloat(xValue), self.frame.height-5)

    self.addChild(drop)
    drop.physicsBody.categoryBitMask = dropCategory
    drop.physicsBody.contactTestBitMask = mainCategory
}

    func didBeginContact(contact: SKPhysicsContact) -> Void{
    NSLog("Hello")

    }
}

【问题讨论】:

  • 需要设置drop节点的categoryBitMask为dropCategory
  • 看起来我错过了将其粘贴到此处。我确实为 dropNode 添加了 catgorybitMask
  • 如果两个body的动态属性都是假的,并且它们的位置是分开的,你为什么期望调用didBeginContact?
  • 我正在实现 touchesMoved 方法来拖动 controlCircle。什么是动态属性?
  • 谢谢。将动态值设置为 true 确实有效

标签: ios swift sprite-kit skspritenode skphysicsbody


【解决方案1】:

大家好消息,

SKPhysicsBody 文档:

dynamic 属性控制基于体积的物体是否受到重力、摩擦、与其他物体的碰撞以及您直接应用于物体的力或冲量的影响。

所以这里有一个想法是在不拖动时完成静止物体,但接收碰撞事件。在 SKSpriteNode 上的 touchesBegan 上,设置它的 physicsBody.dynamic = true,在 touchUp 上 physicsBody.dynamic = false

或者,您可以从系统中移除重力,并让所有节点都带有physicsBody.dynamic = true

【讨论】:

  • 感谢您的信息。我不需要检测碰撞。只有联系方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多