Skip to content
Xrysnow edited this page Dec 18, 2020 · 1 revision

LuaSTG-x是什么?

LuaSTG-x是基于cocos2d-xLuaSTGPlus(er+1.02)开发的STG引擎,以跨平台、高效率、丰富功能为目标。

关于兼容性

LuaSTG-x提供了LuaSTGPlus所提供的所有C接口,大多数接口能够实现相同的功能和特性。Lua脚本(THlib)部分来自er+1.02,做了一些调整。除自定义shader外,对于MOD的兼容性与er+1.02基本相同。区别之处见【接口变化】一节。

关于C++部分

主体为cocos2d-x(版本4.0),部分代码来自LuaSTGPlus、fancy2D。

主要特点:

  • 基于OpenAL-soft的跨平台音频引擎,支持wav/flac/ogg/mp3格式的解码,支持从内存或文件播放,支持无缝循环播放,支持OpenAL效果。
  • 基于FFmpeg的跨平台视频播放支持,目前支持基本的播放功能。
  • 集成Cocos Creator支持。能够加载Cocos Creator制作的场景文件。
  • 3D模型支持(来自cocos)。模型要求:http://www.cocoachina.com/bbs/read.php?tid-236693.html 。实测简单的MMD模型经过转换后可以正常显示。
  • 强大的粒子系统(来自cocos)。网页版编辑器:http://www.effecthub.com/particle2dx
  • 完整的Live2D支持(来自Cubism 4 SDK)。
  • 完整的ImGui集成。
  • 桌面平台提供console,在Lua中使用print函数会输出到console。
  • 桌面平台可以在运行时修改窗口大小,切换全屏/窗口模式。
  • 提供动态分辨率切换功能。

其他功能:

  • 支持渲染Latex文档
  • 支持渲染svg图像
  • 移植了Lua5.3的utf8
  • 支持zip文件的创建和读写
  • 支持MSAA
  • 桌面平台支持透明窗体
  • 支持多种碰撞体形状

关于Lua部分

Lua API手册:https://xrysnow.github.io/lstgx_Doc

THlib API手册:https://xrysnow.github.io/lstgx_THlib

  • THlib的大部分代码来自er+1.02。
  • plus模块等原有代码做了一定修改,core.lua做了拆分,THlib微调,增加了大量辅助开发的代码(在srcdata/x下)。
  • data和MOD既可以从zip文件加载也可以从本地文件加载(见src/core/loading.lua)。
  • 增加插件系统,自动加载plugin文件夹下的脚本(见src/core/loading.lua)。插件管理功能尚未开发,预计在未来版本添加。
  • lstg.world通过元表来更改SetViewMode所设置的参数,请勿修改其元表。(见src/core/view.lua
  • 安卓版提供提供了一些系统原生接口(见src/platform/android/native.lua)。
  • 提供i18n功能,可以根据语言设置替换字符串。

游戏内调试工具

游戏内调试工具目前仅在桌面平台可用,提供多种实用功能。

  • 游戏信息窗口

    • 游戏资源:可以查看已加载的游戏资源,可以预览图像和动画资源。
    • THlib信息:可以查看自机,replay,符卡,关卡等信息。
    • 性能:可以查看一些性能信息的实时曲线。
  • 日志窗口

    • 可以查看已写出和打印的日志。
  • 控制台窗口

    • 可以输入lua语句并显示结果。
  • 监视窗口

    • 可以添加要监视的变量或语句的返回值。
  • 设置窗口

    • 可以设置全局字体缩放和主题。

引擎特性介绍

游戏对象

  • img属性除原有功能外,还可设置为可绑定的资源对象或nil,设置为nil时会释放相应资源。img属性可以设置字体资源和纹理资源。
  • rect属性除原有功能外,还可设置为下表中的字符串或数字,以设置对应的判定形状。
字符串值 数字值 形状 a,b,rot的意义
‘circle’ 0 a表示圆的半径
‘obb’ 1 矩形 a,b表示半宽/半高
‘ellipse’ 2 椭圆 a,b表示半轴长
‘diamond’ 3 菱形 a,b表示半对角线长度
‘triangle’ 4 等腰三角形 a,b表示高/底的一半
‘point’ 5

注意rot属性总是表示a轴的方向。

  • 增加了额外属性:res, rc, rm, color, A, R, G, B, light,需要使用xclass定义类来启用。
  • 增加了额外属性:z, dz, vz, az, zscale, quat,需要使用xclass定义类并继承object3d来启用。
  • res属性:返回绑定的资源对象。赋值时与img属性相同。
  • rc属性:只读,绑定字体/粒子/纹理资源时返回一个对象,该对象从属于游戏对象。
    • 绑定字体资源时,res属性返回cocos::Label对象,通过self.res:setString()设置字符串,文档见doc/cocos/cc_2d/Label.lua。
    • 绑定粒子资源时,res属性返回粒子池对象,可以读写其参数,文档见doc/lstg/particle_pool.lua。
    • 绑定纹理资源时,res属性返回顶点数据指针,指向一个cocos::V3F_C4B_T2F数组,文档见doc/cocos/lua.lua。注意该指针没有越界保护。只读。
  • color属性:设置默认渲染的混合颜色,设置后不再使用绑定资源提供的默认混合颜色。返回颜色对象。可设置颜色对象。
  • A, R, G, B属性:读写color属性的a, r, g, b分量。返回数值。可设置数值。
  • rm属性:设置默认渲染时使用的渲染模式。可设置RenderMode对象或对应名字。
  • light属性:
  • 设置数字时,会将游戏对象的光照标志设置为该值,默认值为0。
  • 设置cocos::BaseLight对象时,游戏对象会持有该对象并成为光源。当某一游戏对象的光照标志与光源的光照标志做与运算不为0时,则计算光照并设置该游戏对象使用的着色器中的变量。光源的默认光照标志为1,需通过cocos对象的方法设置。可参考此处
  • 若已设置光源,返回cocos对象,类型与设置时相同。若已设置光照标志,返回光照标志的值。若均设置则返回前者。若均未设置返回nil。
  • 引擎提供了基于法线贴图的光照着色器,将rm属性设置为'lstg.light'即可使用。
  • z, dz, vz, az, zscale属性:读写z轴方向上的变换属性。返回数值。可设置数值(dz为只读)。
  • quat属性:设置四元数以实现3D旋转。若不含w分量,则根据x, y, z分量设置旋转轴,以rot属性为旋转角度;否则根据x, y, z, w分量设置旋转并更新rot属性。不要求归一化。返回包含4个分量的表。可设置包含4个或3个分量的表。

资源对象

  • 所有内置资源都添加了lua绑定,更加简洁高效,文档见doc/x。加载资源时会返回资源对象。

渲染模式

  • LuaSTG-x使用渲染模式RenderMode来定义游戏对象的渲染方式,接口见doc/x/RenderMode.lua。内置的渲染模式由lua代码创建,自定义的渲染模式也可以方便地创建。
  • 渲染模式由着色器对象(顶点着色器+像素着色器),混合系数混合操作组成。
  • 自定义的渲染模式可以使用CreateRenderMode函数创建。
  • 对于接受渲染模式参数的接口,可以传入渲染模式对象或其名称。

曲线激光

  • 重写了曲线激光的底层实现并导出接口至lua,提供更多功能,可以使用原有的BentLaserData函数创建。

  • 接口文档:doc/x/GameObjectBentLaser.lua。

  • 主要功能:双向伸缩,修改/获取每个节点的位置/宽度/颜色,限制节点个数或总长度,严格碰撞检测,逐节点着色,以纹理或图像精灵渲染。

  • 修改/获取节点属性时,支持正向(从1开始)和反向(从-1开始)索引,分别表示从头部/尾部起的索引位置。

  • 当从头部/尾部添加节点时,若添加后超过节点个数限制或总长度限制,会从另一侧移除节点直到满足限制。节点个数限制的最大值为512。

  • 渲染函数提供1个重载,当传入图像精灵对象时,会根据其状态设置渲染时使用的渲染模式和颜色。

    渲染函数
    render(sprite)
    render(texture, renderMode, color, tex_left, tex_top, tex_width, tex_height)
  • 渲染时的着色方式由2个参数控制:着色模式和着色混合模式。它们控制了渲染时如何根据渲染函数传入的颜色和节点的颜色来决定渲染颜色,可以通过setColorMode函数设置,默认值均为0。

    着色模式 参数值 说明
    Normal 0 使用传入颜色着色,忽略节点颜色
    Node 1 使用节点颜色逐段着色,无颜色过渡
    NodeSmooth 2 使用节点颜色逐段着色,有颜色过渡
    着色混合模式 参数值 说明
    None 0 使用传入颜色,忽略节点颜色
    Multi 1 节点颜色与传入颜色相乘
    Add 2 节点颜色与传入颜色相加
  • 碰撞检测功能由3个函数提供,每个函数有1个重载。当传入游戏对象时,会根据游戏对象的属性做碰撞检测;当传入坐标时,会与该点做碰撞检测。前者更精确,后者速度更快。collisionCheck将曲线激光的每个节点视为圆形碰撞体,圆的半径是节点宽度的一半;collisionCheckExtendWidth与前者类似,只是使圆的半径增加extend的值;strictCollisionCheck则将每个节点视为(延伸到下一节点的)矩形,判定更严格,但速度慢很多。

    碰撞检测函数
    collisionCheck(GameObject)
    collisionCheck(x, y)
    collisionCheckExtendWidth(GameObject, extend)
    collisionCheckExtendWidth(x, y, extend)
    strictCollisionCheck(GameObject)
    strictCollisionCheck(x, y)

随机数发生器

函数 说明
整数方法
range(start) 同below
range(start, stop, step = 1) [start, stop),步长step的随机整数
below(start) [0, start)的随机整数
实数方法
uniform(a, b) 均匀分布
triangular() 三角形分布
triangular(low, high)
triangular(low, high, mode)
normal(mu, sigma) 正态分布
log_norml(mu, sigma) 对数正态分布
expo(lambda) 指数分布
vonMises(mu, kappa) 冯·米塞斯分布
gamma(alpha, beta) 伽玛分布
gauss(mu, sigma) 同normal,但算法不同,速度更快
beta(alpha, beta) 贝塔分布
pareto(alpha) 帕累托分布
weibull(alpha, beta) 韦伯分布

Live2D支持

  • 接口文档:doc/x/l2d_Model.lua。
  • 主要功能:播放动作,设置点击/拖拽回调(lua函数),设置点击/拖拽参数,设置物理参数/模型参数/显示颜色。

日志系统

  • 接口文档:doc/x/LogSystem.lua。
  • 主要功能:获取/修改日志路径,写入字符串,设置引擎内日志显示到console的级别。

简易计时器

  • 增加简易计时器。可以获取引擎内部的计时,也可以在lua中创建和使用,每个计时器能够保存60次计时的值。接口见doc/lstg/profiler.lua。

快速重启

  • 快速重启功能:清空对象池,不清空资源池,重新加载所有脚本。默认快捷键为Ctrl+R。

手柄输入

  • 手柄输入已成为完整功能。理论上支持所有平台。