SKPhysicsContact未检测到categoryBitMask碰撞

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SKPhysicsContact未检测到categoryBitMask碰撞相关的知识,希望对你有一定的参考价值。

所以我下面的“Floor.swift”课程基本上是一堆墙。我有来自屏幕顶部的对象,一旦Floor和SKSpriteNodes发生碰撞,我希望删除SKSpriteNode。以下是我的楼层课程。

import Foundation
import SpriteKit

    class Floor: SKNode {
        override init() {
            super.init()

            let leftWall = SKSpriteNode(color: UIColor.brown, size: CGSize(width: 5, height: 50))
            leftWall.position = CGPoint(x: 0, y: 50)
            leftWall.physicsBody = SKPhysicsBody(rectangleOf: leftWall.size)
            leftWall.physicsBody!.isDynamic = false
            self.addChild(leftWall)

            let rightWall = SKSpriteNode(color: UIColor.brown, size: CGSize(width: 5, height: 50))
            rightWall.position = CGPoint(x: 375, y: 50)
            rightWall.physicsBody = SKPhysicsBody(rectangleOf: rightWall.size)
            rightWall.physicsBody!.isDynamic = false
            self.addChild(rightWall)

            let bottomWall = SKSpriteNode(color: UIColor.brown, size: CGSize(width: 500, height: 10))
            bottomWall.position = CGPoint(x: 150, y: -5)
            bottomWall.physicsBody = SKPhysicsBody(rectangleOf: bottomWall.size)
            bottomWall.physicsBody!.isDynamic = false
            self.addChild(bottomWall)

            // Set the bit mask properties
            self.physicsBody?.categoryBitMask = floorCategory
            self.physicsBody?.contactTestBitMask = objectCategory | pointCategory | lifeCategory
            self.physicsBody?.collisionBitMask = dodgeCategory
        }

        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemted")
        }
    } 

然后在“func didBegin(_ contact: SKPhysicsContact)”下的GameScene课程中,我写道:

 if (contact.bodyA.categoryBitMask == floorCategory) && (contact.bodyB.contactTestBitMask == objectCategory | pointCategory | lifeCategory) {
              contact.bodyB.node!.removeFromParent()
              print("COLLISION")
}

但出于某种原因,我没有得到任何检测。我在我的objectCategory,pointCategory,lifeCategory的每个类上使我的“Floor”类成为“contactTestBitMask”。我究竟做错了什么!?检测到我的其他碰撞,但没有检测到。

答案

你的leftWallrightWallbottomWall有默认的contactTestcollision位掩码,因此会与所有东西碰撞并产生任何东西的联系。除了他们所有的isDynamic属性设置为false,所以他们不能碰撞或接触任何东西(虽然其他东西可以碰撞并联系他们,如果其他东西有isDynamic设置为true)。

但这可能是你想要的(地板和墙壁通常不是动态的)。我怀疑真正的问题是Floor类的对象不会有物理体,除非你在其他地方初始化它。你有这些线:

self.physicsBody?.categoryBitMask = ... self.physicsBody?.contactTestBitMask = ... self.physicsBody?.collisionBitMask = ...

但你还没有真正创造self.physicsBody。你的代码会崩溃,除非你使用了可选链接(self,phyicsBody?),因此Swift进入'?'并说“哦 - 它是可选的,不存在。我会在这里停下来“

至少,尝试使用3个墙体对象的物理体为Floor对象创建物理体:

Self.physicsBody = SKPhysicsBody(Bodies: [leftWall.physicsBody, rightWall.PhysicsBoidy, bottomWall.physicsBody])

(SKPhysicsBody有一个初始化器,它需要一系列物理实体来创建一个新的物理体)。

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

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

多次检测到碰撞

Sprite Kit 从未检测到我的碰撞

SKPhysicsContact 没有用子弹接触敌人

未检测到 UIToolBar 上 UIToolBar 上的模态视图中的 UIButton 触摸未检测到

Canny 边缘检测未检测到 100% 水平/未旋转的线