因为网上难以找到整个流程,今天花费了一个下午终于得到一些突破,不得不吐槽学校为什么要使用年代这么久远的引擎让我们制作项目。
首先我们要用tiledmap创建一个地图
在这个地图里使用了不同的图层,瓦片地图里的不同瓦片需要的属性往往不一样,这里的背景就不需要进行物理引擎碰撞检测,我们只需要把需要碰撞的瓦片都放在一个图层frontground里。
下面是所有的代码,已经写好了注释,自己看吧。
.h文件里
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__
#include "cocos2d.h"
USING_NS_CC;
class HelloWorld : public cocos2d::Layer
{
public:
static cocos2d::Scene* createScene();
cocos2d::TMXTiledMap* tileMap;//瓦片地图
cocos2d::Sprite *player;
virtual bool init();
Sprite* tile[1000];//这个精灵类数组用来装需要添加碰撞组件的瓦片
int lastile = 0;//这是tile数组的尾下标
CREATE_FUNC(HelloWorld);
};
#endif // __HELLOWORLD_SCENE_H__
cpp文件里
#include "HelloWorldScene.h"
USING_NS_CC;
Scene* HelloWorld::createScene()
{
auto scene = Scene::createWithPhysics();//创建带物理引擎的场景
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);//用来看运行后精灵的物理引擎组件
auto layer = HelloWorld::create();
scene->addChild(layer);
return scene;
}
bool HelloWorld::init()
{
auto visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
auto body = PhysicsBody::createEdgeBox(Size(1920,1920), PHYSICSBODY_MATERIAL_DEFAULT, 5.0);//创建物理世界边框
auto edgeNode = Node::create();
edgeNode->setPosition(Vec2(960, 960));//物理世界边框的中心位置
edgeNode->setPhysicsBody(body);
this->addChild(edgeNode);
tileMap = TMXTiledMap::create("tilemap/test2.tmx");//实例化瓦片地图
tileMap->setPosition(0, 0);
addChild(tileMap,1);
CCTMXLayer* frontground = tileMap->layerNamed("frontground");//获取需要添加PhysicsBody的瓦片所在的图层
for (int i = 0; i <= 39; i++)
{
for (int j = 0; j <= 39; j++)//瓦片地图大小40x40,从0开始,这个循环遍历一遍所有瓦片
{
tile[lastile] = frontground->tileAt(ccp(i, j));//获取frontground层里的瓦片,瓦片是精灵,可以放在这个数组中
if (tile[lastile])//并不是所有位置都有瓦片,如果没有瓦片就是空
{
auto boxPhysicsBody = PhysicsBody::createBox(tile[lastile]->getContentSize());//设置PhysicsBody组件
tile[lastile]->setPhysicsBody(boxPhysicsBody);//给瓦片添加上PhysicsBody组件
lastile++;
}
}
}
log("%d", lastile);//输出添加了PhysicsBody组件的瓦片数
return true;
}
运行结果是这样,瓦片现在有重力会下落,这个当然要调,但是为瓦片地图添加物理引擎基本已经实现了
log显示一共有45个瓦片添加了组件,可以看到并没有出错