Sprite Kit 从未检测到我的碰撞

Posted

技术标签:

【中文标题】Sprite Kit 从未检测到我的碰撞【英文标题】:Sprite Kit never detect my collision 【发布时间】:2016-03-31 17:44:17 【问题描述】:

当玩家身体遇到怪物身体时,函数func didBeginContact(contact: SKPhysicsContact) 永远不会被调用。

我的班级实现SKPhysicsContactDelegate

class GameScene: SKScene, SKPhysicsContactDelegate

属性collisionBitMask我评论了它,因为我读到如果我们不放它,节点可能会与所有节点发生冲突

我这样添加我的播放器:

bear.position = CGPoint(x:self.frame.width/20, y:self.frame.height/5)
bear.size = CGSize(width:  self.frame.width/7, height:  self.frame.height/5)
bear.physicsBody = SKPhysicsBody(rectangleOfSize: bear.frame.size)
bear.physicsBody?.dynamic = false;
bear.physicsBody?.categoryBitMask = PhysicsCategory.Player
bear.physicsBody?.contactTestBitMask = PhysicsCategory.Monster
//bear.physicsBody?.collisionBitMask = PhysicsCategory.Monster

我这样添加怪物:

           let thePosition = CGPoint(x: positionX, y: (self.frame.height/7.4)*positionY)

        let monster =  SKSpriteNode(imageNamed: pattern as String)
        monster.size = CGSize(width:  self.frame.width/16, height:  self.frame.height/11)
        monster.name = name
        monster.position = thePosition


         monster.physicsBody = SKPhysicsBody(rectangleOfSize: monster.frame.size)



        monster.physicsBody?.dynamic = false
        monster.physicsBody?.categoryBitMask = PhysicsCategory.Monster // 3
        monster.physicsBody?.affectedByGravity = false
        monster.physicsBody?.contactTestBitMask = PhysicsCategory.Player // 4
        //platformNode.physicsBody?.collisionBitMask = PhysicsCategory.Player // 5


        addChild(monster)

我的物理类别

struct PhysicsCategory 
  static let None      : UInt32 = 0
  static let All       : UInt32 = UInt32.max
  static let Player: UInt32 = 0b1      // 1
  static let Monster   : UInt32 = 0b10       // 2
  static let Projectile: UInt32 = 0b100      // 3
  static let Plateforme: UInt32 = 0b1000      // 4

我有多个纹理,例如当玩家走路时我称之为:

    func walkingBear() 
    bear.runAction(    SKAction.repeatActionForever(SKAction.animateWithTextures(bearCoursFrames, timePerFrame: 0.1, resize: false, restore: true)), withKey:"cours")
  

我像这样初始化bearCoursFrames

  var walkFrames = [SKTexture]()
    var numImages : Int = bearAnimatedAtlas.textureNames.count
    for var i=1; i<=numImages/2; i++ 
        let bearTextureName = "cours\(i)"
        walkFrames.append(bearAnimatedAtlas.textureNamed(bearTextureName))
    

    bearCoursFrames = walkFrames

请问我的错误在哪里,我在其他帖子中找不到解决方案 任何帮助将不胜感激

---------------------------------编辑------------- ----------------- 解决方案:我只需添加 self.physicsWorld.contactDelegate = self 即可。

【问题讨论】:

【参考方案1】:

答案很简单。有一条规则规定,必须将至少一个实体定义为动态实体才能注册联系人。

将玩家或其他身体更改为动态并且将检测到接触。

另外,如果您还没有,请启用物理视觉表示...这可能会有所帮助,因为有时由于实际物体没有相互交叉而无法检测到接触,例如。当节点的锚点更改时,纹理和主体会错位(这是可以修复的,使用 SKPhysicsBody 类的适当初始化程序,但这是一个非常常见的错误)。

【讨论】:

我只是尝试一下,dynamic = true,但是我有同样的问题,当我把这个 bear.physicsBody?.collisionBitMask 当玩家遇到怪物身体时,他改变方向,永远不会遇到他,在两个案例 didBeginContact 从未调用过:( 我启用了启用物理视觉表示我可以看到两个身体相遇 好的,等我到电脑前仔细看看你的例子。 当我在没有collisionBitMask的两个对象中使用dynamic = true时,当我在两个对象中使用dynamic = true并在两个对象中使用collisionBitMask时,两个身体相遇时会改变方向,玩家靠近时怪物他推他,从来没见过他,奇怪!!! 错误是我忘记了 self.physicsWorld.contactDelegate = self,感谢您的帮助【参考方案2】:

我只是添加

       self.physicsWorld.contactDelegate = self 

现在可以使用了。

【讨论】:

哈哈,是的,我以为你已经这样做了...仅仅使 SKScene 符合 SKPhysicsContactDelegate 协议是不够的... 我完全忘记了,我浪费了几个小时来寻找解决方案,哈哈,但你的回答对我有帮助,因为我不知道动态我必须启用至少一个,并且还显示 phisical body :)

以上是关于Sprite Kit 从未检测到我的碰撞的主要内容,如果未能解决你的问题,请参考以下文章

Sprite Kit中的碰撞检测未检测到碰撞

Sprite Kit 碰撞检测和物理

Sprite kit:删除特定节点而不是所有节点

Sprite-Kit 为单个接触注册多个碰撞

Sprite Kit 碰撞发生在精灵之外的几个点

Sprite Kit,删除 Sprite 以进行碰撞