有时在我的SpriteKit程序中,我的碰撞和接触(使用SKPhysicsBody)没有按预期触发或起作用。我想我已经设置了所需的一切,但仍无法获得正确的交互。我如何轻松检查将与建立碰撞的物体和物体建立碰撞?
为了帮助诊断这些类型的问题,我编写了一个可以在任何地方调用的函数,该函数将分析当前场景并生成一个列表,列出哪些节点与其他节点发生碰撞以及将通知我的场景发生哪些碰撞。
该功能是独立的,不需要告知有关场景中节点的任何信息。
功能如下:
//MARK: - Analyse the collision/contact set up.
func checkPhysics() {
// Create an array of all the nodes with physicsBodies
var physicsNodes = [SKNode]()
//Get all physics bodies
enumerateChildNodesWithName("//.") { node, _ in
if let _ = node.physicsBody {
physicsNodes.append(node)
} else {
print("\(node.name) does not have a physics body so cannot collide or be involved in contacts.")
}
}
//For each node, check it's category against every other node's collion and contctTest bit mask
for node in physicsNodes {
let category = node.physicsBody!.categoryBitMask
// Identify the node by its category if the name is blank
let name = node.name != nil ? node.name : "Category \(category)"
let collisionMask = node.physicsBody!.collisionBitMask
let contactMask = node.physicsBody!.contactTestBitMask
// If all bits of the collisonmask set, just say it collides with everything.
if collisionMask == UInt32.max {
print("\(name) collides with everything")
}
for otherNode in physicsNodes {
if (node != otherNode) && (node.physicsBody?.dynamic == true) {
let otherCategory = otherNode.physicsBody!.categoryBitMask
// Identify the node by its category if the name is blank
let otherName = otherNode.name != nil ? otherNode.name : "Category \(otherCategory)"
// If the collisonmask and category match, they will collide
if ((collisionMask & otherCategory) != 0) && (collisionMask != UInt32.max) {
print("\(name) collides with \(otherName)")
}
// If the contactMAsk and category match, they will contact
if (contactMask & otherCategory) != 0 {print("\(name) notifies when contacting \(otherName)")}
}
}
}
}
您还需要检查以下三件事:
SKPhysicsContactDelegate
physicsWorld.contactDelegate = self
SKPhysicsContactDelegate
:didBeginContact
didEndcontact
设置完所有图片后应调用该函数-通常在didMoveToView
工作结束时:
checkPhysics()
didMoveToView
在我的练习Swift项目的结尾处调用此函数时,将得到以下输出:
Optional(“ shape_blueSquare”)与Optional(“ Category 2147483648”)碰撞Optional(“
shape_blueSquare”)与Optional(“ shape_redCircle”)碰撞Optional(“
shape_blueSquare”)与Optional(“ shape_purpleSquare”)碰撞Optional(“
shape_blueSides)与Optional(“ shape_yellowTriangle”)Optional(“
shape_redCircle”)碰撞Optional(“ Category 2147483648”)Optional(“
shape_redCircle”)与Optional(“ shape_blueSquare”)碰撞Optional(“
shape_redCircle”)在与Optional(“ shape_purpleSquare”联系时通知)Optional(“
shape_redCircle”)与Optional(“ shape_yellowTriangle”)发生冲突。Optional(“
shape_redCircle”)在与Optional(“shape_yellowTriangle“)Optional(”
shape_purpleSquare“)与Optional(” Category 2147483648“)Optional(”
shape_purpleSquare“)碰撞与Optional(” shape_yellowTriangle“)Optional(”
shape_yellowTriangle“)碰撞与所有didBere_replace发生冲突的对象()和Optional(“
shape_redCircle”)didBeginContact输入了Optional(“
shape_purpleSquare”)和Optional(“
shape_redCircle”)didBeginContact输入了Optional(“
shape_yellowTriangle”)和Optional(“
shape_redCircle”)shape_yellowTriangle“)Optional(”
shape_yellowTriangle“)与为Optional(”
shape_purpleSquare“)输入的didBeginContact和为Optional(”
shape_purpleSquare“)输入的Optional(” shape_redCircle“)和为Optional(”
shape_purpleSquare“)输入的Optional(”
shape_redCircle“)didBeginContact的所有碰撞shape_yellowTriangle“)和Optional(”
shape_redCircle“)shape_yellowTriangle“)Optional(”
shape_yellowTriangle“)与为Optional(”
shape_purpleSquare“)输入的didBeginContact和为Optional(”
shape_purpleSquare“)输入的Optional(” shape_redCircle“)和为Optional(”
shape_purpleSquare“)输入的Optional(”
shape_redCircle“)didBeginContact的所有碰撞shape_yellowTriangle“)和Optional(”
shape_redCircle“)))
类别2147483648是我的边界,并且没有名称。我给了这个类别以匹配它的crashBitMask
请随时尝试使用此功能,让我知道它是否有用或在任何情况下均无法解决。
我有一个2D平铺矩阵(目前是墙),对于每一个墙,我检查我的玩家的下一个(下一个如它在下一帧中的位置)是否与该墙碰撞,如果是,我希望我的玩家站在它旁边,而不是进入它。 下面是我想出的公式(这只是针对左右碰撞): 它给了我这个结果(注意fps不稳定,目前矩形是32x32的正方形): 编辑1:我设法解决了正确的冲突问题。而不是上面的代码 但是左侧碰撞的问题是一样的。我尝试了 和 以防万一,但问题是一样的
问题内容: 我正在使用selenium来抓取一些数据。 我单击的页面上有一个按钮,说“ custom_cols”。此按钮为我打开一个窗口,从中可以选择列。 此新窗口有时需要一些时间才能打开(大约5秒钟)。所以我已经使用了 延迟为20秒。但是有时它无法在新窗口中选择查找元素,即使该元素可见。在其余时间中,这种情况仅发生十次一次。 我在其他地方也使用了相同的功能(WebDriverWait),并且可以
问题内容: 经过测试后,我只能对已经解析过的JSON数据返回一个肯定值。 根据官方文件: isValidJSONObject返回一个布尔值,该布尔值指示是否可以将给定对象转换为JSON数据。 但是,尽管事实是我尝试将其从JSON转换为NSDictionary的对象都可以正常转换,但仍会返回。 这是我的代码: 我的日志包含以下内容: 然后是dict的输出,这是一个巨大的NSMutableDictio
问题内容: 考虑以下可以在任何程序执行之前预加载的库: 问题是,尽管总是调用全局变量的构造函数,但对于某些程序却不调用析构函数,例如: 对于其他一些程序,按预期方式调用析构函数: 您能解释一下为什么在第一种情况下不调用析构函数吗?编辑:上面的问题已得到解答,即程序可能会使用_exit(),abort()退出。 然而: 有没有办法在预加载的程序退出时强制调用给定函数? 问题答案: 具有作为其初始化代
我必须将日期-时间字符串转换为分区日期-时间对象。我使用DateTimeForman读取模式。根据留档,模式中的“Z”可以接受以下格式: /-0000 但是“分区约会”。parse(myDate,formatter)只适用于第一种情况;相反,在第二种情况下,代码生成一个异常。 我用的是8Java 我做错什么了?谢谢!
我编写了自己的AtomicDouble类,还有一个BankAccount类,它执行两个简单的取款和存款操作,它有一个AtomicDouble实例(余额)。我的代码的问题是,当我在deposit()中调用addAndGet方法时,程序会陷入一个无限循环,compareAndSet()永远不会返回真值,但当我调试它时,currentValue和atomic中的值。get()相等,但此方法无法理解。 有