与LuaSTG相识的两年或二十天

笔者的这篇文章,或者说随笔,将以轻松的语调讲述这两年结识LuaSTG的过程,以及这二十天集中学习LuaSTG的成果。其中或许也会穿插一些“教程”(毕竟不成系统。或许以后会像无耳大佬一样发布系统性的教程……Coming s∞n)。希望让零基础的人也能看懂LuaSTG的基本用法。

↓由此往下,直到两年前,高二

毛玉什么是LuaSTG

官网上的描述如下:LuaSTG是一个基于C/C++开发、采用Lua作为脚本语言的弹幕射击游戏引擎。那么肯定又有园友要问了,什么是弹幕射击游戏呢?通俗来讲,弹幕射击游戏在亚洲范围内一般认为等同于2D平面射击游戏,因其中敌我双方的子弹在屏幕上停留的时间较长且密度很高形成“幕状”而得名。其中又以东方Project系列最为典型。

总而言之,LuaSTG的主要作用就是——写弹幕!
这是LuaSTG目前的LOGO:毛玉→毛玉

毛玉我与LuaSTG的相识

那是2023年暑假,我在家中打开了《東方冰魇华~Saintlike Icy Blossom》(游戏作者:地上污秽之土),殊不知这就是我与LuaSTG的最初见面。当时的内心os大致如下:
“诶,这个logo很有喜感嘛。”(当时并不知道这个是毛玉)
“开头这几个窗口的切换很迷啊。”(↓现在已经是古董UI了)
image
“哎我天这游戏怎么这么难。”
关掉游戏,休息。
我与LuaSTG的初次相识,结束了。

随后是10月份,由于家中的一些变故,请了3天的假,回了趟家。这期间加了LuaSTG的QQ群,并下载了引擎,编辑器和一些教程,但并没有写出什么东西。值得一提的是,高二这一年,我完成了我的东方二次同人设定集《东方镜湖月~The Condition of Mirror on Mountain Summit》初版的大部分内容,然后归于沉寂。我在群里也潜水了。毕竟——河北的高中嘛,课业繁忙。但我一直没有忘记这个企划,在当时计划高考后开始系统性学习LuaSTG,并开始游戏化。

毛玉进一步发展——开始着手制作弹幕

暑假——开学——军训——国庆回来,我想想这4个月玩得太多了,惭愧啊……于是在10月9号,重新下了引擎和编辑器(毕竟换电脑了,LuaSTG也更新了),并开始制作弹幕。
此外,我还修改了我的设定集的近一半角色,并更换了副标题。现在的名字是《东方镜湖月~Phantasy Boundary of Mirror》。主标题名字取自李白《梦游天姥吟留别》。其中的内容大概会在下一篇文章中讲述。
↓这是我保存的第一个工程,约等于啥也没有。其中符卡名字是两年前定好的,1面道中1符的名字。至今未做改动。
image
第二和第三个工程报错了,懒得修,直接放第一个成型的工程吧。
image
↓运行起来是这样滴
AEE7A8ADBEE4544DA4BC6813C7F0F906
吓唬STG萌新专用,实际上全是偶数狙,站在原地啥事没有。

当时用子弹组纯粹是萌新行为,现在也不用了,主要靠嵌套循环来实现。

接下来讲述脚本中各个节点的含义。希望我没有讲错……
image这里是放素材的,比如自定义子弹的贴图。
image这是脚本的主体。
image如果你创建了一张空符卡,你将在Classes节点下见到以下内容。从上到下依次是:

  • 定义Boss
    • 在对象创建阶段的回调函数
    • 创建符卡,直引号内为符卡名
      • 开始前的task(可以理解为线程(实际上是协程))
      • 开始的回调函数
        • 创建task,里面就是BOSS和弹幕行为逻辑的主体
          • 在60帧内移动到(0,120)这个位置,移动对象是BOSS
      • 结束前的task
      • 结束的回调函数
      • 结束后的task

然后讲一讲“创建task”里的节点。
先以“麻将山”为例。
image这是创建一个循环。循环次数为无限。
image这是下一级的循环。循环次数是10。a为一个参数。ran:Float(0,360)的意思是从0到360(开还是闭忘了)内任选一个浮点数角度。increment表示这个参数每循环一次后的增长量。在这里面increment和同一级的循环次数相乘如果为360的倍数的话,子弹是均匀分布的。(不建议使用720等大倍数,如果参数没调好的话子弹是展不开的,很容易obj爆炸……(至于obj是什么,以后再讲))

子弹组基本没啥人用,先不讲了。下面放一个已经基本定稿的符卡:1面道中2符
AA40BE795D3DA0428A76EE019AE3C83A
子弹都是围绕自机展开的,非常神奇对吧,接下来展示部分代码:
image
这是雪花部分的节点。(变量命名非常随便,瑟瑟发抖……)

  • 创建task
    • 循环节点,次数为无限。其中有3个变量b,c,d。运行逻辑是执行一次这个循环后,变量b增加0.25,变量c增加4,依次类推。
      • 这是子循环节点,重复次数为6,其中变量a的作用是保证一波雪花的“夹角”是60度。
        • 等待2帧。
        • 创建自定义obj,此处obj的类型为子弹。子弹类型为雪花(自己画的)。
          player.x+80*sin(d),player.y+80*cos(d)的意思是,子弹生成坐标是自机位置+80倍的sin d,自机位置+80倍的cos d,单位是像素。这样就能画一个圆出来。值得一提的是,LuaSTG的版面为-192 ~ 192,-224 ~ 224像素。版面中心为(0,0)。
          • 速度节点,用于设置速度的各种参数。此处的速度为1.3,单位是px/f(像素/帧)。后边的angle为速度角。以水平像右为0度,向上逆时针为正,向下顺时针为负,各180度。有点类似于极坐标。
            设置自传速度,单位为度/帧。

半图形化编程大大加快了理解速度。这个task可以基本理解为,重复无限次循环,每次循环里再重复6次循环,每次循环发射一个子弹,子弹的发射角一次改变60度加一点小角度。这6个子弹为一组,发射位置一次改变……我也不知道是多少,反正是绕着自机转。
(↑再次提醒,以上内容并不是系统化的教程)
然后,10月26日,我参加了第一次lstg群周末活。BV1riszztEiR←从28秒开始看。弹设有点单调……
总之,这20天,我的LuaSTG技术突飞猛进。从啥也不会,到能搓出像样的弹幕,只需要20天。这些天我甚至学会了添加立绘和对话、修改内置UI。
3E67C6188F0287438E36D1949430F306
↑设计的3面BOSS某张符卡敬上。

毛玉最后想说的

如果你自己想做一件事,那就大胆去做。只要认真去做,总会有收获的。——凌镜icecraft

目前,我正着手于资源贴图和自机行走图的绘制以及自机代码的编写。此篇文章,标志着《东方镜湖月~Phantasy Boundary of Mirror》的游戏化进程正式开始。

posted @ 2025-10-30 15:58  凌镜icecraft  阅读(5)  评论(0)    收藏  举报