实在厌倦了做了多个游戏项目之后,对常用的数学计算总是算了又忘忘了再算。与其他技术问题相比,一个解决一个数学型问题有着费时、不易调试逻辑错误、边界条件不明显有隐患、没成就感等特点。本着坑不能踩n+1次的心态,我做了这个东西——LuaMathLib。
今天的主角是LuaMathLib,一个通用可移植的纯Lua数学库。
语言层面上的特点
- 面向对象 即封装、实例化那堆术语了,目的是在任何面向对象语言中可移植
- 支持Getter/Setter 按照ECMA语法风格,对象属性可以是个函数返回值等
- 支持索引器 可以按语义方式访问Vector3.x,也可以按索引方式访问Vector3[1]
结构特点
- 核心算法移植自Unity3D和XNA,它们的稳定性是经过多年时间无数游戏的践踏而十分坚实的
- 我提供了些附加测试,对API的正常工作做个不完全的保证
- 可移植到其他语言
使用方法
你可以在CSDN上找到源码,它同时是一个可在Quick-x中运行的项目。使用这个数学库,能够快速达成很多有趣效果,下面以一个效果很棒的转盘为例说一下。
场景onEnter()函数中
self._vRot = 0
self._rot = 0
self._arrow = display.newSprite("spin/arrow.png"):scale(0.5):pos(display.cx, display.cy+5):addTo(self)
self:addNodeEventListener(cc.NODE_ENTER_FRAME_EVENT, function(dt)
self._rot = self._arrow:getRotation()
self._rot, self._vRot = Math.SmoothDamp(self._rot, 7200, self._vX, 4, 1000, dt)
self._arrow:setRotation(self._rot)
end)
self:scheduleUpdate()
效果下如图
Math.SmoothDamp()极其适合这种高加速低减速的运动,同类的应用如摄像机推拉、宠物跟随等。
参考资料
项目中不提供文档,但你可以查阅Unity文档(主)和XNA文档(辅)的数学部分,因为LuaMathLib会全部支持。
项目状态
LuaMathLib以开源形式托管在https://code.csdn.net/lolofinil/luamathlib。目前对Unity3D数学库移植程度大约在30%,已经可以在Lua代码中访问几乎所有UnityEngine.Mathf、Vector2.Mathf和Vector3.Mathf。计划内的任务包括完成Vector4、Quaternion、Matrix4x4移植、用空间矢量改善2D计算、合并XNA特有API如Vector3.Catmull等。