【问题标题】:What is the maximum number of categoryBitMask's allowed in Sprite Kit?Sprite Kit 中允许的 categoryBitMask 的最大数量是多少?
【发布时间】:2015-06-10 09:29:43
【问题描述】:

我听说每个 Sprite Kit 游戏只允许使用 32 种不同的类别位掩码。有没有办法解决?我绝对需要更多(大约需要 3-4 倍,因为游戏是一个开放世界的游戏)。我将我的 categorybitmask 设置如下:

static const uint64_t boundaryCategory    = 0x1 << 0;
static const uint64_t mainCharCategory    = 0x1 << 1;
...
static const uint64_t someOtherCategory   = 0x1 << 31;

我什至将 uint32_t 更改为 uint64_t,希望这会使我可以使用的 categorybitmask 数量翻倍。不幸的是,事实并非如此。如果有人知道任何绕过此限制的技术,我将非常感激。

【问题讨论】:

  • 你是对的。因为 Sprite Kit 对代表 32 个不同物理类别的 32 位整数使用位掩码,所以您不能拥有更多(即使在 Xcode 7 中也是如此)。对于最大值(UInt32 * 2),4294967295,即二进制的 11111111111111111111111111111111,您使该对象与所有其他对象发生碰撞。
  • 好的。所以绝对没有办法破解这个限制?我是否可以使用其他一些技术来提供与“char1.physicsBody.categoryBitMask = char1Category;”相同或相似的功能?

标签: ios objective-c sprite-kit bitmask


【解决方案1】:

您可以通过多种方式在此问题上发挥创意。例如,您可以使用节点的名称属性。将所有敌人归为一个类别BitMask,并在建立联系后使用他们的名字来区分他们。

另一种选择是使用 SKNode 字典属性。如果需要,这允许您存储更详细的数据,而不仅仅是字符串。

创建一个 SKNode 字典:

myNode.userData = [NSMutableDictionary dictionary];
[myNode.userData setObject:@"goblin" forKey:@"enemyType"];

读字典:

NSString *myString = [myNode.userData objectForKey:@"enemyType"];

【讨论】:

  • 太棒了!为什么我没有想到呢?谢谢。
  • 好的!第一个例子,关于节点的 name 属性,效果很好!就像这样“(firstBody.categoryBitMask == [_worldNode childNodeWithName:@"charRed"].physicsBody.categoryBitMask) && (etc.)”。但是,sangony,您能否举例说明如何执行第二种方法,关于 SKNode 字典属性?
【解决方案2】:

您可以使用 UInt32 定义超过 32 个对象。

一种方法是保留最后一位。它会减少您拥有的物品位数,但您会将其乘以您使用的位数。因此,如果我们只使用 32 位作为超过 31 个计数的项目的掩码,我们可以拥有 2*31 个对象。如果我们为更多的项目保留第 32 位和第 31 位,我们可以有 4*30 个对象等等。

即来自 SKScene 的普通 32 位

(void)didBeginContact:(SKPhysicsContact *)contact
{
    uint32_t catagoryContactBitMask = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask); 

    if (catagoryContactBitMask == (carCategory | wallCategory))
    {    ....
    }

}

例如,如果我们需要更多高于 32 的类别... 因此,让我们将第 32 位保留为超过 31 项的“二级”位...这将为我们提供 2*31 或 62 项。

静态常量 uint32_t 32bitMask = 0x1

静态常量 uint32_t wallCategory = 0x1

静态常量 uint32_t 门廊类别 = 0x1

静态常量 uint32_t lamboCategory = 0x1

碰撞检测应该是一样的

再次来自 SKScene

(void)didBeginContact:(SKPhysicsContact *)contact
{
    uint32_t catagoryContactBitMask = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask); 

    if ( catagoryContactBitMask == (wallCategory|porcheCategory))
    {    ....
    }
    else if ( catagoryContactBitMask == (wallCategory|lamboCategory))
    {    ....
    }

}

【讨论】:

    猜你喜欢
    • 2015-07-30
    • 1970-01-01
    • 2012-08-28
    • 2013-06-10
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    相关资源
    最近更新 更多