我听说每个Sprite Kit游戏只允许使用32种不同的categorybitmask。有没有办法解决?我绝对需要更多(自游戏开放世界以来大约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数量增加一倍。不幸的是,事实并非如此。如果有人知道绕过这个限制的任何技术,我将非常感激。
答案 0 :(得分:7)
您可以通过多种方式了解此问题。例如,您可以使用节点的name属性。将所有敌人置于一个categoryBitMask下,并在联系完成后使用他们的名字来区分他们。
另一种方法是使用SKNode字典属性。如果需要,这允许您存储更多详细数据,而不仅仅是字符串。
创建SKNode字典:
myNode.userData = [NSMutableDictionary dictionary];
[myNode.userData setObject:@"goblin" forKey:@"enemyType"];
阅读字典:
NSString *myString = [myNode.userData objectForKey:@"enemyType"];
答案 1 :(得分:0)
您可以使用UInt32定义32个以上的对象。
执行此操作的一种方法是保留最后一位。它将减少项目的位数,但是您可以将其乘以使用的位数。因此,如果我们仅对32位数以上的项目使用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位保留为大于31的项目的“第二级”位...这将给我们2 * 31或62个项目。
静态const uint32_t 32bitMask = 0x1 << 32; // 10000000000000000000000000000000
静态常量uint32_t wallCategory = 0x1 << 0; // 00000000000000000000000000000001
静态const uint32_t porcheCategory = 0x1 << 1; // 00000000000000000000000000000010
静态const uint32_t lamboCategory = 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))
{ ....
}
}