feat(Steal): 添加解锁成功动画和音效反馈

- 将密码框滚动速度从500ms调整为250ms提升用户体验
- 添加解锁成功动画序列和音效反馈
- 增加全部解锁后的处理逻辑和动画播放
- 优化宝箱动画显示比例
- 添加解锁失败音效提示
This commit is contained in:
2026-04-10 00:54:37 +08:00
parent 8c9c9d718a
commit e6bb957d3d

View File

@@ -12,7 +12,7 @@ class StealC_Password_Box extends LenheartNewUI_CommonUi {
ScrollBaseIndex = 0; ScrollBaseIndex = 0;
InitBaseIndex = 0; InitBaseIndex = 0;
ScrollStartTimeMs = 0; ScrollStartTimeMs = 0;
RowDurationMs = 500; RowDurationMs = 250;
RowHeight = 24; RowHeight = 24;
ColumnYOffset = 0; ColumnYOffset = 0;
CorrectIndex = 0; CorrectIndex = 0;
@@ -161,9 +161,17 @@ class StealC extends LenheartNewUI_Windows {
CorrectLockedCount = 0; CorrectLockedCount = 0;
LockBoxHeight = 24; LockBoxHeight = 24;
LockSnapOffsetY = -6; LockSnapOffsetY = -6;
AllUnlockedTriggered = false;
AniQueue = null;
UnlockSuccessAni = null;
UnlockAniPlaying = false;
UnlockAniFinished = false;
UnlockFinalizeDone = false;
UnlockAniFrameDelay = 60;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) { constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = []; Childrens = [];
AniQueue = QuestQueue();
//注册控件 //注册控件
RegisterWidget(); RegisterWidget();
@@ -219,6 +227,97 @@ class StealC extends LenheartNewUI_Windows {
UnlockComplete = CorrectLockedCount.tofloat() / Total.tofloat(); UnlockComplete = CorrectLockedCount.tofloat() / Total.tofloat();
} }
function BuildUnlockFrameArr() {
local FrameArr = [];
local Delay = UnlockAniFrameDelay;
if (Delay <= 0) {
Delay = 60;
}
for (local i = 0; i< 13; i++) {
FrameArr.append({
ImgIndex = i,
Delay = Delay,
Pos = [0, 0]
});
}
return FrameArr;
}
function StartUnlockSuccessSequence() {
if (UnlockAniPlaying || UnlockAniFinished) {
return;
}
local FrameArr = BuildUnlockFrameArr();
UnlockSuccessAni = Lenheart_Ani("", FrameArr, [X + 269, Y + 260]);
UnlockSuccessAni.ImgPath = "steal/unlock.img";
UnlockSuccessAni.LoopFlag = false;
UnlockSuccessAni.Reset();
UnlockAniPlaying = true;
UnlockAniFinished = false;
if (AniQueue) {
AniQueue.RemoveQuest("StealUnlockSuccessAni");
AniQueue.AddQuest("StealUnlockSuccessAni", function(Name, Time) {
if (!UnlockSuccessAni) {
UnlockAniPlaying = false;
UnlockAniFinished = true;
AniQueue.RemoveQuest(Name);
FinalizeUnlockSuccess();
return;
}
UnlockSuccessAni.X = X + 324;
UnlockSuccessAni.Y = Y + 109;
UnlockSuccessAni.Show(Duration);
if (UnlockSuccessAni.State == 0) {
UnlockAniPlaying = false;
UnlockAniFinished = true;
AniQueue.RemoveQuest(Name);
FinalizeUnlockSuccess();
}
}.bindenv(this));
} else {
UnlockAniPlaying = false;
UnlockAniFinished = true;
FinalizeUnlockSuccess();
}
}
function FinalizeUnlockSuccess() {
if (UnlockFinalizeDone) {
return;
}
UnlockFinalizeDone = true;
SendStealUnlockPack();
CloseWindow();
Visible = false;
}
function SendStealUnlockPack() {
// TODO: fill op and fields when server protocol is finalized.
// SendPackEx({ op = xxxx });
}
function OnAllUnlockedInternal() {
R_Utils.PlaySound("GAMBLE_RESULT_GOOD");
print("Steal all unlocked: " + CorrectLockedCount);
StartUnlockSuccessSequence();
}
function CheckAllUnlocked() {
if (AllUnlockedTriggered) {
return;
}
local Total = GetPasswordBoxTotal();
if (Total <= 0) {
return;
}
if (CorrectLockedCount >= Total) {
AllUnlockedTriggered = true;
OnAllUnlockedInternal();
}
}
function CheckSpaceLock() { function CheckSpaceLock() {
if (!Visible) { if (!Visible) {
return; return;
@@ -231,8 +330,12 @@ class StealC extends LenheartNewUI_Windows {
return; return;
} }
if (FocusBox.TryLockByRect(GetLockTopY(), LockBoxHeight, LockSnapOffsetY)) { if (FocusBox.TryLockByRect(GetLockTopY(), LockBoxHeight, LockSnapOffsetY)) {
R_Utils.PlaySound("TRADE_OK");
CorrectLockedCount += 1; CorrectLockedCount += 1;
RefreshUnlockComplete(); RefreshUnlockComplete();
CheckAllUnlocked();
} else {
R_Utils.PlaySound("ALERT_2");
} }
} }
@@ -242,7 +345,13 @@ class StealC extends LenheartNewUI_Windows {
//宝箱动画 //宝箱动画
local Ani = DrawAniEx(X + 425, Y + 230, "npc/animation/storagediamond.ani"); local Ani = DrawAniEx(X + 425, Y + 230, "npc/animation/storagediamond.ani");
Ani.setImageRateFromOriginal(2.0, 2.0); Ani.setImageRateFromOriginal(1.7, 1.7);
//如果未解锁
if (UnlockComplete< 1.0) {
//宝箱锁图像
Img.DrawPng(12, X + 335, Y + 120);
}
//完成度文字 //完成度文字
@@ -264,6 +373,9 @@ class StealC extends LenheartNewUI_Windows {
function Show(obj) { function Show(obj) {
DrawMain(obj); DrawMain(obj);
if (AniQueue) {
AniQueue.Run();
}
//裁切遮罩密码框 //裁切遮罩密码框
setClip(X + 280, Y + 268, X + 280 + 8 * 30, Y + 268 + 120); setClip(X + 280, Y + 268, X + 280 + 8 * 30, Y + 268 + 120);
@@ -290,11 +402,12 @@ getroottable().rawdelete("L_Each_Obj");
function Lenheart_Steal_Fun(obj) { function Lenheart_Steal_Fun(obj) {
local RootTab = getroottable(); local RootTab = getroottable();
if (!RootTab.rawin("Steal_Obj")) { if (!RootTab.rawin("Steal_Obj")) {
RootTab.rawset("Steal_Obj", true); RootTab.rawset("Steal_Obj", true);
LenheartNewUI_CreateWindow(StealC, "偷窃系统窗口", 0, 0, 800, 600, 0); LenheartNewUI_CreateWindow(StealC, "Steal_Window", 0, 0, 800, 600, 0);
} }
} }