当前位置: 首页 > 知识库问答 >
问题:

无法检测到spritekit物理碰撞

钮誉
2023-03-14

我有4个物理体,它们都很好地检测到碰撞。然而,有两个物理体不会检测到它们何时相互碰撞。不过,它们会检测到它们何时与其他物理体碰撞。我有所有这些物理体的联系人测试位掩码,所以我不明白为什么会有问题。以下是一些代码:这是我设置物理体的地方:

    struct PhysicsCategory{
    static let None     : UInt32 = 0
    static let All      : UInt32 = UInt32.max
    static let player   : UInt32 = 0b1
    static let bounce   : UInt32 = 0b10
    static let blueball : UInt32 = 0b100
    static let redball  : UInt32 = 0b1000
    static let coin     : UInt32 = 0b10000
}

以下是我用于设置玩家物理体(其中一个问题物理体)的代码:

     player.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: player.size.width-40, height: player.size.height-40))
    player.physicsBody?.isDynamic = true
    player.physicsBody?.categoryBitMask = PhysicsCategory.player
    player.physicsBody?.contactTestBitMask = PhysicsCategory.blueball
    player.physicsBody?.contactTestBitMask = PhysicsCategory.redball
    player.physicsBody?.collisionBitMask = PhysicsCategory.None

以下是检测碰撞的函数:

  func didBegin(_ 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 & PhysicsCategory.player != 0) &&
        (secondBody.categoryBitMask & PhysicsCategory.redball != 0)) {
        RedballDidCollideWithPlayer(player: firstBody.node as! SKSpriteNode, redball:  secondBody.node as! SKSpriteNode)
    }
    if ((firstBody.categoryBitMask & PhysicsCategory.player != 0) &&
        (secondBody.categoryBitMask & PhysicsCategory.blueball != 0)) {
        BlueballDidCollideWithPlayer(player: firstBody.node as! SKSpriteNode, blueball:  secondBody.node as! SKSpriteNode)
    }
    if ((firstBody.categoryBitMask & PhysicsCategory.bounce != 0) &&
        (secondBody.categoryBitMask & PhysicsCategory.redball != 0)){
        RedballDidCollideWithBounce(bounce: firstBody.node as! SKSpriteNode, redball: secondBody.node as! SKSpriteNode)
    }
    if ((firstBody.categoryBitMask & PhysicsCategory.bounce != 0) &&
        (secondBody.categoryBitMask & PhysicsCategory.blueball != 0)) {
        BlueballDidCollideWithBounce(bounce: firstBody.node as! SKSpriteNode, blueball: secondBody.node as! SKSpriteNode)
    }
    if ((firstBody.categoryBitMask & PhysicsCategory.bounce != 0) &&
        (secondBody.categoryBitMask & PhysicsCategory.coin != 0)) {
        coinDidCollideWithplayer(player: firstBody.node as! SKSpriteNode, coin: secondBody.node as! SKSpriteNode)
    }
    if ((firstBody.categoryBitMask & PhysicsCategory.player != 0) &&
        (secondBody.categoryBitMask & PhysicsCategory.coin != 0)) {
        coinDidCollideWithplayer(player: firstBody.node as!        SKSpriteNode, coin: secondBody.node as! SKSpriteNode)
    }

}

下面是我用来设置蓝球的代码。这是另一个有问题的物理体:

    let blueball = SKSpriteNode(imageNamed: "blueball")
        blueball.position = enemyb.position
        blueball.physicsBody = SKPhysicsBody(circleOfRadius: blueball.size.width/2)
        blueball.physicsBody?.isDynamic = true
        blueball.physicsBody?.categoryBitMask = PhysicsCategory.blueball
        blueball.physicsBody?.contactTestBitMask = PhysicsCategory.player
        blueball.physicsBody?.contactTestBitMask = PhysicsCategory.bounce
        blueball.physicsBody?.collisionBitMask = PhysicsCategory.None
        blueball.physicsBody?.usesPreciseCollisionDetection = true
        addChild(blueball)
        let actionMove = SKAction.move(to: player.position, duration: 2)

这里的任何想法都会有所帮助。几天来,我一直试图找到问题,但没有运气。

共有1个答案

习华灿
2023-03-14

当设置多个类别时,您必须将这些值或在一起。你的代码

player.physicsBody?.contactTestBitMask = PhysicsCategory.blueball
player.physicsBody?.contactTestBitMask = PhysicsCategory.redball

只需设置类别两次,第二次覆盖第一次。将此更改为:

player.physicsBody?.contactTestBitMask = PhysicsCategory.blueball | PhysicsCategory.redball
 类似资料:
  • 问题内容: 你好。 我有多个碰撞问题。有一颗子弹击中了敌人(红色矩形)。然后,它+分数。有一个螺旋线(红色圆圈) 被推测为当敌人(红色矩形)触摸场景时触发场景结束。 在这种情况下,当敌人击中螺旋桨时,螺旋桨将起作用,场景结束,然后我们进入菜单屏幕。但是,当子弹击中敌人时,同样的事情也会发生,我也不知道为什么。 现在,这是我的代码: 现在,我知道那是一团糟,但是有人可以帮助我吗?我认为问题与body

  • 我想在我的玩家剑上创建一个碰撞体,如果他攻击,他会检测到,并通过动画事件关闭/打开一个名为(伤害点)的游戏对象,这是一个附加的脚本,可以减去敌人的生命值。但是在某个地方它不能正确检测到。我试图添加OnDrawGizmos函数来查看我的球体对撞机,但即使将其变大,它也无法检测到。 我的问题最奇怪的是,我对我的怪物箱子和我的幻想玩家使用相同的代码,但对箱子有效,但对玩家无效。 我创建了一个名为 Pla

  • 我正在制作我的第一个自由移动(不是瓷砖限制)2d游戏,想知道如何使用冲突检测。我有3种可能的方法在我的脑海中,但不确定什么是最有效的: > 地图上的每个物体都有一个比图像本身更小的纹理(例如,一棵树只有一个更小的纹理代表它的底部),不能碰撞。为此,我会使用第二个不可见的纹理来标记该区域。 每个对象都有一个用于碰撞的矩形或圆形区域。可能每个纹理都需要一个辅助文件,说明碰撞的大小(再次以树为例)。 我

  • 我目前正在开发一款2D无休止跑者,用Swift3编写,并使用Spritekit。 简短的问题: 有没有办法只检查我的角色的矩形物理体右侧的碰撞? 更多信息: 角色运行的平台由拼图块组成,用户在游戏进行时在此基础上进行构建。角色从左到右,相对于背景(从右到左)。 我希望角色在与右侧的棋子相撞时自动跳跃。然而,玩家放在他右边的任何棋子(与角色的Y值相同)都与他下面的棋子属于同一等级。 因此,只要游戏检

  • 嗨,伙计们, 我正在使用libgdx为android开发一个游戏。我完全陷入了探测两个物体碰撞的部分。我有一个我通过下面的函数创建的播放器 和我用玩家相同的功能创建的敌人,我只更改file_path和fixture_name。file_path指向我用box2d编辑器创建的. json文件(站点:http://www.aurelienribon.com/blog/projects/physics-

  • 问题内容: 我主要专注于图形方面,以创建一些2DGame。我看过/看过几本教程,但是没有一部教程那么令人满意。我已经有一个玩家(一个正方形)在屏幕上移动并与其他正方形碰撞。重力等。 如果在屏幕上看到的对象太多(30 * 20),则一切正常。但是,如果我将其增加到300 * 300,则该程序开始运行非常慢,因为它必须检查许多对象。 我真的不知道Minecraft之类的游戏如何与ALL THOSE块一