所以我有我的“Floor.swift”类,下面基本上是一堆墙。我有来自屏幕顶部的物体,一旦地板和 SKSpriteNode 发生碰撞,我希望删除 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")
}
}
然后在我的 GameScene 类中“func didBegin(_ contact: SKPhysicsContact)
“ 我写:
if (contact.bodyA.categoryBitMask == floorCategory) && (contact.bodyB.contactTestBitMask == objectCategory | pointCategory | lifeCategory) {
contact.bodyB.node!.removeFromParent()
print("COLLISION")
}
但由于某种原因,我没有得到任何检测。我将“Floor”类设置为“objectCategory”、“pointCategory”、“lifeCategory”的每个类上的“contactTestBitMask”。我究竟做错了什么!?我的其他碰撞都被检测到,但这次没有。
Your leftWall
, rightWall
and bottomWall
有默认的contactTest
and collision
位掩码,因此会与所有物体发生碰撞并与任何物体产生接触。除了他们都有自己的isDynamic
属性设置为false
,因此它们不能与任何物体碰撞或接触(尽管其他物体可以碰撞并接触它们,如果其他物体有isDynamic
set to true
).
但这可能就是您想要的(地板和墙壁通常不是动态的)。我怀疑真正的问题是对象Floor
类不会有物理体,除非你在其他地方初始化它。你有这些行:
self.physicsBody?.categoryBitMask = ...
self.physicsBody?.contactTestBitMask = ...
self.physicsBody?.collisionBitMask = ...
但你还没有真正创建self.physicsBody
。除非您使用可选链接,否则您的代码将会崩溃(self,phyicsBody?
),所以斯威夫特到达“?”并说“哦 - 它是可选的并且不存在。那我就停在这里吧”
至少,尝试为您创建一个物理体Floor
使用 3 个墙壁对象的物理体的对象:
Self.physicsBody = SKPhysicsBody(Bodies: [leftWall.physicsBody, rightWall.PhysicsBoidy, bottomWall.physicsBody])
(SKPhysicsBody 有一个初始化程序,它采用物理体数组来创建新的物理体)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)