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

时间:2016-03-02 02:04:32

标签: c++ cocos2d-x game-physics tile

我目前正在尝试将cocos2d-x中内置的PhysicsBody和TileMap类组合在一起,为基于物理的sidescroller创建关卡(墙)。我有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左右。是否有更少的暴力方法,可以更有效地创建物理机构?注意:大多数地图都是空白的,所以我不认为实体/瓷砖的数量是主要问题。

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

1 个答案:

答案 0 :(得分:1)

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

如果这没有帮助,那么您将不得不采用一些轮廓跟踪方法来避免为瓷砖地图中的每个瓷砖创建静态实体。最好为从瓷砖贴图中追踪的每个轮廓创建1个静态实体。这样,你最终会得到更少的物理身体,你的表现也不会受到太大伤害。

这样做的一种方法是所谓的marching squares算法。另一个是Moore neighborhood算法。