【发布时间】:2023-03-26 03:27:01
【问题描述】:
下面是我的“Floor.swift”类,它基本上是一堆墙。我有来自屏幕顶部的对象,一旦 Floor 和 SKSpriteNodes 发生碰撞,我希望删除 SKSpriteNode。下面是我的 Floor 课。
import Foundation
import SpriteKit
class Floor: SKNode {
override init() {
super.init()
let leftWall = SKSpriteNode(color: UIColor.clear, 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.clear, 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.clear, 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)
self.physicsBody = SKPhysicsBody(bodies: [leftWall.physicsBody!, rightWall.physicsBody!, bottomWall.physicsBody!])
self.physicsBody?.categoryBitMask = floorCategory
self.physicsBody?.contactTestBitMask = nailDropCategory | pointCategory | lifeCategory
self.physicsBody?.collisionBitMask = balloonCategory
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemted")
}
}
“func didBegin(_contact:SKPhysicsContact)”下的GameScene类我写了:
func didBegin(_ contact: SKPhysicsContact) {
if (contact.bodyA.categoryBitMask == nailDropCategory | pointCategory | lifeCategory) && (contact.bodyB.categoryBitMask == floorCategory) {
// contact.bodyB.node!.removeFromParent()
print("COLLISION")
}
}
如您所见,在我的 Floor 类中,我使用我的所有 SKSpriteNode 将对象设置为“self.physicsBody = SKPhysicsBody(bodies:)”。但由于某种原因,我没有得到任何检测。我让我的“Floor”类成为我的 objectCategory、pointCategory、lifeCategory 的每个类的“contactTestBitMask”。这是一个我一直坚持一分钟的问题,有什么想法吗?
更新:
所以我现在正在使用下面的代码并且它正在工作!唯一的问题是,默认情况下也删除了我的“balloonCategory”,我不希望它这样做。我怎样才能让它只忽略那个类别但又充当气球的墙?
func didBegin(_ contact: SKPhysicsContact) {
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
switch contactMask {
case balloonCategory | nailDropCategory:
print("nailDrop and balloon have contacted.")
contact.bodyB.node!.removeFromParent()
self.run(SKAction.playSoundFileNamed("lostlifesound.mp3", waitForCompletion:false))
lifeLost -= 1
case balloonCategory | pointCategory:
print("point and balloon have contacted.")
contact.bodyB.node!.removeFromParent()
totalPoints += 2
self.run(SKAction.playSoundFileNamed("pointsound.mp3", waitForCompletion:false))
case balloonCategory | lifeCategory:
print("life and balloon have contacted.")
contact.bodyB.node!.removeFromParent()
lifeLost += 1
self.run(SKAction.playSoundFileNamed("pointsound.mp3", waitForCompletion:false))
default:
contact.bodyB.node!.removeFromParent()
print("Removed \(String(describing: contact.bodyB.node!.name))")
}
}
【问题讨论】:
-
nailDropCategory?点类别?生活类别?除了您之外,没有人知道您如何定义位掩码。
-
好吧,我在所有其他类上定义了它,并且所有其他冲突都有效,所以我只是迷路了哈哈
-
如果物理学已经在你的项目中起作用,那么这似乎应该起作用。您能否在示例项目中重现此问题并在 Github 上分享?似乎解决方案可能来自调试。
-
@peacetype 看看我的代码更新。我现在正在使用 switch 方法。在默认:部分中,它正在删除所有其他完美的节点,但我不希望它删除我的 balloonCategory,但我也不希望它在与我的 floorCategory 碰撞时删除它。我只是想让它成为它的一堵墙。我该怎么做?
-
@Dewan。您不能总是删除 nodeB 对象,因为您不知道哪个对象是 nodeA,哪个是 nodeB,但是有一种简单的方法可以解决这个问题。你能告诉我你想为每个联系人删除哪些节点吗?
标签: swift sprite-kit skphysicsbody