我遵循 Sprite Kit 指南,在场景编辑器中它要求我将类别 mask 设置为 32,将碰撞 mask 设置为 11。这些数字有什么关系?
最佳答案
碰撞由 Sprite-Kit 游戏引擎自动处理;联系人由您的代码处理 - 当发生您感兴趣的联系人时,您的代码(didBeginContact'对于 Swift 2,'didBegin(contact:) 对于 Swift 3 和稍后)被调用。
您需要以二进制形式考虑这些位掩码,为了简单起见,我们将从简单的类别位掩码开始,即场景中的每个对象仅属于一个类别。
例如在你的场景中,你有一个玩家、一个玩家导弹、一个敌人和屏幕边缘。我们假设位掩码是 8 位而不是 32 位。将每个数字视为 8 个二进制数字(8 位)的范围,每个数字是 0 或 1。
场景中的对象必须具有唯一的类别,因此我们将按如下方式分配它们:
player.categoryBitMask = 00000001 (1 in decimal)
playerMissile.categoryBitMask = 00000010 (2 in decimal)
enemy.categoryBitMask = 00000100 (4 in decimal)
screenEdge.categoryBitMask = 00001000 (8 in decimal)
如果您使用十进制数字,而不是 2 的幂(1、2、4、8、16、32、64、128 等),那么将在类别位中设置多于 1 位使事情复杂化的掩码(这意味着该对象属于多个类别)并且您的代码必须变得更复杂。
现在想想什么从什么(碰撞)中反弹。假设除了导弹穿过屏幕边缘外,其他所有东西都会反弹。
每个对象的碰撞位掩码由表示该对象与之碰撞的对象的位组成,即:
player.collsionBitMask = 00001111 (15 in decimal) (the bits for all other objects are set)
playerMissile.collisionBitMask = 00000111 (7) (all object EXCEPT screenEdge)
enemy.collisonBitMask = 00001111 (15) (everything)
screenEdge.collisonBitMask = 00000000 (0) (collides with nothing)
现在我们考虑我们对哪些对象交互感兴趣。我们想知道什么时候:
这表示为:
player.contactTestBitMask = 00000100 (4) (the enemy's categoryBitMask)
enemy.contractTestBitMask = 00000011 (3) (the player's categoryBitMask combined with the missile's categoryBitMask))
请注意,如果您想知道 A 和 B 何时接触,只需让 A 的 contactTestBitMask (CTBM) 包含 B 的 categoryBitMask 即可;您也不必将 B 的 CTBM 设置为 A 的类别。但是如果你想让它们相互弹开,那么每个对象的 collisionBitMask 必须包含对方的 categoryBitMask。如果 A 的 collisonbitMask 包括 B 的类别,但反之则不然,那么当 2 发生碰撞时,A 会反弹而 B 不会受到影响。
对于您的具体示例,(类别掩码为 32,碰撞掩码为 11),categoryBitMask 为 32,即 00100000(仅保留 8 位)。 collisionBitMask 为 11,即 8 + 4 + 1,因此在二进制中这是“00001101”,这意味着它与 categoryBitMask 为 8、4 或 1 的对象发生碰撞,因此我假设您的场景中存在具有这些 categoryBitMask 的对象。
默认情况下,所有内容都会从其他所有内容反弹,即 collisionBitMask 全部为“1”,即 b'111111..' 并且不会通知与其他任何内容的接触,即 contactTestBitMask 全部为“0”。
另外 - 所有这些都适用于物理体,而不是节点。
关于ios - Sprite Kit 的 "Category Mask"和 "Collision Mask"是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40593678/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串