Sprite Kit中允许的categoryBitMask的最大数量是多少?

问题描述 投票:4回答:2

我听说每个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数量增加一倍。不幸的是,事实并非如此。如果有人知道任何绕过此限制的技术,我将非常感谢。

ios objective-c sprite-kit bitmask
2个回答
7
投票

您可以通过多种方法来解决此问题。例如,您可以使用节点的名称属性。一旦建立联系,就将所有敌人归为一类BitMask,并使用其名称来区分它们。

另一种替代方法是使用SKNode词典属性。如果需要,这使您可以存储比字符串更多的详细数据。

创建SKNode字典:

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

阅读字典:

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

0
投票

您可以使用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位保留为大于31的项的“第二级”位...这将给我们2 * 31或62项。

静态const uint32_t 32bitMask = 0x1 << 32; // 10000000000000000000000000000000

静态const 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))
    {    ....
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.