• 「cocos2dx」之直角瓦片地图学习


    cocos2d-x支持直角(90度)瓦片地图和斜角(45度)瓦片地图,直角瓦片地图用于2d游戏的地图,斜角瓦片地图给大脑形成3d的幻觉,所以常用于3d游戏的地图。

    本文只将常用的直角瓦片地图。

    基本概念

    直角瓦片地图可以用Tiled Map Editor制作,同时tiled生成的TMX格式的地图也是cocos2d推荐的地图格式。

    地图集(tiles sets)

    • 被嵌套的瓦片地图不被支持(如 使用瓦片素材组与其他图片)
    • 仅支持封装瓦片地图组(仅有瓦片素材组被导入地图文件)
    • 每个Layer最多支持1套瓦片素材组。

    地图层(tiles layer)

    • Tiles中Layer的数量没有上限。
    • 每一个Layer可以被CCTMXLayer类表示( 为CCSpriteSheet的子类)
    • 每一个单一的瓦片被CCSprite表示(父节点为CCTMXLayer)

    对象组 (Object Groups)

    • 瓦片地图支持对象组
    • 对象又称精灵,指在瓦片地图中不受瓦片图素限制的精灵,可以精确到像素

    坐标(Coordinates)

    64*32的Tiled瓦片地图文件的坐标系统为:

    • (0, 0): 左上角
    • (63, 31): 右下角(坐标下标从0开始)

    全局标识(GIDS)

    • 瓦片的GID是一个全局标识量,他的范围从正整数1开始,到瓦片地图中tile的总量
    • 如果你的地图中有5个不同的瓦片,那么:

      1. 瓦片0的GID为1

      2. 瓦片1的GID为2

      3. 瓦片3 的GID为3

      4. 以此类推

      5. 瓦片的GID 为 0 被用来表示此瓦片为空。

    代码示例:创建瓦片地图

    代码效果视频:http://www.56.com/u41/v_OTE1NTU0OTQ.html

    明日预告:瓦片地图的滚动及触摸事件处理,敬请期待

        //创建一个瓦片
        CCTMXTiledMap *tiledmap = CCTMXTiledMap::create("awakenjoys.tmx");
        tiledmap->setPosition(ccp(0, 0));       //设置地图位置
        tiledmap->setAnchorPoint(ccp(0, 0));    //设置地图锚点
        this->addChild(tiledmap, 2);            //将地图加入Layer
        
        //瓦片地图的大小由瓦片图素格数量和瓦片尺寸组成
        CCSize MapSize = tiledmap->getMapSize();    //获取瓦片地图大小
        CCLog("Map size is  %f, height:%f", MapSize.width, MapSize.height);
        
        CCSize  TiledSize = tiledmap->getTileSize();    //获取瓦片尺寸
        CCLog("tiled size is  %f, height:%f", TiledSize.width, TiledSize.height);
        
        //默认瓦片地图是无抗锯齿的,需要为每个瓦片设置抗锯齿
        CCArray *pChildArray = tiledmap->getChildren();
        CCSpriteBatchNode* child = NULL;
        CCObject* pObject = NULL;
        
        //遍历瓦片,并设置抗锯齿属性
        CCARRAY_FOREACH(pChildArray, pObject)
        {
            child = (CCSpriteBatchNode*)pObject;
            if (!child)
            {
                break;
            }
            child->getTexture()->setAntiAliasTexParameters();
        }
        
        //指定坐标获取Tile
        CCTMXLayer *MapLayer = tiledmap->layerNamed("tiledlayer1");
        CCSprite *Tile = MapLayer->tileAt(ccp(5, 11));
        //为获取到的tile创建动作,方便我们查看效果
        CCBlink *BlinkAction = CCBlink::create(10, 20);    //10秒内闪烁20次
        Tile->runAction(BlinkAction);
        
        CCSprite *newTile = MapLayer->tileAt(ccp(5, 13));   //获取新坐标的精灵
        //newTile->setAnchorPoint(ccp(0.5f, 0.5f));
        CCRotateBy *RotateAction = CCRotateBy::create(10, 7200.0f);
        newTile->runAction(RotateAction);
        
        //获取指定坐标的GID
        unsigned int map_gid = MapLayer->tileGIDAt(ccp(5, 11));
        CCLog("%d", map_gid);
        
        //为指定的坐标设置新的GID
        MapLayer->setTileGID(100, ccp((float)5, (float)13));
        CCLog("%d", MapLayer->tileGIDAt(ccp(5, 13)));
        
        //删除指定坐标的tile
        MapLayer->removeTileAt(ccp(5, 12));
  • 相关阅读:
    POJ2481(树状数组:统计数字 出现个数)
    jenkins(2)-linux环境下jenkins启动/重启/停止命令
    jenkins(1)-部分插件由于缺少依赖无法加载。要恢复这些插件提供的功能,需要修复这些问题并重启Jenkins的解决办法
    linux(4)-rpm包安装
    charles(2)-charles如何打断点,修改Request数据
    charles(1)-charles如何打断点,修改Response数据
    linux(3)-普通用户如何切换到root
    jmeter(51) Groovy脚本高级实战
    jmeter(49)-jenkins+ant+jmeter持续集成接口自动化测试-(linux环境)
    Codeforces Round #545 (Div. 2)D(KMP,最长公共前后缀,贪心)
  • 原文地址:https://www.cnblogs.com/awakenjoys/p/Tiles.html
Copyright © 2020-2023  润新知