• cocos2dx中的格子地图TileMap


    格子地图的优点:

    a.节省内存,我们知道对于一款游戏来说,如果以图片来作为地图的话,对于神庙逃亡,魂斗罗这样的场景很多,地图很长的游戏显然不现实,因为图片很占内存,但是这些游戏的地图有一个特点就是:重复的部分很多,比如魂斗罗游戏的每一关的地图里边,无外乎,陆地,海洋,天空,草地等等这些元素,设想我们把地图分成一个一个的小格子,那么这么一张大的地图则只需要五种格子即可构成:陆地格子,海洋格子,天空格子,草地格子,其他格子等,而需要的地方只需要把这几种格子组合即可,这样在内存中只需要存储这五种格子的小块图片,是不是大大节约了内存呢

    b.系统限制,不支持大的图片作为地图,例如android系统最大支持2048X2048的图片,而IOS系统也顶多支持4096X4096大小的图片

    格子地图:可以理解为用不同的瓷砖贴地板

    格子地图中的数据编码一般采用base64编码,编码规则是没6bit位将二进制进行编码成文本,

    const char base64[]="A-Za-z0-9+-";//将每6位二进制编码成前面字符串中的某一位字符,因此又具有一定的加密功能

    2^6=64, (0~63),所以称base64编码

    cocos中有专门处理格子地图的类:CCTMXTileMap

    创建格子地图:

    CCTMXTileMap *map=CCTMXTileMap::create("xxx.tmx");//创建依赖.tmx文件,它其实是一个xml文件,是对格子地图的描述

    addchild(map);//格子地图也是一个CCNode对象,可以添加到渲染树上

    class  CCTMXTiledMap : public CCNode //格子地图本质也是一个CCNode

    格子地图中的几个概念:

    1.图层,CCTMXLayer,本质是一个精灵集合

    获取图层:CCTMXLayer *layer = map->layerNamed(const char *layerName);//根据图层的名字来获取图层

    class   CCTMXLayer : public CCSpriteBatchNode

    2.地图格子:实质就是精灵,CCSprite

    获取地图格子:CCSprite *spr = layer->tileAt(ccp(2, 2));//获取指定位置的地图格子,本质是一个CCSprite

    TileID:格子地图中的地图格子的编号,可以通过TileID来获得地图格子的类型

    获取指定位置的地图格子的id:

     int gid = layer->tileGIDAt(ccp(2, 2));//获取指定位置的地图格子的编号
     CCLog("gid=%d", gid);

    设置格子精灵消失:layer->setTileGID(0, ccp(3, 3));//设置格子精灵为id=0,即消失

    //将格子地图坐标转换为世界坐标

    CCPoint T23TileMap::Tile2PointLB(CCPoint ptTile)

    {

       int x = _map->getTileSize().width*ptTile.x;//dx*x  

      int y = (_map->getMapSize().height - 1 - ptTile.y)*_map->getTileSize().width;//(24-1-y)*dy  

      return ccp(x, y);

    }

    //将openGL坐标转换为格子地图坐标

    CCPoint T23TileMap::Point2Tile(CCPoint ptGL)

    {

       int dx = _map->getTileSize().width;

       int dy = _map->getTileSize().height;

       CCPoint ptMap = _map->convertToNodeSpace(ptGL);//将世界坐标转换为以地图为基点的本地坐标

       int x = ptMap.x / dx;

       int y =ptMap.y / dy;  

      y = _map->getMapSize().height - 1 - y;//本地坐标是以基准节点的左下角为原点的,而格子地图的原点是左上角,故应该用y轴方向的总格子数减去y/dy,才是真正的格子地图的坐标

       return ccp(x, y);

    }

  • 相关阅读:
    硬件加速 Hardware Accelerated [MD]
    Redis 常见面试题(2020最新版)
    1秒时限情况下算法复杂度要求
    linux ikatago-server
    Linux踢出其他正在SSH登陆用户
    多个Git帐号的SSH key切换(不同网站的gitlab&github)
    RTL8201 替换适配国产JL11网卡
    网卡PHY 移植注意事项
    django shell执行命令来批量更新model 数据
    git 设置和取消socks5 代理
  • 原文地址:https://www.cnblogs.com/ttss/p/4098101.html
Copyright © 2020-2023  润新知