Cocos2d/Box2d。如何从 tilemap .tmx 生成物理体?

Cocos2d/Box2d. How to generate a physics body from a tilemap .tmx?

我是游戏开发新手。

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

重要的是要注意,我正在为 windows 编程,我找到的所有文档都是关于 IOS 的,或者对于旧版本,某些函数(如 b2BodyDef bodyDef)似乎不起作用。

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

High-Level 概述

在继续此处之前,我对您的 .tmx tilemap 做出了假设。您具有要创建为实体 object 的 object 的唯一标识符 (你可以用它的名字把它拉出来检查)。

  1. 读入 .tmx 文件并将其提供给您的 fileParser。
  2. 获取所有 "Nodes"、"Sprites" 中包含您的物理 body 标识符的内容。
  3. 由于您使用的是瓦片地图,我假设您的所有碰撞区域都是方形的。
  4. 将节点列表提供给您的 PhysicsBodyFactory 并使用以下代码构建您需要的物体。

pseudo-ish 下面的代码

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"); 

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

我正在写一篇博客 post,内容是关于如何将 cocostudio 用作 UI 工具,这将完全涵盖这一点。希望对您有所帮助,如果您正在寻找此解决方案,请告诉我。