【COCOS2DX-BOX2D游戏开发之三】 读取tiledmap的tmx阻挡

本文介绍了如何在Cocos2d-x 2.2.2版本中,利用Box2D游戏引擎,读取TMX文件中的阻挡区域(polyline, polygon, box),并生成对应的b2Fixture。通过编辑TMX地图,在'Physics'层设置阻挡物,然后解析XML文件获取图形信息,转换单位并构建b2Shape。注意在构造b2PolygonShape时,点的顺序需反转以适应Box2D的坐标系统。最后,展示了实现效果。" 113207064,10547618,MySQL存储过程中的游标嵌套使用,"['数据库', 'SQL', 'MySQL游标']
摘要由CSDN通过智能技术生成

做一款像素游戏项目,需要读取TMX文件中的阻挡区域,生成box2d的fixture,来做阻挡  使用cocos2dx版本: 2.2.2


1.在tmx文件中创建一个"Physics"的层,用来存放编辑器中生成的各种阻挡块

编辑器中主要有polygone, polyline,box和circle4种,其实box也属于polygone



2.我的tiled map 版本Version 0.9.1

查看tmx文件,增加的层属于<Objectgroup>是不会被渲染的,所以添加多个层对效率也没有什么影响, 我们此处叫"Physics"

上图的4个图形,分别对应下图XML的4个<object></object>


polyline读取一个初始点x,y,然后读取一些列相对于初始点的偏移值

box读取x,y,width,height

circle读取起始点x,y,外加直径width(height)足以,因为无法构造椭圆的b2Shape,所以我们构造圆

polygon读取起始点x,y,然后读取一些列相对于初始点的偏移值,类似于polyline




3.cocos2dx中解析此文件的时CCTMXXMLParser.cpp 大概在623行,但是代码中只解析了polygon,polyline和circle处解析代码为空,我们在此处添加完全


else if (elementName == "polygon") 
    {
        // find parent object's dict and add polygon-points to it
        ObjectGroup* objectGroup = (ObjectGroup*)m_pObjectGroups->lastObject();
        CCDictionary* dict = (CCDictionary*)objectGroup->getObjects()->lastObject();

        // get points value string
        const char* value = valueForKey("points", attributeDict);
        if(value)
        {
            CCArray* pPointsArray = new CCArray;

            // parse points string into a space-separated set of points
            stringstream pointsStream(value);
            string pointPair;
            while(std::getline(pointsStream, pointPair, ' '))
            {
                // parse each point combo into a comma-separated x,y point
                stringstream pointStream(pointPair);
                string xStr,yStr;
                char buffer[32] = {0};
                
                CCDictionary* pPointDict = new CCDictionary;

                // set x
                if(std::getline(pointStream, xStr, ','))
                {
                    int x = atoi(xStr.c_str()) + (int)objectGroup->getPositionOffset().x;
                    sprintf(buffer, "%d", x);
                    CCString* pStr = new CCString(buffer);
                    pStr->autorelease();
                    pPointDict->setObject(pStr, "x");
                }

                // set y
                if(std::getline(pointStream, yStr, ','))
                {
                    int y = atoi(yStr.c_str()) + (int)objectGroup->getPositionOffset().y;
                    sprintf(buffer, "%d", y);
                    CCString* pStr = new CCString(buffer);
                    pStr->autorelease();
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值