下面是我的"Floor.swift“类,基本上就是一堆墙。我有来自屏幕顶部的物体,一旦地板和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”。我做错了什么?可以检测到我的其他冲突,但没有检测到这个冲突。
发布于 2017-12-23 04:02:55
你的leftWall,rightWall和bottomWall都有默认的contactTest和collision位掩码,所以会与任何东西发生冲突,并生成不带任何东西的触点。除非它们的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有一个初始化器,它需要一组物理体来创建一个新的物理体)。
https://stackoverflow.com/questions/47946410
复制相似问题