2

所以我在下面有我的“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")
}

但由于某种原因,我没有得到任何检测。我让我的“Floor”类成为我的 objectCategory、pointCategory、lifeCategory 的每个类的“contactTestBitMask”。我究竟做错了什么!?我的其他碰撞被检测到,但不是这个。

4

1 回答 1

3

您的leftWall,rightWallbottomWall具有默认contactTestcollision位掩码,因此将与所有内容发生冲突并生成没有任何内容的联系人。除了它们的isDynamic属性都设置为false,因此它们不能与任何东西碰撞或接触(尽管如果其他东西isDynamic设置为 ,其他东西可以碰撞并接触它们true)。

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

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

但您实际上并没有创建self.physicsBody. 您的代码会崩溃,除非您使用了可选链接 ( self,phyicsBody?),因此 Swift 会到达“?” 并说“哦 - 它是可选的,不存在。那我就停在这里吧”

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

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

(SKPhysicsBody 有一个初始化程序,它采用一组物理体来创建一个新的物理体)。

于 2017-12-22T20:02:54.817 回答