我在屏幕上有 4 个 SpriteNode,我不希望它们相互弹开,而是相互流过,同时保持与某些 SpriteNode 和屏幕框架的碰撞。我已经为所有这些声明了类别:
let BCategory : UInt32 = 0x1 << 0
let B2Category : UInt32 = 0x1 << 1
let B3Category : UInt32 = 0x1 << 2
let B4Category : UInt32 = 0x1 << 3
let BotCategory : UInt32 = 0x1 << 4
let PadCategory : UInt32 = 0x1 << 5
let WallCategory : UInt32 = 0x1 << 6
还添加了位掩码:
b.physicsBody!.categoryBitMask = BCategory
b2.physicsBody!.categoryBitMask = B2Category
b3.physicsBody!.categoryBitMask = B3Category
b4.physicsBody!.categoryBitMask = B4Category
p.physicsBody!.categoryBitMask = PadCategory
wall.categoryBitMask = WallCategory
bot.physicsBody?.categoryBitMask = BotCategory
b.physicsBody?.contactTestBitMask = BotCategory | PadCategory
b2.physicsBody?.contactTestBitMask = BotCategory | PadCategory
b3.physicsBody?.contactTestBitMask = BotCategory | PadCategory
b4.physicsBody?.contactTestBitMask = BotCategory | PadCategory
除了检查 SpriteNode 之间的碰撞外,我还想通过以下方式进行碰撞:
func didBeginContact(contact: SKPhysicsContact) {
是否有可能让所有 b(b、b2、b3、b4)都与 p、wall 和 bot 发生碰撞,但不发生在它们之间?非常感谢任何帮助!
编辑:我遇到的问题是由 b(b、b2、b3、b4)表示的 SpriteNode 相互弹跳。我希望每个 b 仅从 BotCategory 和 PadCategory 中包含的 SpriteNode 反弹,并滑过/穿过其他 b。
最佳答案
您混淆了碰撞和接触。碰撞是指 2 个物理体相互碰撞并弹开。碰撞完全由游戏引擎处理。您只需设置必要的 collisionBitMask
接触是指 sprite-kit 游戏引擎告诉您两个物理体已经接触的代码。然后你可以制造一个爆炸,更新分数等。2 个物体可以在没有通知你接触的情况下发生碰撞,或者它们可以在没有碰撞的情况下进行接触。您必须设置 contactTestBitMask,将您的程序设置为 physicsWorld.contactDelegate并实现一个或两个 didBeginContact/didEndContact功能。
两个物体是否碰撞由 collisionBitMask 控制.默认情况下,这设置为 UInt32.Max即一切都与一切相撞。给定 2 个物体,A 和 B,物体 A 有可能与物体 B 碰撞,即从 B 上反弹,但物体 B NOT 与物体 A 碰撞,即不受碰撞影响。
您的代码是否收到有关 2 个 body 接触的通知由 contactTestBitMask 控制。 .默认设置为 0,即没有注册联系人。给定 2 个主体 A 和 B,您只需将主体 A 的 contactTestBit 掩码设置为主体 B 的类别,以便注册两个主体之间的所有联系人。
我发现这个函数对于检查场景中有哪些碰撞和接触很有用:
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)"
if category == UInt32.max {print("Category for \(name) does not appear to be set correctly as \(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)")}
}
}
}
在使用 checkPhysics() 设置物理后调用它它将列出哪些物体发生碰撞以及您将收到关于哪些接触的通知。
关于ios - SpriteKit - 使某些 SpriteNodes 在不禁用其物理体的情况下不会发生碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37517113/
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我正在学习Rails,对Sinatra和Merb知之甚少。我想知道您会在哪些情况下使用Merb/Sinatra。感谢您的反馈! 最佳答案 Sinatra是一个比Rails更小、更轻的框架。如果你想让一些东西快速运行,只需发送几个URL并返回一些简单的内容,就可以使用它。看看Sinatrahomepage;这就是启动和运行“Hello,World”所需的全部内容,而在Rails中,您需要生成整个项目结构、设置Controller和View、设置路由等等(我还没有有一段时间写了一个Rails应用程序,所以我不知道“Hello,World