【游戏功能】
拆一行代码:
flour = flour + (millAng % 6.28 > 6.2 and 1 or 0)
磨盘转一圈,豆粉多一勺——石磨的全部产出就压在这行取模判断上:磨盘角度转过一圈的临界点,产出就加一勺。今天讲石磨的表现,看"转圈"怎么转出产出感。
一、推磨、落粉、堆山三段积累
石磨的积累三段。推磨段:推杆带动上磨盘转,磨纹跟着转、推杆跟着扫——推杆是转速的可视化:推杆扫一圈,磨盘转一圈。落粉段:磨口的豆粉簌簌落下,落粉的频率跟转速成正比——转得快落得密,转得慢落得稀,落粉就是产出的流水线。堆山段:豆粉在磨口外堆成一圈粉堆,粉堆随产出变大变高——粉堆是产出的立体账本:勺数越多堆越大,产出的积累直接堆在玩家眼前。三段的核心是"产出可见":豆粉从磨口落到地上堆成山,每一个环节都有形有色。
完整演示在这,点推磨:
fx-mill
二、幂尔框架实现:圈数取模与粉堆增长
磨盘角度的圈数判断触发产出,粉堆按勺数增长:
local Mill = {}
local KEY = { FULL = 6.28 }
local millAng, flour = 0, 0
function MI.Push()
SL:SetValue("pushing", true)
end
function MI.Tick(dt)
if SL:GetValue("pushing") then
local spd = SL:GetValue("millSpeed") or 70
millAng = millAng + spd / 100 * 3.2 * dt
SL:SetActorRotate("millstone", millAng)
-- 转满一圈: 产出一勺
if millAng >= KEY.FULL then
millAng = millAng - KEY.FULL
flour = flour + 1
SL:SetValue("flourSpoon", flour)
SL:PlaySfx("grind")
-- 磨口落粉
if math.random() < 0.5 then
SL:PlayBurst(SL:GetValue("millMouthX"),
SL:GetValue("millMouthY"), "flour_pile", 6)
end
end
-- 磨纹旋转 + 推杆联动
SL:SetFxRotate("mill_pattern", millAng)
local px = SL:GetValue("millX") + math.cos(millAng) * 66
local py = SL:GetValue("millY") + math.sin(millAng) * 66
SL:DrawLever(px, py)
end
end
function MI.FlourPile()
-- 粉堆随勺数增长: 体积可视化
SL:SetFxSize("flour_pile",
math.min(70, 10 + flour * 5),
math.min(16, 4 + flour * 1.2))
end
return MI
粉堆的体积公式上限七十像素——粉堆再大也不能漫过画面,上限是视觉的边界也是产出的上限。
三、磨纹旋转与推杆的联动
磨纹跟着磨盘转是"实感"的关键:磨纹不转磨盘就是贴图,磨纹转了磨盘才是活的。推杆的联动是第二层实感:推杆一端拴在磨盘边缘、另一端是人手握的木把——推杆跟着磨盘转,人手的轨迹就是一个圆——圆的轨迹是"推磨"的物理直觉。豆粉落下的频率和转速成正比:转得快落得密,转速表就是产出表。最后,磨盘的配色走石头的本色:深灰的底盘、浅灰的上盘、中间一圈磨纹——石头色系的专注让石磨看起来沉、稳、有分量,产出的豆粉是整幅画面里唯一的暖色。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 两只精英站在一起,你先砍谁?砍血厚的,薄的在旁边白拍你;砍血薄的,厚的一刀送你回城——这道选择题在大多数战斗里…
【游戏功能】 荡魂波的全机制就一句话:怪物张口吐出一圈波纹,环带贴着地往外跑,扫过谁就把谁往外推半屏——不控血不减防,它只控…
【游戏功能】 一次压测里翻到一笔对不上的账:大怪的血线明明已经压到三成,十几秒后却又悄悄爬回了八成——治疗流水里查无此人,增…
【游戏功能】 测试组半夜报了一口"事故":打甲壳怪的战斗里,同一个普攻一会儿飘十四一会儿飘二十,伤害数字忽大忽小,怀疑扣血的…
【游戏功能】 dmg = math.round(dmg 0.7) ——一行七折的乘法,写尽了雷链诀全部的脾气:雷不会只劈一个…
【游戏功能】 毒圈该怎么画?很多新手第一笔就是"绿雾一罩、站在里面扣血"——这么写出来的毒沼是死的:圈从落地到消失一个模样,…