【问题标题】:How to create a PhysicsBody for each tile on a TileMap? (cocos2d-x)如何为 TileMap 上的每个图块创建一个 PhysicsBody? (cocos2d-x)
【发布时间】:2016-03-02 02:04:32
【问题描述】:

我目前正在尝试结合 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 左右。有没有更简单的蛮力方法,可以更有效地创建物理体?注意:大部分地图都是空白的,所以我不认为主体/瓷砖的数量是主要问题。

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

【问题讨论】:

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


    【解决方案1】:

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

    如果这没有帮助,那么您将不得不采用某种轮廓跟踪方法来避免为您的瓦片地图中的每个瓦片创建静态主体。最好为从平铺地图中追踪的每个轮廓创建 1 个静态主体。这样一来,您最终会得到更少的物理实体,并且您的性能不会受到太大影响。

    一种方法是所谓的marching squares 算法。另一种是Moore neighborhood算法。

    【讨论】:

    • 顺便说一句,你在地图上大概有多少个非空图块?
    • 哇,关注轮廓和算法建议——这让我开始思考减少多余瓷砖数量的方法。事实证明,通过将多个主体组合成一个平面/墙壁天花板,我从 450 块瓷砖到 120 块瓷砖,现在效果很好。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    相关资源
    最近更新 更多