【游戏功能】
古琴的弦不会说话,但拨一下就有情绪——七根弦七种音高,按谱连弹就是一支曲子。今天拆弹古琴的表现,看"按谱弹弦"的玩法怎么做出余音绕梁的文人气。
一、看谱、拨弦、成曲三段循环
弹古琴的循环三段。看谱段:谱面要求的弦以绿光高亮提示——绿线横贯琴面,弹哪根一目了然,文人的琴不考眼力。拨弦段:点弹绿光弦,弦身震颤出可见的波形——弦震是古琴的灵魂表现:弦被拨动的瞬间以正弦波振动、振幅两秒内衰减归零,震颤的视觉就是"音"的形状。成曲段:五音连对后"五音成曲"定格、音符符号从弦上飘出——音符是弹对的勋章,五枚音符飘完一轮重开。三段的反馈密度极高:每次拨弦都有弦震、音符、音效三重反馈——古琴的玩法不在复杂在反馈,拨一下响一下,响得有形有声。
完整演示在这,按谱弹下一音:
fx-guqin
二、幂尔框架实现:弦震波形与谱面提示
弦震用正弦振幅衰减渲染,谱面高亮要弹的弦:
local Guqin = {}
local KEY = { STRINGS = 7, GOAL = 5 }
local melody, idx = {}, 1
local vib = {}
function GQ.NewScore()
melody = {}
for i = 1, KEY.GOAL do
melody[i] = math.random(0, KEY.STRINGS - 1)
end
idx = 1
end
function GQ.Pluck(s)
vib[s] = 1
SL:PlayBurst(SL:GetValue("stringX", s),
SL:GetValue("stringY", s), "note_dust", 5)
if melody[idx] == s then
-- 弹对了: 音符上飘
SL:ShowHitNum("player", idx, "note_" .. s)
SL:PlaySfx("qin_" .. s)
idx = idx + 1
if idx > KEY.GOAL then
SL:PlayFxAt("qin_finish")
SL:ShowSystemTips("五音成曲! 余音绕梁")
SL:ScheduleOnce(function()
GQ.NewScore()
end, 2)
end
end
end
function GQ.Render(dt)
for s = 0, KEY.STRINGS - 1 do
local y = SL:GetValue("stringY", s)
local amp = (vib[s] or 0) * math.sin(SL:GetValue("engineTime") * 40 + s) * 4
SL:DrawStringWave(s, y, amp)
if (vib[s] or 0) > 0 then
vib[s] = math.max(0, vib[s] - dt * 2)
end
end
-- 谱面提示: 当前要弹的弦绿光横贯
if idx <= KEY.GOAL then
SL:DrawStringWave(melody[idx], SL:GetValue("stringY", melody[idx]), 0,
{ color = "green_guide" })
end
end
return GQ
弦震的振幅乘以剩余能量逐帧衰减——震颤从烈到微的曲线就是余音的形状。
三、弦距手感与绿光的边界
七根弦的间距是点击手感的底盘:弦距小于三十像素会误触邻弦,大于六十像素拨弦的手要跨太大——五十像素上下是"指哪弹哪"的甜点。绿光提示的边界要诚实:提示线只在谱面要求的弦上,邻弦不沾光——绿光的位置就是答案的位置,提示的精度等于玩法的公平。弦震的衰减速度两秒归零:震两秒的弦像还在唱歌,震半秒的弦像被按住了——古琴的余韵是它的身份,衰减太快就不是古琴。最后,音符的飘出方向朝上偏弦位外侧——音符从弦上生出来往上飞,飞的方向带着弦的位置记忆,玩家的眼睛顺着音符就能复盘刚才弹了哪根。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 围住一只怪的贪心人人都有:三面堵死一只不漏——可围三阙一的规矩偏偏唱反调:围三面留一口,怪只会往那口里钻——口…
【游戏功能】 元素搭配的老话是水火不容,可战场上的说法得倒过来念:水是雷的引信。引水的机制是一场两步的合谋:先泼一瓢水把地泼…
【游戏功能】 低血大怪的回血机制人人见过,可血珠的回血藏着一手"要你去抢"的心机:它每掉两成血就吐一颗血珠在地上,两秒内不踩…
【游戏功能】 隐形怪人人都遇到过,可现身的机制比隐形狠:它钻进影子里消失,一秒后从你脚下画的影圈里钻出来,背刺三十四点——影…
【游戏功能】 有人纳闷:大怪危机预警里最气人的一档是什么?不是它放大招,是它开阵——法阵一转,转满三秒蹦出两只小狼,好好的单…
【游戏功能】 if chg <= 0.8 then lock = true ——一行把"锁定"写进蓄力里的判定,道破了蓄力炮…