【游戏功能】
一、一个刮不动的涂层
刮刮乐活动的首版测试报告很委屈:"刮片做出来了,玩家说刮不动。"技术上涂层是一张贴图,手指划过用橡皮擦擦除——但橡皮擦的半径只有八像素,玩家划十下才刮开一小角,刮的快感全无。刮刮乐玩法的命门不是奖品,是刮的手感:笔刷要大、响应要跟手、进度要实时、刮到六成自动全清。四个参数配平了,刮垃圾奖励都刮得上瘾。
二、机制原理:离屏涂层与destination-out
刮片的实现是双层结构:底层画奖品,上层画银色涂层,两层都用画布绘制。手指划过时在上层使用destination-out混合模式擦除——擦除处像素变透明,露出底层的奖。刮开进度通过抽样统计透明像素占比,超过阈值自动全清。进度统计用抽样而非全像素遍历:每十个像素取一个,计算量降九成,百分比精度足够活动使用。
fx-scratch
三、正确写法:刮层与进度(幂尔版)
local ScratchCard = {}
local CONST = { MSG_ID = 12220, KEY = "ScratchCard", AUTO_CLEAR = 60 }
function ScratchCard.OnCardShown(cardID)
ScratchCard._card = cardID
ScratchCard._cleared = 0
-- 幂尔接线: 触摸事件挂GUI层画布
GUI:RegisterCanvasTouch(cardID, function(phase, x, y)
if phase == "move" then ScratchCard:Scratch(x, y) end
end)
end
function ScratchCard:Scratch(x, y)
-- 橡皮擦: destination-out 挖掉涂层
self._canvas:EraseCircle(x, y, self._brush)
self._acc = (self._acc or 0) + 1
if self._acc % 10 == 0 then -- 每10次擦除统计一次进度
self._cleared = self._canvas:SampleAlphaRatio()
if self._cleared >= CONST.AUTO_CLEAR then
self._canvas:ClearAll()
self:Submit() -- 全清即结算
end
end
end
function ScratchCard:Submit()
SL:SendLuaNetMsg(CONST.MSG_ID, 0, 0, 0,
SL:JsonEncode({ key = CONST.KEY, card = self._card }))
SL:ShowSystemTips("刮完了!")
end
SL:RegisterLuaNetMsg(CONST.MSG_ID, function(_, p1, p2, p3, msgData)
local d = SL:JsonDecode(msgData)
if d.key ~= CONST.KEY then return end
SL:ShowSystemTips("获得: " .. d.reward)
end)
return ScratchCard
四、四个必须钉死的细节
五、心法:触控玩法的响应就是一切
刮刮乐、切水果、涂鸦解谜,这一族触控玩法的共同命门是指尖响应的即时性:手指到哪,画面变化立刻跟到哪。延迟零点一秒,玩法的娱乐性直接归零。工程上保证响应的三个抓手:触摸回调直接改画面状态(不走逻辑层中转)、擦除用混合模式而非像素重绘、进度统计抽样化。指尖即所得,是触控玩法的宪法。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 一刀才二十,凭什么说它是好技能?放血的账要等五秒后才看得全:刀口一开,血自己往外淌,五口小额慢扣,总账远超那一…
【游戏功能】 从它头顶翻过去,落地的哪一秒最疼?答案是它转过身来之前的那半秒。燕返的全套设计都围着这半秒转:起跳掠过头顶、落…
【游戏功能】 移速快两成有什么用?打不到人的时候才知道。疾行术是这批技能里数值最朴素的一个——没有伤害、没有控制,就一条移速…
【游戏功能】 太极阵的骨架就这一行:在地上画一个会转的阴阳圈。但让怪物"身不由己"往阵心走的,不是这个圈的画,是圈里每帧都在…
【游戏功能】 明明开着护甲,怎么比裸奔掉血还快?有人把神圣战甲术和金刚护体混为一谈——罩是先扣罩值再掉血,甲是每一刀 打对折…
【游戏功能】 血条见底的时候,道士的刀为什么还在回血?血刀术的反直觉就在这:伤害照给、血也照回,两条账同时走——它不是"吸血…