Sprite Kit 中允许的 categoryBitMask 的最大数量是多少?
What is the maximum number of categoryBitMask's allowed in Sprite Kit?
我听说每个 Sprite Kit 游戏只允许使用 32 个不同的类别位掩码。有没有办法解决?我绝对需要更多(因为游戏是开放世界游戏,所以大约多 3-4 倍)。我将我的类别位掩码设置如下:
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 的数量增加一倍。不幸的是,事实并非如此。如果有人知道绕过这个限制的任何技术,我将不胜感激。
对于这个问题,您可以通过多种方式发挥创意。例如,您可以使用节点的名称 属性。将你所有的敌人归为一个类别 BitMask,并在接触后使用他们的名字来区分他们。
另一种选择是使用 SKNode 字典 属性。如果需要,这允许您存储更详细的数据,而不仅仅是一个字符串。
正在创建 SKNode 字典:
myNode.userData = [NSMutableDictionary dictionary];
[myNode.userData setObject:@"goblin" forKey:@"enemyType"];
正在读字典:
NSString *myString = [myNode.userData objectForKey:@"enemyType"];
您可以使用 UInt32 定义超过 32 个对象。
一种方法是保留最后一位。它会减少您拥有的项目位数,但您会将其乘以您使用的位数。因此,如果我们仅对 31 个以上的项目使用 32 位作为掩码,我们可以拥有 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 位保留为 'second level' 位,用于超过 31 的项目...这将为我们提供 2*31 或 62 项。
static const uint32_t 32bitMask = 0x1 << 32; //10000000000000000000000000000000
static const uint32_t wallCategory = 0x1 << 0; // 00000000000000000000000000000001
static const uint32_t porcheCategory = 0x1 << 1; // 00000000000000000000000000000010
static const uint32_t 兰博类别 = 0x1 << 1 | 32位掩码; //10000000000000000000000000000010
碰撞检测应该是一样的
再次来自 SKScene
(void)didBeginContact:(SKPhysicsContact *)contact
{
uint32_t catagoryContactBitMask = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);
if ( catagoryContactBitMask == (wallCategory|porcheCategory))
{ ....
}
else if ( catagoryContactBitMask == (wallCategory|lamboCategory))
{ ....
}
}
我听说每个 Sprite Kit 游戏只允许使用 32 个不同的类别位掩码。有没有办法解决?我绝对需要更多(因为游戏是开放世界游戏,所以大约多 3-4 倍)。我将我的类别位掩码设置如下:
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 的数量增加一倍。不幸的是,事实并非如此。如果有人知道绕过这个限制的任何技术,我将不胜感激。
对于这个问题,您可以通过多种方式发挥创意。例如,您可以使用节点的名称 属性。将你所有的敌人归为一个类别 BitMask,并在接触后使用他们的名字来区分他们。
另一种选择是使用 SKNode 字典 属性。如果需要,这允许您存储更详细的数据,而不仅仅是一个字符串。
正在创建 SKNode 字典:
myNode.userData = [NSMutableDictionary dictionary];
[myNode.userData setObject:@"goblin" forKey:@"enemyType"];
正在读字典:
NSString *myString = [myNode.userData objectForKey:@"enemyType"];
您可以使用 UInt32 定义超过 32 个对象。
一种方法是保留最后一位。它会减少您拥有的项目位数,但您会将其乘以您使用的位数。因此,如果我们仅对 31 个以上的项目使用 32 位作为掩码,我们可以拥有 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 位保留为 'second level' 位,用于超过 31 的项目...这将为我们提供 2*31 或 62 项。
static const uint32_t 32bitMask = 0x1 << 32; //10000000000000000000000000000000
static const uint32_t wallCategory = 0x1 << 0; // 00000000000000000000000000000001
static const uint32_t porcheCategory = 0x1 << 1; // 00000000000000000000000000000010
static const uint32_t 兰博类别 = 0x1 << 1 | 32位掩码; //10000000000000000000000000000010
碰撞检测应该是一样的
再次来自 SKScene
(void)didBeginContact:(SKPhysicsContact *)contact
{
uint32_t catagoryContactBitMask = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);
if ( catagoryContactBitMask == (wallCategory|porcheCategory))
{ ....
}
else if ( catagoryContactBitMask == (wallCategory|lamboCategory))
{ ....
}
}