图集

地图

TileMap 导出的 .Tmx 文件记录了地图所有信息,其中编辑好的图块信息会存放在每个图层的 Data 节点下。以下是一个 10x10 的图层,可以看到,Data 节点记录了每个图块对应到图集的索引,索引从 1 开始递增,一切都很好理解。

 <layer id="1" name="块层 1" width="10" height="10">
<data encoding="csv">
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1
</data>
</layer>

但是,TileMap 的图块是可以由 垂直翻转,水平翻转,旋转90度,旋转180度,旋转270度 这些操作组合运算,这些信息也会存储到对应的图块信息里,也就是 Data 节点中。下面是对 索引1 进行全部可能的运算后得到的数据,总共16条,为便于查看以二进制显示,可以很容易发现,数据采用了 32bit 整数存储,索引不变的情况下,只有 前3bit 发生了变化,可见 前3bit 用于记录运算信息,其余位(也就是剩下的29bit)用于存储索引。

000000000000000000000000‭00000001‬          0
‭01100000000000000000000000000001‬ 逆时针90
‭11000000000000000000000000000001‬ 逆时针180
‭10100000000000000000000000000001‬ 逆时针270 ‭10000000000000000000000000000001‬ 垂直翻转
‭00100000000000000000000000000001‬ 垂直翻转+逆时针90
‭01000000000000000000000000000001‬ 垂直翻转+逆时针180
‭11100000000000000000000000000001‬ 垂直翻转+逆时针270 ‭01000000000000000000000000000001‬ 水平翻转
‭11100000000000000000000000000001‬ 水平翻转+逆时针90
‭10000000000000000000000000000001‬ 水平翻转+逆时针180
‭00100000000000000000000000000001‬ 水平翻转+逆时针270 10100000000000000000000000000001 垂直翻转+水平翻转+逆时针90
00000000000000000000000000000001 垂直翻转+水平翻转+逆时针180
01100000000000000000000000000001 垂直翻转+水平翻转+逆时针270 ‭11000000000000000000000000000001‬ 垂直翻转+水平翻转

接下来就是分析 前3bit 的生成规则。首先,3bit 仅能存下8个不同数字:000,001,010,011,100,101,110,111。也就是说,按这个格式,只能存下8种运算组合。

再仔细看上面列表,其实每一条运算都会有一条重复的,把重复的运算剔除掉,就刚好只剩下8种组合。

000000000000000000000000‭00000001‬          0
000000000000000000000000‭00000001‬ 垂直翻转+水平翻转+逆时针180 01100000000000000000000000000001 逆时针90
01100000000000000000000000000001 垂直翻转+水平翻转+逆时针270 ‭11000000000000000000000000000001‬ 逆时针180
‭11000000000000000000000000000001‬ 垂直翻转+水平翻转 ‭10100000000000000000000000000001‬ 逆时针270
‭10100000000000000000000000000001‬ 垂直翻转+水平翻转+逆时针90 ‭10000000000000000000000000000001‬ 垂直翻转
‭10000000000000000000000000000001‬ 水平翻转+逆时针180 ‭00100000000000000000000000000001‬ 垂直翻转+逆时针90
‭00100000000000000000000000000001‬ 水平翻转+逆时针270 ‭01000000000000000000000000000001‬ 垂直翻转+逆时针180
‭01000000000000000000000000000001‬ 水平翻转 ‭11100000000000000000000000000001‬ 垂直翻转+逆时针270
‭11100000000000000000000000000001‬ 水平翻转+逆时针90 // 剔除重复运算之后
000000000000000000000000‭00000001‬ 0
‭00100000000000000000000000000001‬ 垂直翻转+逆时针90
‭01000000000000000000000000000001‬ 水平翻转
01100000000000000000000000000001 逆时针90
‭10000000000000000000000000000001‬ 垂直翻转
‭10100000000000000000000000000001‬ 垂直翻转+水平翻转+逆时针90
‭11000000000000000000000000000001‬ 垂直翻转+水平翻转
‭11100000000000000000000000000001‬ 水平翻转+逆时针90

推测方式比较原始,好在数据并不太多,比较容易推测出来。

在这之前,有想到过一些运算是重复的,却没想到可以紧凑到只要 3bit 就可以塞下这所有的运算组合。

小记——关于Tilemap图块索引编码的更多相关文章

  1. 揭示同步块索引(上):从lock开始

    转自:http://www.cnblogs.com/yuyijq/archive/2009/03/13/1410071.html 大家都知道引用类型对象除实例字段的开销外,还有两个字段的开销:类型指针 ...

  2. Windows phone 8 学习笔记(5) 图块与通知(转)

    基于metro风格的Windows phone 8 应用提到了图块的概念,它就是指启动菜单中的快速启动图标.一般一个应用必须有一个默认图块,还可以有若干个次要图块.另外,通知与图块的关系比较密切,我们 ...

  3. C#实现在CAD图纸中插入另一个DWG图块的代码

    C#实现在CAD图纸中插入另一个DWG图块的代码 PromptPointResult ppr = ed.GetPoint("请选择插入点:"); Point3d pt = ppr. ...

  4. Windows phone 8 学习笔记(5) 图块与通知

    原文:Windows phone 8 学习笔记(5) 图块与通知 基于metro风格的Windows phone 8 应用提到了图块的概念,它就是指启动菜单中的快速启动图标.一般一个应用必须有一个默认 ...

  5. Tiled Editor 图块的两种导入方式

    一.图块集图块的导入. 打开或者创建地图后,新建 新图块. 弹出新图块面板 图块类型选择 "基于图块集图块",一定要选择"嵌入地图",否则需要另存为其他类型的文 ...

  6. C# CLR via 对象内存中堆的存储【类型对象指针、同步块索引】

    最近在看书,看到了对象在内存中的存储方式. 讲到了对象存储在内存堆中,分配的空间除了类型对象的成员所需的内存量,还有额外的成员(类型对象指针. 同步块索引 ),看到这个我就有点不懂了,不知道类型对象指 ...

  7. [C#学习笔记]类型对象指针和同步块索引

    写在前面 看<CLR via C#>第四章时,看到了类型对象指针和同步块索引这两个概念,不知如何解释,查看过相关资料之后,在此记录. 类型对象指针 <CLR via C#>中的 ...

  8. 揭示同步块索引(中):如何获得对象的HashCode

    转自:http://www.cnblogs.com/yuyijq/archive/2009/08/13/1545617.html 题外话:为了尝鲜,也兴冲冲的安装了Win7,不过兴奋之余却郁闷不已,由 ...

  9. 梦想CAD控件图块COM接口知识点

    梦想CAD控件图块COM接口知识点 图块是将多个实体组合成一个整体,并给这个整体命名保存,在以后的图形编辑中图块就被视为一个实体.一个图块包括可见的实体如线.圆.圆弧以及可见或不可见的属性数据.图块的 ...

随机推荐

  1. PHP代码中出现中文乱码怎么办?

    header("Content-type:text/html;charset=utf-8"); //加上这个就OK //示例 : class WechatController ex ...

  2. Ansible学习 安装

    对于运维人员来说,自动化工具是日常工作中比不可少的.Ansible是一个很好的自动化工具. Ansible默认使用SSH协议管理机器,在管理主机上安装Ansible,管理主机和被管理主机只要安装了py ...

  3. 什么是redis缓存穿透, 缓存雪崩, 缓存击穿

    什么是redis? redis是一个非关系型数据库,相对于其他数据库而言,它的查询速度极快,且能承受的瞬时并发量非常的高.所以常常被用来存放网站的缓存,以减少主要数据库(如mysql)的服务器压力. ...

  4. 1022 D进制的A+B (20)(20 分)

    1022 D进制的A+B (20)(20 分) 输入两个非负10进制整数A和B(<=\(2^{30}-1\)),输出A+B的D (1 < D <= 10)进制数. 输入格式: 输入在 ...

  5. 动态规划:HDU1864-最大报销额(处理带小数的dp问题)

    最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Descriptio ...

  6. BFS:HDU2612-Find a way(双向BFS)

    Find a way Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. IOS开发学习笔记007-数据结构

    目录: 1.全局变量和局部变量 2.结构体 3.结构体数组 4.结构体做函数参数 5.结构体指针 6.枚举 7.总结 一.全局变量和局部变量 全局变量和局部变量的区别 1. 全局变量,再函数外定义的变 ...

  8. 基数排序(java实现)

    基数排序  就是先比较数组中元素的个位数,排序得到新的数组,然后比较新的数组中的十位数,排序得到新数组,然后再对最新得到的数组比较百位数.......依次循环 比如{82 ,31 ,29 ,71, 7 ...

  9. 【bzoj3930】[CQOI2015]选数 莫比乌斯反演+杜教筛

    题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一 ...

  10. CSU 1809 Parenthesis(RMQ-ST+思考)

    1809: Parenthesis Submit Description Bobo has a balanced parenthesis sequence P=p1 p2…pn of length n ...