首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SKPhysicsContact未检测到categoryBitMask冲突

SKPhysicsContact未检测到categoryBitMask冲突
EN

Stack Overflow用户
提问于 2017-12-23 03:23:17
回答 1查看 136关注 0票数 2

下面是我的"Floor.swift“类,基本上就是一堆墙。我有来自屏幕顶部的物体,一旦地板和SKSpriteNodes发生碰撞,我希望SKSpriteNode被移除。下面是我的地板类。

代码语言:javascript
复制
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类中,我写道:

代码语言:javascript
复制
 if (contact.bodyA.categoryBitMask == floorCategory) && (contact.bodyB.contactTestBitMask == objectCategory | pointCategory | lifeCategory) {
              contact.bodyB.node!.removeFromParent()
              print("COLLISION")
}

但由于某些原因,我没有得到任何检测到的东西。我让我的"Floor“类在我的objectCategory,pointCategory,lifeCategory的每个类上都是一个"contactTestBitMask”。我做错了什么?可以检测到我的其他冲突,但没有检测到这个冲突。

EN

回答 1

Stack Overflow用户

发布于 2017-12-23 04:02:55

你的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有一个初始化器,它需要一组物理体来创建一个新的物理体)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47946410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档