feat(Steal): 添加解锁成功动画和音效反馈
- 将密码框滚动速度从500ms调整为250ms提升用户体验 - 添加解锁成功动画序列和音效反馈 - 增加全部解锁后的处理逻辑和动画播放 - 优化宝箱动画显示比例 - 添加解锁失败音效提示
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user