下载 App
10/16案例分享
【案例分享】改了八版都不对:nvgRadialGradient 的 inner/outer 参数根本不生效
一句话结论
本引擎的 nvgRadialGradient 会忽略你传进去的 inner / outer 参数,径向渐变的边界固定在引擎自己的默认值上(约 0.35 × min(W,H))。你改那两个参数,画面不会有任何变化 —— 而且不会有任何报错。
现象
我想做「动量驱动的氛围灯」:中心干净、越往外越有色,半径随速度变大。
写法:
local pt = nvgRadialGradient(vg, cx, cy, inner, outer,
nvgRGBA(255,200,90, 0), -- 中心:全透明
nvgRGBA(255,200,90,60)) -- 边缘:半透明
nvgFillPaint(vg, pt)
nvgFill(vg)
其中 inner = 0.70 × hd、outer = 1.00 × hd(hd = 半对角线,随动量变化)。
结果:不管怎么调,永远是一块「中心是背景色、外圈是实色」的硬边圆盘,半径看着像固定的,跟动量完全无关。前七版都在调那两个参数和颜色,全都没用。
怎么确认(关键是别靠眼睛)
用径向亮度剖面:从中心向外按半径采样,取每个半径环上像素亮度的中位数。
# 伪代码:沿半径采样中位亮度
for r in range(0, 720, 20):
px = sample_circle(img, cx, cy, r) # 该半径环上的像素
print(r, median_brightness(px))
两张不同动量的截图,剖面完全重合:
半径 0 ~ 240 中位亮度 15 <- 恰好是背景色 nvgRGBA(11,15,26) 的亮度
半径 260 ~ 720 中位亮度 63/90 <- 氛围灯色
边界固定在半径 ≈ 250,而我代码里传的 inner 换算过去是 514。
250 ≈ 0.35 × min(W,H) = 0.35 × 720 = 252 —— 这正是引擎自己的默认值。
所以传进去的两个参数被丢掉了。
修法:手绘描边同心圆环
半径完全由代码控制:
local RINGS = 40
for i = 1, RINGS do
local t = i / RINGS -- 0 .. 1
local r = maxR * t
local a = math.floor(alpha_max * t * t) -- alpha 按半径平方递增
nvgBeginPath(vg)
nvgCircle(vg, cx, cy, r)
nvgStrokeWidth(vg, maxR / RINGS + 1) -- 注意:描边,不是填充
nvgStrokeColor(vg, nvgRGBA(r_, g_, b_, a))
nvgStroke(vg)
end
为什么必须用「描边环」而不是「填充同心圆」
填充圆会累加 alpha。N 个同心填充圆叠起来,中心点被覆盖 N 次,中心最亮,与「中心干净、边缘有色」正好相反。这个坑我第一版就踩了。
描边环每个半径只描一次,alpha 才是「你写多少就是多少」。
代价
40 个描边环在 1080p 下实测无感。想更省可以降到 20 环 + 加大 stroke width,但环数太少会出现可见色带(banding)。
什么场景适合用这套手绘环
适合的:
- 半径需要由代码精确控制(跟随速度、血量、进度变化)
- 需要「中心干净、边缘有色」这种反向着色
- 层数固定、形状简单(同心圆)
不适合的:
任意形状的渐变:描边环只能画圆,要等引擎级 shader
需要真实高斯衰减:环状叠加是离散逼近,边界会有台阶感,该用后处理 blur
环数需求很大(几百环):draw call 线性增长,改用 shader
只是画个普通渐变圆、半径不需要变:引擎默认值本来就够用,直接用 nvgRadialGradient
关键判断:nvgRadialGradient 的参数被忽略这件事,只有在你需要控制半径的时候才是问题。如果你的渐变半径本来就是固定的,那用引擎自带函数就行,别绕这一圈。
另一个边界:这套方案是从外向内由亮到暗的。如果你的需求是「中心亮、边缘暗」(更常见的发光效果),那用 nvgRadialGradient 的默认行为反而更省事。
可迁移的经验
看到「改了参数画面不动」,不要继续调参数 —— 先验参数有没有被消费。
径向亮度剖面是最省事的验法:它把「我以为我改了」变成一条数轴上的读数。这个验法不只对渐变色有用,任何「按距离衰减」的效果(光照、雾、描边衰减)都可以用它来判「公式生效了没」。
00:11
【个人案例分享】动态注册事件与创建触发器截图
【个人案例分享】动态注册事件与创建触发器
废话阶段: 一般我们刚接触星火的时候,使用触发编辑器里的触发器都是直接通过新建触发器来创建,然后往里面添加预先设置好的事件。 虽然能做出游戏,但这样子的触发器是全局的,后面想添加新的玩法或者内容可能会因为之前的全局触发器导致影响后面的新玩法或者内容。可能会有人想到用打开/关闭触发器或者移除触发器来控制,但这样子仍然不是很方便,所以有没有什么方法可以让某个触发器在必要的时候出现,不必要的时候不在。所
16 赞
3 回复
星火编辑器-新手教程-关于多游戏模式的配置和触发的获取截图
星火编辑器-新手教程-关于多游戏模式的配置和触发的获取
HELLO 大家好,我是阿木木牧。最近第一版的内部小范围(几人)第一个图的测试已经结束了。 整体游戏以装备数值的崩坏而告终~ (虽然大家都很欢快。。。) 现在准备开始开发下个阶段的内容啦,就是将游戏模式拆分出来。分成单人模式,多人组队模式(合作PVE),多人匹配模式(对抗模式)。那么,怎么配置呢?说来也很简单哈~ 1,在游戏编辑器中,数据编辑器,找到地图设置。 2,编辑地图设置。比如我希望最大数量
14 赞
3 回复
00:19
如何实现单位的随意拖拽摆放?【星火编辑器教程】截图
如何实现单位的随意拖拽摆放?【星火编辑器教程】
很多小伙伴想做自走棋类的游戏,那么就会涉及到单位的一个最基础的操作,就是选中单位并拖拽和摆放,那如何实现单位的拖拽摆放呢,今天就来教大家如何实现这样的功能。实现效果如下视频所示。 教程开始 第一步: 打开编辑器的触发编辑器,新建一个文件夹(我就叫“拖拽功能”,方便对拖拽功能的逻辑进行归类,如果你不建文件夹也没关系,习惯而已) 第二步: 点击文件夹右边的+号,添加一个变量,我这里叫“变量_目前选中的
19 赞
12 回复
无须申请,星火编辑器现已公测开放下载截图
无须申请,星火编辑器现已公测开放下载
—————————————————— 各位关注星火编辑器的小伙伴: 感谢大家一直以来对编辑器支持! 破晓已去,曙光降临! 星火编辑器现已开启公测! · 关于下载和资格申请 现已无需申请,请去下面的官方首页直接下载! 缘起测试是星火编辑器自诞生以来第一次对外测试! 从2022年八月开始到十一月,历时三个月。 缘起之后缘聚测试,历时又七个月! 缘聚之后,破晓降临,历时又十二个月! 曾经微弱的星火现已渐
官方
331 赞
375 回复