如何为 TileMap 上的每个图块创建一个 PhysicsBody? (cocos2d-x)

How to create a PhysicsBody for each tile on a TileMap? (cocos2d-x)

我目前正在尝试在 cocos2d-x 中结合内置的 PhysicsBody 和 TileMap 类 来为我的基于物理的横向卷轴器创建关卡(墙)。我有大小为 80*24 的贴图,每个贴图的大小为 30*30 像素 - 我需要为每个贴图分配一个静态盒形物理体。

for    (int x=0; x < 80; x++)       //width of map
    {
        for (int y = 0; y < 24; y++)   //height of map
        {
            auto spriteTile = wallLayer->getTileAt(Vec2(x,y));
            if (spriteTile != NULL)    
            {
                PhysicsBody* tilePhysics = PhysicsBody::createBox(Size(30.0f, 30.0f), PhysicsMaterial(1.0f, 1.0f, 0.0f));                 
                tilePhysics->setDynamic(false);   //static is good enough for walls
                spriteTile->setPhysicsBody(tilePhysics);
            }
        }
    } 

上面的代码有效,但速度很慢,性能从 60 fps 下降到 20 fps 左右。有没有更简单的蛮力方法,可以更有效地创建物理体?注意:大部分地图都是空白的,所以我认为 bodies/tiles 的数量不是主要问题。

任何见解都会有所帮助,谢谢

首先,检查物理调试绘制是否打开,因为它可以显着降低 FPS。另外,请确保您在设备上而不是在模拟器上测量 FPS,因为它在那里不可靠。

如果这没有帮助,那么您将不得不采用某种等高线追踪方法来避免为瓷砖地图中的每个瓷砖创建静态主体。最好为您从瓦片地图中描出的每个轮廓创建 1 个静态主体。那样的话,你最终会得到更少的物理体,你的表现也不会受到太大的伤害。

一种方法是所谓的 marching squares algorithm. Another one is Moore neighborhood 算法。