haXe学习笔记:关于NME中的drawTiles方法

来源:互联网 发布:如何正确对待网络暴力 编辑:程序博客网 时间:2024/05/21 09:16

这两天修复了NME中flash版本drawTiles方法的几个bug,还把颜色变换功能补上了,NME的老大已经把我的补丁集成到NME的subversion中了,特此写一篇来记录一下。

Tilesheet类和drawTiles方法是NME中的独有的东西,在flash的API中是没有的。

drawTiles方法的特点是:

* 可以一次性批量绘制一张图片的多个矩形区域(所谓Tile)到目标Graphics

* 支持任意角度旋转

* 支持任意比例放缩,

* 支持颜色变换,即red, green, blue, alpha四个通道可以分别变化

非常强大的API,再加上速度无敌,基本上用NME开发2D游戏就指着这个API活了……

缺点如下:

* 一次API调用的所有Tiles必须来源于同一个BitmapData对象。有时候比如我的精灵的帧来源于不同图片(比如,在内存中创建一张做过变换的图,来实现某些特效),就得多次调用了

* 任意角度旋转是很牛,可惜不支持图片翻转(水平和垂直),可你的精灵总不能不转身吧?这里需要自己搞定,我的办法就是在内存中动态创建一张水平翻转的图片,因为前面一个缺点,再把翻转的图片和原图片合并成一张大图。你问我那垂直翻转咋办啊?水平翻转后再旋转180度就是啦!想不明白的自己拿本书比划去!

* 任意比例放缩是很牛,但只有一个scale因子,也就是长宽比是不能变化的,这点我忍不住要吐槽了,看了看实现的源码,长宽分别变化完全没有难度嘛,就是加个参数的问题,也不影响性能啊

* 颜色变换相当于flash中的flash.geom.ColorTransform,但是和前面一个问题类似,只支持颜色按比例变化,也就是ColorTransform.xxxMultiplier,而不支持ColorTransform.xxxOffset,干吗不整全呢,否则不是更加强大?比如绘制底片效果等等

 

NME中最初只提供了drawTiles在cpp/neko目标的实现,是NME中绘制二维图片的最快方法,因为它是基于OpenGL和硬件加速的。其基本原理是把每个矩形分解成两个三角形,然后用OpenGL的纹理映射来绘制。

不过那时候没有flash的实现,搞的你要想写个跨目标的游戏,就费老鼻子劲了。大概去年底今年初的时候,终于有大牛写了drawTiles的flash版本,刚看到的时候可把我兴奋坏了,要不我的游戏引擎中就得自己解决平台差异,那太费劲了。

不过随着我用才发现,flash版本的实现其实还非常粗糙,随便试了试就发现一堆问题:

* 旋转会导致图形变形

* 不做任何变换的话,Tile的绘制位置错误,总是以左上角为坐标原点

* 尚不支持颜色变化,这点也很郁闷啊,你想想,透明度变化那是很常见的需求啊!

眼看着大牛们都出去过圣诞新年乐不思蜀,这bug也没人改,只好自己动手丰衣足食了,花了一天时间,三个问题都搞定了,嘿嘿,小小的得意一下。

说一下flash版drawTiles的原理,其实和cpp版算法类似,也是使用flash中的新API Graphics.drawTriangles来批量做2D图像的映射,但如果没有任何变换(大小、角度、颜色),则使用Graphics.drawRect。

但drawTriangle有个问题,没法带入ColorTransform,所以原作者没有实现颜色变化。我的方案是,为需要做颜色变换的每个Tile在内存中用BitmapData.copyPixels创建一个copy, 然后对这个copy应用ColorTransform。虽然内存和性能开销比较大,但是现在大家的PC配置都牛了,应该问题不大吧,哈哈。

原创粉丝点击