一、概论
起因是一位官方群的大佬不知道怎么把前端的贪吃蛇转化为iFA的贪吃蛇。
于是发现实际上虽然文档是基本完善,但是能够灵活运用大佬的毕竟还是不多,于是来水一发底层篇。
底层实际上也就是iFA所提供的JS形式API接口,这些接口是组成iFA内部功能的基本单位。
对于不同平台,iF2D所能调用的系统底层功能显然有差异,因此需要统一成同样的接口。
例如对于IBitmap.CBitmap这一构造函数,在Web端可以通过FileReader等前端API完成,
在PC端则需要利用C++实现读取、处理位图的功能,最后将一切统一成IBitmap.CBitmap的形式。
所以,底层是iFA脚本编程的起点及核心。很多时候实现许多功能不需要使用底层,
但是为了理解默认脚本的实现并灵活修改,实现包括但不限于倒影、镜子、小地图等效果,
则需要对底层有充分的掌握。
本篇的编写依据是
iF2D文档。具体来说,根据以下标准分类讨论:
获取部分 IInput, IVal, IWeb, IRWFile
显示部分 IBitmap, IBCof, ISprite, IViewport
逻辑部分 IRect, IColor, IFont
组件部分 IAnim, IParticle, IButton, ICheck, IScrollbar
其它部分 IAudio, IDll, IDllObject
二、显示部分
显示部分是iF2D最重要的部分,也是进行一定规模修改的基石。
显示部分控制了iF2D画面上包括但不限于角色、敌人、触发器、图块、背景、UI等物件的显示,
且组件部分实际上也是利用显示部分API进行扩展的结果。
1. 位图
位图可以理解为一张“图像”。该图像是以像素点为基础的点阵形成的图像。
换言之,每个像素点可以用四个八位二进制数表示,即RGBA表示法。由这些像素图构成的矩阵就是一张图片。
位图也是游戏中最常用的图像表示方法之一,相比矢量图更灵活,适合裁剪等行为。缺点是渲染速度有时比矢量图低。
例如一个单块图块可以理解成32*32或48*48的位图,而一个自动元件图块可以理解成284*288的位图(宽度乘高度)。
位图在iF2D中存储和使用的基础接口是IBitmap。这不是一个类而是一个API接口,由以下三个函数组成。
这三个函数都会返回一个Image类的实例。具体可以参见文档。
IBitmap.ABitmap(path): 读取一张以
工程根目录为基础的路径为path的位图,并返回从该位图生成的Image对象。
要点:path开头是/可能会引起未定义的行为,也就是可能被误认为绝对路径而从网站根目录/磁盘根目录寻找导致错误。
用例:IBitmap.ABitmap("Graphics/System/icon_event.png") //如文件存在且有效,返回一个IBitmap实例,如不存在返回null
IBitmap.WBitmap(path): 读取一张Web端的路径为path的位图,并返回从该位图生成的Image。
要点:由于网络方面的限制,本函数只在Web端有效,其它端同ABitmap。
用例:IBitmap.ABitmap("https://s2.ax1x.com/2019/08/01/ea5j4H.jpg") //在Web端使用,如文件存在且有效,则返回对应实例
IBitmap.CBitmap(width,height): 创建一张全新的指定宽高的空白位图,返回其Image。
要点:主要用于生成利用drawBitmap显示内容的精灵,例如地图图层的精灵是一个图块一个图块绘制的,所以需要默认空白。
用例:IBitmap.CBitmap(114,514) //生成一张恶臭位图(x)
以上ABitmap及WBitmap函数已经在默认iFA脚本中被统一成RF.LoadBitmap(path)。并且以上函数读取的位图都是一次性的。
所以,也可以使用RF.LoadCache(path),该函数对于重复的图像不会重复读取从而提高了效率,
但是要注意不能释放用这个函数读取的位图,例如使用ISprite#disposeMin而不是ISprite#dispose。
另外,上述两个RF下的函数所读取的实际路径为"Graphics/" + path,所以开头也不能出现"/"。
这一接口不提供操作位图的功能,而需要将对位图的操作在ISprite和IViewport执行,以便提高效率。
默认Image主要只需要使用到两个属性width和height,用于获取位图的尺寸从而进行动态的剪裁、位置等处理。
2. 剪裁位图
有时候我们并不希望显示一张图片的全部,而是希望动态地显示图片的局部。
这就需要使用IBCof位图剪裁对象。这一对象的构造函数为IBCof(bitmap,x,y,width,height)。
例如,已经有一个正确读取的位图bitmap,这时,可以使用new IBCof(bitmap,0,0,48,48)生成剪裁位图。
这样生成的剪裁位图的内容将是原位图以(0,0)为左上角,(47,47)为右下角的一个局部内容,宽高均为48。
IBCof可以和Image一样在大部分场景使用。