Cocos2D中/ Box2D的。如何从tilemap .tmx生成物理实体?

时间:2015-10-06 18:44:53

标签: c++ cocos2d-x box2d cocos2d-x-3.0 tmx

我是游戏开发的新手。

我要做的是将我从Tiled创建的.tmx tilemap加载到我的游戏中作为一个物理体(ies),我正在使用C ++和Boxd2。我的瓷砖地图只显示了我想要碰撞的瓷砖,比如地板和一些平台。

重要的是要注意我正在为windows编程,我发现的所有文档都是关于IOS或旧版本的,像b2BodyDef bodyDef这样的函数似乎不起作用。

1 个答案:

答案 0 :(得分:0)

我目前正在做我在最新游戏中描述的内容,唯一的区别是我使用cocostudio构建游戏中的所有内容,包括我的地图。我这样做的原因是我可以控制我需要的一切,我使用预定义的命名约定来指示物理边缘然后我读取并确定其尺寸并构造我的边缘体。

高级概述

在继续这里之前,我对你的.tmx tilemap做了一些假设。您具有要作为物理对象创建的对象的唯一标识符 (在它的名字中你可以使用它来拉出并检查它)。

  1. 读入.tmx文件并将其提供给fileParser。
  2. 获取所有具有物理身份标识符的“节点”,“精灵”。
  3. 由于您使用的是瓷砖地图,我假设您的所有碰撞区域都是方形的。
  4. 将节点列表提供给PhysicsBodyFactory,并使用以下代码构建所需的实体。
  5. 下面的伪代码

    auto tileNode = listOfNodes.at(nodeIndex);
    
    b2BodyDef tileBodyDef;
    tileBodyDef.type = b2_staticBody;
    tileBodyDef.position.Set(tileNode->getPositionX() / Pixel_To_Meter_Ratio,
                             tileNode->getPositionY()/ Pixel_To_Meter_Ratio);
    
    auto b2PolygonShape tileShape;
    tileShape.SetAsBox(tileNode->getBoundingBox().size.width / Pixel_To_Meter_Ratio,
                       tileNode->getBoundingBox().size.height / Pixel_To_Meter_Ratio);
    
    auto tileBody = physicsWorld->CreateBody(tileBodyDef);
    // This can be used later on when you want to have different reactions for different collisions.    
    tileBody->SetUserData("CollidableTile"); 
    

    这将创建并将这些对象放置在您的物理世界中,允许其中的其他物体与其发生碰撞。如果您的玩家在世界上拥有自己的身体,那么将为您处理基本的碰撞。

    我正在写一篇关于使用cocostudio的博客文章,而不仅仅是一个UI工具,它将完全涵盖这一点。我希望这有帮助,如果您正在寻找此解决方案,请告诉我。