Compare commits

...

42 Commits

Author SHA1 Message Date
TJH
a96ea74205 bigwin点击停止时没播放结算音效的bug
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m5s
2026-01-08 10:18:09 +08:00
TJH
f46b37ec39 消除时掉线可以重试或退出
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m13s
2026-01-07 17:10:18 +08:00
TJH
33d60c77be 龙虎榜跑马灯修改,rb7logo不消失的bug
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m14s
2026-01-07 16:17:02 +08:00
TJH
38ea96f3c2 龙虎榜修改
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m13s
2026-01-05 15:16:43 +08:00
TJH
3bd903bf66 1
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m14s
2026-01-04 16:46:15 +08:00
TJH
f95d0be231 历史记录修改
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m16s
2026-01-04 16:41:18 +08:00
TJH
666120de80 1
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m13s
2026-01-04 16:25:52 +08:00
TJH
2be3daa548 1
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1s
2026-01-04 16:23:22 +08:00
TJH
9034584856 插屏相关修改
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1s
2026-01-04 16:17:53 +08:00
TJH
bb97bf57dd 多语言修改
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m13s
2026-01-04 16:13:26 +08:00
TJH
9109cb225e 11
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m5s
2026-01-04 13:55:03 +08:00
TJH
fb72706ade 龙虎榜
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m14s
2025-12-31 15:20:31 +08:00
TJH
79990a2ae8 1
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m14s
2025-12-31 14:02:48 +08:00
TJH
034832d913 点击区域调整
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m50s
2025-12-31 12:26:04 +08:00
TJH
1b33734c39 自动旋转和小游戏中也可以点击屏幕停止滚动
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m14s
2025-12-31 12:22:48 +08:00
TJH
80057d6957 龙虎榜相关
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m14s
2025-12-31 11:32:07 +08:00
TJH
21e7324b54 龙虎榜
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m13s
2025-12-31 11:12:07 +08:00
TJH
861865bc78 1
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m14s
2025-12-31 11:03:41 +08:00
TJH
6e2c230b52 自动滚动时不显示购买按钮
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m15s
2025-12-31 10:51:42 +08:00
TJH
47e506ce41 免费赠送bug
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m15s
2025-12-31 09:46:01 +08:00
TJH
d0e95f15a3 历史记录修改
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m16s
2025-12-30 17:30:59 +08:00
TJH
b437ac5cae ui
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m11s
2025-12-30 16:32:56 +08:00
TJH
7954f5ea43 scatter和wild层级
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m19s
2025-12-30 16:31:31 +08:00
TJH
4c32b9f6bd 历史记录显示逻辑修改
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m15s
2025-12-30 14:54:44 +08:00
TJH
dd333d4c59 no message 2025-12-30 14:09:25 +08:00
TJH
b05312de5f 1 2025-12-30 14:09:05 +08:00
TJH
3ab56dca39 loading界面修改
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m14s
2025-12-30 14:06:27 +08:00
TJH
35fa919d8a 1
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m14s
2025-12-30 13:31:24 +08:00
TJH
04084da893 loading失败可以重试
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-30 13:30:52 +08:00
TJH
87e7307d0d 1
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m13s
2025-12-30 12:45:09 +08:00
TJH
6ea378001e 龙虎榜修改 2025-12-30 12:34:06 +08:00
TJH
9ad38a43b5 资源加载逻辑修改
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m16s
2025-12-30 12:26:22 +08:00
TJH
13bde0b065 多语言加载
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m13s
2025-12-30 11:22:43 +08:00
TJH
c0b0b26b6a 1
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m14s
2025-12-30 11:06:02 +08:00
TJH
9ce053f24e 1 2025-12-30 10:57:50 +08:00
TJH
245629db0f 龙虎榜 2025-12-30 09:55:15 +08:00
TJH
816b16ee90 龙虎榜 2025-12-29 17:54:19 +08:00
TJH
1e724360fd 取消礼花
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m13s
2025-12-29 17:50:04 +08:00
TJH
99ede74d03 修改音效,添加新动效
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m14s
2025-12-29 17:45:25 +08:00
TJH
037c0e8bdb 1 2025-12-29 16:50:32 +08:00
TJH
fa4c6036b7 节奏调整
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m13s
2025-12-29 16:28:18 +08:00
TJH
5f2a879c46 no message
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m13s
2025-12-29 16:11:23 +08:00
54 changed files with 4910 additions and 3965 deletions

View File

@ -598,7 +598,7 @@
"__id__": 30
}
],
"_active": true,
"_active": false,
"_components": [
{
"__id__": 36
@ -1253,7 +1253,7 @@
},
"_contentSize": {
"__type__": "cc.Size",
"width": 873.017578125,
"width": 893.55908203125,
"height": 50.4
},
"_anchorPoint": {
@ -1289,7 +1289,7 @@
"b": 187,
"a": 255
},
"_string": "活动介绍活动期间参与指定游戏并将赢分排在前XX名即可获得丰厚大",
"_string": "누적 베팅 횟수 XX회 및 누적 베팅 금액 XX를 달성하면 이벤트에 참여할 수 있습니다",
"_horizontalAlign": 1,
"_verticalAlign": 1,
"_actualFontSize": 27,
@ -1302,7 +1302,7 @@
"_isSystemFontUsed": true,
"_spacingX": 0,
"_isItalic": false,
"_isBold": true,
"_isBold": false,
"_isUnderline": false,
"_underlineHeight": 2,
"_cacheMode": 0,
@ -4293,7 +4293,7 @@
"__prefab": {
"__id__": 174
},
"_key": "",
"_key": "Player ID",
"_id": ""
},
{
@ -4597,7 +4597,7 @@
"b": 7,
"a": 255
},
"_string": "Winnings",
"_string": "bet",
"_horizontalAlign": 1,
"_verticalAlign": 1,
"_actualFontSize": 30,
@ -4655,7 +4655,7 @@
"__prefab": {
"__id__": 190
},
"_key": "Winnings",
"_key": "AID_MAIN_SHOW_BET",
"_id": ""
},
{
@ -10748,7 +10748,7 @@
"__prefab": {
"__id__": 451
},
"_key": "",
"_key": "Player ID",
"_id": ""
},
{
@ -11052,7 +11052,7 @@
"b": 7,
"a": 255
},
"_string": "Winnings",
"_string": "bet",
"_horizontalAlign": 1,
"_verticalAlign": 1,
"_actualFontSize": 30,
@ -11110,7 +11110,7 @@
"__prefab": {
"__id__": 467
},
"_key": "Winnings",
"_key": "AID_MAIN_SHOW_BET",
"_id": ""
},
{
@ -17605,7 +17605,7 @@
},
"_contentSize": {
"__type__": "cc.Size",
"width": 108,
"width": 274.232421875,
"height": 36.76
},
"_anchorPoint": {
@ -17641,7 +17641,7 @@
"b": 255,
"a": 255
},
"_string": "领奖记录",
"_string": "Reward claim records",
"_horizontalAlign": 1,
"_verticalAlign": 1,
"_actualFontSize": 26,
@ -22172,7 +22172,7 @@
},
"_lpos": {
"__type__": "cc.Vec3",
"x": -369,
"x": -320,
"y": 0,
"z": 0
},
@ -22353,7 +22353,7 @@
},
"_lpos": {
"__type__": "cc.Vec3",
"x": -190,
"x": -140,
"y": 0,
"z": 0
},
@ -22534,7 +22534,7 @@
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 15,
"x": 50,
"y": 0,
"z": 0
},
@ -22715,7 +22715,7 @@
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 205,
"x": 220,
"y": 0,
"z": 0
},
@ -24034,7 +24034,7 @@
},
"_lpos": {
"__type__": "cc.Vec3",
"x": -369,
"x": -320,
"y": 0,
"z": 0
},
@ -24215,7 +24215,7 @@
},
"_lpos": {
"__type__": "cc.Vec3",
"x": -190,
"x": -140,
"y": 0,
"z": 0
},
@ -24396,7 +24396,7 @@
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 15,
"x": 50,
"y": 0,
"z": 0
},
@ -24577,7 +24577,7 @@
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 205,
"x": 220,
"y": 0,
"z": 0
},

View File

@ -1092,9 +1092,9 @@
"_dstBlendFactor": 4,
"_color": {
"__type__": "cc.Color",
"r": 90,
"g": 6,
"b": 7,
"r": 221,
"g": 162,
"b": 154,
"a": 255
},
"_string": "4",

View File

@ -80,7 +80,7 @@ export class RankHistoryList extends Component {
this.historyIndex = 1;
this.updateHistoryArrows();
this.refreshSelfRankingInfo(null);
await this.loadHistoryData(this.currentHistoryType, this.historyIndex);
}
@ -114,11 +114,10 @@ export class RankHistoryList extends Component {
// ==================== 历史记录逻辑 ====================
async loadHistoryData(type: string, index: number) {
this.setRankHistoryRadioBtn(type);
this.refreshSelfRankingInfo(null);
if (!this.isTypeAvailable(type)) {
console.log(`${type} 历史榜单活动未开启`);
this.rankHistoryLoadingNode.active = false;
this.refreshSelfRankingInfo(null);
this.showActivityNotOpenTip();
return;
}
@ -163,7 +162,7 @@ export class RankHistoryList extends Component {
this.selfInfo.getChildByName('Rank').getChildByName('sp_1').active = false;
this.selfInfo.getChildByName('Rank').getChildByName('sp_2').active = false;
this.selfInfo.getChildByName('Rank').getChildByName('sp_3').active = false;
this.selfInfo.getChildByName('Rank').getChildByName('rankLab').active = false;
this.selfInfo.getChildByName('Rank').getChildByName('rankLab').active = true;
this.selfInfo.getChildByName('Rank').getChildByName('rankLab').getComponent(Label).string = '-';
this.selfInfo.getChildByName('Uid').getComponent(Label).string = '-';
this.selfInfo.getChildByName('Shop').getComponent(Label).string = '-';
@ -182,7 +181,7 @@ export class RankHistoryList extends Component {
}
this.selfInfo.getChildByName('Uid').getComponent(Label).string = truncateString(selfInfo.Uid);
this.selfInfo.getChildByName('Shop').getComponent(Label).string = SlotRankingDataManager.instance.getRankListServerId() || '-';
this.selfInfo.getChildByName('Win').getComponent(Label).string = selfInfo.Win.toString();
this.selfInfo.getChildByName('Win').getComponent(Label).string = selfInfo.Bet.toString();
}
getHistoryDate(type: string, index: number): string {
@ -226,7 +225,7 @@ export class RankHistoryList extends Component {
node.getChildByName('Rank').getChildByName('rankLab').getComponent(Label).string = (idx + 1).toString();
node.getChildByName('Uid').getComponent(Label).string = truncateString(itemData.Uid);
node.getChildByName('Shop').getComponent(Label).string = SlotRankingDataManager.instance.getRankListServerId() || '-';
node.getChildByName('Win').getComponent(Label).string = itemData.Win.toString();
node.getChildByName('Win').getComponent(Label).string = itemData.Bet.toString();
}
this.rankingHistoryListVScroll.refreshList(rankInfos.List);

View File

@ -1,4 +1,4 @@
import { _decorator, Button, Color, Component, Label, Node, Sprite, Tween, tween, UITransform, v3 } from 'cc';
import { _decorator, Button, Color, Component, Label, Node, Sprite, Tween, tween, UITransform, v3, Vec2 } from 'cc';
import { VirtualScrollView } from './VScrollView';
import { Palette } from './Palette';
import { SlotRankingDataManager } from './SlotRankingDataManager';
@ -77,7 +77,7 @@ export class RankList extends Component {
this.rankList.active = true;
this.currentRankType = '';
this.updateRankButtonsAvailability();
this.refreshSelfRankingInfo(null);
await this.switchRankTab(defaultType);
}
@ -123,7 +123,7 @@ export class RankList extends Component {
this.currentRankType = type;
this.setRankRadioBtn(type);
this.refreshSelfRankingInfo(null);
if (!this.isTypeAvailable(type)) {
console.log(`${type} 榜单活动未开启`);
this.rankLoadingNode.active = false;
@ -132,7 +132,6 @@ export class RankList extends Component {
}
this.marqueeTexts = [];
this.currentMarqueeIndex = 0;
this.refreshSelfRankingInfo(null);
this.showActivityNotOpenTip();
if (this.countdownTimer) {
clearInterval(this.countdownTimer);
@ -183,7 +182,19 @@ export class RankList extends Component {
console.error('获取排行榜数据失败:', error);
this.showActivityNotOpenTip();
Tween.stopAllByTarget(this.rankLoadingNode);
if (this.countdownTimer) {
clearInterval(this.countdownTimer);
this.countdownTimer = null;
}
this.rankingEndTime.getComponent(Label).string = "--:--:--";
this.rankLoadingNode.active = false;
// 停止跑马灯
if (this.msg_1 && this.msg_1.isValid) {
Tween.stopAllByTarget(this.msg_1);
this.msg_1.active = false;
}
this.marqueeTexts = [];
this.currentMarqueeIndex = 0;
}
}
@ -238,11 +249,24 @@ export class RankList extends Component {
// 再次强制更新以确保宽度准确
labelComp.updateRenderData(true);
let labelLength = labelComp.node.getComponent(UITransform).width;
let maskLength = this.msg_1.parent.getComponent(UITransform).width
// 设置初始位置
this.msg_1.setPosition(-450, this.msg_1.position.y, this.msg_1.position.z);
let endX = -labelLength;
let duration = Math.max(3, (-450 + labelLength) / 80);
let endX = 0
let duration = 0
if (labelLength <= maskLength) {
labelComp.node.getComponent(UITransform).setAnchorPoint(new Vec2(0.5, 0.5))
this.msg_1.setPosition(0, this.msg_1.position.y, this.msg_1.position.z);
endX = - maskLength / 2 - labelLength / 2 - 30
duration = Math.max(3, labelLength / 80);
} else {
labelComp.node.getComponent(UITransform).setAnchorPoint(new Vec2(0, 0.5))
this.msg_1.setPosition(- maskLength / 2, this.msg_1.position.y, this.msg_1.position.z);
endX = - maskLength / 2 - labelLength - 30
duration = Math.max(3, (- maskLength / 2 + labelLength) / 80);
}
// 启动跑马灯动画
Tween.stopAllByTarget(this.msg_1);
@ -264,6 +288,9 @@ export class RankList extends Component {
this.rankingListVScroll.setTotalCount(rankInfos.List.length);
this.rankingListVScroll.renderItemFn = (node: Node, idx: number) => {
let itemData = rankInfos.List[idx];
if (!itemData) {
return;
}
node.getChildByName('bg').active = idx % 2 === 0;
node.getChildByName('bg2').active = idx % 2 !== 0;
node.getChildByName('Rank').getChildByName('sp_1').active = idx === 0;
@ -273,7 +300,7 @@ export class RankList extends Component {
node.getChildByName('Rank').getChildByName('rankLab').getComponent(Label).string = itemData.Rank.toString();
node.getChildByName('Uid').getComponent(Label).string = truncateString(itemData.Uid);
node.getChildByName('Shop').getComponent(Label).string = SlotRankingDataManager.instance.getRankListServerId() || '-';
node.getChildByName('Win').getComponent(Label).string = itemData.Win.toString();
node.getChildByName('Win').getComponent(Label).string = itemData.Bet.toString();
}
this.rankingListVScroll.refreshList(rankInfos.List);
@ -285,7 +312,7 @@ export class RankList extends Component {
this.selfInfo.getChildByName('Rank').getChildByName('sp_1').active = false;
this.selfInfo.getChildByName('Rank').getChildByName('sp_2').active = false;
this.selfInfo.getChildByName('Rank').getChildByName('sp_3').active = false;
this.selfInfo.getChildByName('Rank').getChildByName('rankLab').active = false;
this.selfInfo.getChildByName('Rank').getChildByName('rankLab').active = true;
this.selfInfo.getChildByName('Rank').getChildByName('rankLab').getComponent(Label).string = '-';
this.selfInfo.getChildByName('Uid').getComponent(Label).string = '-';
this.selfInfo.getChildByName('Shop').getComponent(Label).string = '-';
@ -304,7 +331,7 @@ export class RankList extends Component {
}
this.selfInfo.getChildByName('Uid').getComponent(Label).string = truncateString(selfInfo.Uid);
this.selfInfo.getChildByName('Shop').getComponent(Label).string = SlotRankingDataManager.instance.getRankListServerId() || '-';
this.selfInfo.getChildByName('Win').getComponent(Label).string = selfInfo.Win.toString();
this.selfInfo.getChildByName('Win').getComponent(Label).string = selfInfo.Bet.toString();
}
// ==================== 按钮状态管理 ====================

View File

@ -4,6 +4,7 @@ import { Palette } from './Palette';
import { SlotRankingDataManager } from './SlotRankingDataManager';
import { callGameApiForRank } from 'db://assets/Loading/scripts/comm';
import { AudioManager } from 'db://assets/Loading/scripts/manager/AudioManager';
import { I18nManager } from 'db://assets/Loading/scripts/manager/I18nManager';
const { ccclass, property } = _decorator;
@ -118,7 +119,7 @@ export class RewardList extends Component {
this.setRewardRadioBtn(type);
if (!this.isTypeAvailable(type)) {
if (!this.isTypeAvailable(type) || SlotRankingDataManager.instance.getRankListStatusByType(type) !== 0) {
console.log(`${type} 奖励榜单活动未开启`);
this.rewardLoadingNode.active = false;
this.showActivityNotOpenTip();
@ -208,19 +209,19 @@ export class RewardList extends Component {
if (this.rewardsData.DayRanks && this.rewardsData.DayRanks.length > 0) {
for (let item of this.rewardsData.DayRanks) {
this.selfRewardsList.push({ ...item, TypeLabel: '日榜' });
this.selfRewardsList.push({ ...item, TypeLabel: I18nManager.instance.t('Daily Ranking') });
}
}
if (this.rewardsData.WeekRanks && this.rewardsData.WeekRanks.length > 0) {
for (let item of this.rewardsData.WeekRanks) {
this.selfRewardsList.push({ ...item, TypeLabel: '周榜' });
this.selfRewardsList.push({ ...item, TypeLabel: I18nManager.instance.t('Weekly Ranking') });
}
}
if (this.rewardsData.MonthRanks && this.rewardsData.MonthRanks.length > 0) {
for (let item of this.rewardsData.MonthRanks) {
this.selfRewardsList.push({ ...item, TypeLabel: '月榜' });
this.selfRewardsList.push({ ...item, TypeLabel: I18nManager.instance.t('Monthly Ranking') });
}
}

View File

@ -6,6 +6,7 @@ import { RewardHistoryList } from './RewardHistoryList';
import { SlotRankingDataManager } from './SlotRankingDataManager';
import { callGameApiForRank, getGameId } from 'db://assets/Loading/scripts/comm';
import { AudioManager } from 'db://assets/Loading/scripts/manager/AudioManager';
import { SlotScene } from '../../scripts/SlotScene';
const { ccclass, property } = _decorator;
@ -33,7 +34,7 @@ export class SlotRanking extends Component {
DESIGN_WIDTH: number = 1080;
DESIGN_HEIGHT: number = 1920;
slotScene: any = null; // SlotScene 引用
slotScene: SlotScene = null; // SlotScene 引用
isMove: boolean = false; // 是否是拖动状态
isClick: boolean = false; // 是否是点击状态
startPos: Vec3 = v3(432, 650, 0);
@ -67,9 +68,10 @@ export class SlotRanking extends Component {
this.initComponents();
this.rankingBtn.setPosition(this.startPos);
this.rankingBtn.active = SlotRankingDataManager.instance.getRankListStatus() === 0 || SlotRankingDataManager.instance.getRankListStatus() === 1;
this.rankingBtn.getChildByName('icon').getComponent(sp.Skeleton).color = SlotRankingDataManager.instance.getRankListStatus() === 0 ? Color.WHITE : Color.GRAY;
this.rankingBtn.active = SlotRankingDataManager.instance.getRankListStatus() === 0 || SlotRankingDataManager.instance.getRankListStatus() === 1 || SlotRankingDataManager.instance.getRankMaxCloseTimeIsBiggerThanCurTime();
this.rankingBtn.getComponent(Button).interactable = SlotRankingDataManager.instance.getRankListStatus() === 0;
this.rankingBtn.getChildByName('icon').getComponent(sp.Skeleton).color = SlotRankingDataManager.instance.getRankListStatus() === 0 ? Color.WHITE : Color.GRAY;
this.rankingBtn.on(Node.EventType.TOUCH_START, this.onTouchStart, this);
this.rankingBtn.on(Node.EventType.TOUCH_MOVE, this.onTouchMove, this);
@ -117,7 +119,7 @@ export class SlotRanking extends Component {
};
}
setSlotScene(slotScene: any) {
setSlotScene(slotScene: SlotScene) {
this.slotScene = slotScene;
// 将 slotScene 引用传递给 RewardList
if (this.rewardList) {
@ -127,23 +129,36 @@ export class SlotRanking extends Component {
// 检查是否可以点击排行榜按钮
canClickRankingBtn(): boolean {
if (!this.slotScene) return true;
console.log('slotScene', this.slotScene)
if (!this.slotScene) return true;
console.log('isAutoSpin', this.slotScene.gameState.isAutoSpin)
console.log('isInFreeSpin', this.slotScene.gameState.isInFreeSpin)
console.log('isFeatureBuySpin', this.slotScene.gameState.isFeatureBuySpin)
console.log('isEliminating', this.slotScene.gameState.isEliminating)
// 如果正在滚动,不可点击
if (this.slotScene.slotGame && this.slotScene.slotGame.isScroll()) {
return false;
}
// 如果正在自动旋转,不可点击
if (this.slotScene.isAutoSpin) {
if (this.slotScene.gameState.isAutoSpin) {
return false;
}
if (this.slotScene.isFreeSpin) {
if (this.slotScene.gameState.isInFreeSpin) {
return false;
}
if (this.slotScene.isFeatureBuySpin) {
if (this.slotScene.gameState.isFeatureBuySpin) {
return false;
}
if (this.slotScene.gameState.isEliminating) {
return false;
}
if (!this.rankingBtn.getComponent(Button).interactable) {
return false;
}
@ -210,7 +225,7 @@ export class SlotRanking extends Component {
this.isClick = false;
return;
}
console.log('isClick', this.isClick)
if (this.isClick) {
// 检查是否可以点击
if (!this.canClickRankingBtn()) {

View File

@ -13,6 +13,85 @@ export class SlotRankingDataManager {
set rankList(list: any) { this._rankList = list; }
get rankList(): any { return this._rankList; }
/**
*
* {
"List": [
{
"Id": "20251225_day_faketrans-VND",
"Name": "",
"Type": "day",
"StartTime": 1766592000,
"EndTime": 1766689200,
"CloseTime": 1766775600,
"Status": 0,
"Rewards": [
10,
8,
5,
3,
3,
3,
3,
3,
3,
3
],
"SpinLimit": 10,
"BetLimit": 1000000
},
{
"Id": "20251222_week_faketrans-VND",
"Name": "",
"Type": "week",
"StartTime": 1766592000,
"EndTime": 1766678400,
"CloseTime": 1766764800,
"Status": 0,
"Rewards": [
10,
5,
5,
5,
5,
5,
5,
5,
5,
5
],
"SpinLimit": 10,
"BetLimit": 5000000
}
]
}
*/
getRankMaxCloseTimeIsBiggerThanCurTime(): boolean {
if (!this._rankList || !this._rankList.List || this._rankList.List.length === 0) {
// 代表当前没有活动开启,则说明关闭入口按钮
return false;
}
let maxCloseTime = 0;
for (let item of this._rankList.List) {
if (item.CloseTime > maxCloseTime) {
maxCloseTime = item.CloseTime;
}
}
return Date.now() <= (maxCloseTime * 1000);
}
getRankListStatusByType(type: string): number {
if (!this._rankList || !this._rankList.List || this._rankList.List.length === 0) {
return 2;
}
let item = this._rankList.List.find((item: any) => item.Type === type);
return item ? item.Status : 2;
}
getRankListStatus(): number {
if (!this._rankList || !this._rankList.List || this._rankList.List.length === 0) {
return 2;

View File

@ -1391,7 +1391,7 @@
"Feature Buy": "အင်္ဂါရပ် ဝယ်ယူမှု",
"Free Spins": "အခမဲ့ လည်ပတ်မှုများ",
"Free Spin": "အခမဲ့ လည်ပတ်မှု :",
"Game History": "ဂိမ်း မှတ်တမ်း",
"Game History": "ဂိမ်းမှတ်တမ်း",
"Last 7 days": "ပြီးခဲ့သော ၇ ရက်",
"Loading More...": "ဆက်လက် ဖော်ပြသည် ...",
"No Game History": "ဂိမ်း မှတ်တမ်း မရှိပါ",
@ -1475,9 +1475,9 @@
"Select Date Range": "ရက်စွဲ အပိုင်း အခြား ရွေးချယ် ပါ",
"Time": "အချိန်",
"Today": "ယနေ့",
"Transaction": "ငွေကြေး လွှဲပြောင်း မှု",
"Win Multiplier": "အနိုင်ရ မြှောက်ကိန်း",
"of a Kind": "အမျိုးအစား တူ",
"Transaction": "ငွေကြေးလွှဲပြောင်းမှု",
"Win Multiplier": "အနိုင်ရမြှောက်ကိန်း",
"of a Kind": "အမျိုးအစားတူ",
"way(s)": "Way(s)"
},
"nl": {
@ -2171,26 +2171,26 @@
"way(s)": "Way(s)"
},
"th": {
"All record(s) displayed": "ฟรีสปิน:",
"B/BxS": "Indsats / Basisindsats x Symboludbetalingsværdier",
"B/BxSxW": "Indsats / Basisindsats x Symboludbetalingsværdier x Way(s)",
"B/BxSxWxM": "Indsats / Basisindsats x Symboludbetalingsværdier x Way(s) x Multiplikator",
"Balance": "ไม่มี คอมโบ ชนะ",
"Bet": "แสดง ทั้งหมด แล้ว",
"Close": "การ จ่าย เงิน",
"Custom": "เดิมพัน",
"Feature Buy": "ชนิด เดียวกัน",
"Free Spins": "Way",
"Free Spin": "รอบ:",
"Game History": "7 วันที่ ผ่านมา",
"Last 7 days": "รายการ",
"Loading More...": "ปิด",
"No Game History": "สปิน ปกติ",
"No Winning Combination": "ตัวคูณ รางวัล",
"Normal Spin": "ยอด คงเหลือ",
"Payout": "ฟรี สปิน",
"Paytable": "ตาราง การ จ่าย เงิน",
"Paytable_1": "มูลค่า การ จ่าย เงิน ของ สัญลักษณ์",
"All record(s) displayed": "แสดงทั้งหมดแล้ว",
"B/BxS": "เดิมพัน / เดิมพันพื้นฐาน x ค่าตัวคูณสัญลักษณ์",
"B/BxSxW": "เดิมพัน / เดิมพันพื้นฐาน x ค่าตัวคูณสัญลักษณ์ x Way",
"B/BxSxWxM": "เดิมพัน / เดิมพันพื้นฐาน x ค่าตัวคูณสัญลักษณ์ x Way x ตัวคูณ",
"Balance": "ยอดคงเหลือ",
"Bet": "เดิมพัน",
"Close": "ปิด",
"Custom": "กำหนดเอง",
"Feature Buy": "ซื้อฟีเจอร์",
"Free Spins": "ฟรีสปิน",
"Free Spin": "ฟรีสปิน:",
"Game History": "ประวัติการเล่น",
"Last 7 days": "7 วันที่ผ่านมา",
"Loading More...": "กำลังโหลดเพิ่ม...",
"No Game History": "ไม่มีประวัติการเล่น",
"No Winning Combination": "ไม่มีคอมโบชนะ",
"Normal Spin": "สปินปกติ",
"Payout": "การจ่ายเงิน",
"Paytable": "ตารางการจ่ายเงิน",
"Paytable_1": "มูลค่าการจ่ายเงินของสัญลักษณ์",
"Paytable_1_1": "ป่า",
"Paytable_1_2": "เครื่องหมาย",
"Paytable_1_3": "กระจัดกระจาย",
@ -2198,24 +2198,24 @@
"Paytable_1_5": "สัญลักษณ์ บาง ตัว อาจ ครอบครอง พื้นที่ สัญลักษณ์ 2 ถึง 4 ช่อง และ สัญลักษณ์ แต่ละ ตัว จะ แสดง เป็น สัญลักษณ์ เดียว ใน ระหว่าง การ คำนวณ การ จ่าย เงิน",
"Paytable_1_6": "สัญลักษณ์ Wild แทนที่ สัญลักษณ์ ทั้งหมด ยกเว้น สัญลักษณ์ Scatter",
"Paytable_1_7": "สัญลักษณ์ Wild จะ ปรากฏ บน รีล 2, 3, 4 และ 5 เท่านั้น",
"Paytable_2": "ไวลด์ ออน เดอะ เวย์",
"Paytable_2": "ไวลด์ออนเดอะเวย์",
"Paytable_2_1": "ใน ระหว่าง การ หมุน ใด ๆ สัญลักษณ์ บาง ตัว (ไม่ รวม สัญลักษณ์ Wild และ สัญลักษณ์ Scatter) ใน รีล 2, 3, 4 และ/หรือ 5 ที่ ครอบครอง พื้นที่ สัญลักษณ์ 2 ถึง 4 ช่อง อาจ มี พื้นหลัง สีทอง",
"Paytable_2_2": "ใน ทุก ๆ รอบ ใหม่ หลังจาก ที่ สัญลักษณ์ ใหม่ ไหล ลงมา สัญลักษณ์ พื้นหลัง สีทอง ใด ๆ ที่ เกี่ยวข้อง กับ การ ชนะ ใน รอบ ก่อนหน้า จะ ถูก เปลี่ยน เป็น สัญลักษณ์ Wild",
"Paytable_3": "รีล ตัวคูณ",
"Paytable_3": "รีลตัวคูณ",
"Paytable_3_1": "ใน ช่วง เริ่มต้น ของ การ หมุน เกม หลัก ใด ๆ ค่า ตัวคูณ 4 ตัว ด้านล่าง รีล จะ ถูก ตั้ง เป็น x2",
"Paytable_3_2": "ใน ระหว่าง การ หมุน เกม หลัก ใด ๆ ก็ตาม เมื่อใด ก็ตาม ที่ มี สัญลักษณ์ Wild ปรากฏ บน วงล้อ ตั้งแต่ 1 ตัว ขึ้นไป และ เกี่ยวข้อง กับ การ ชนะ ตัวคูณ ที่ อยู่ ใต้ สัญลักษณ์ Wild เหล่านั้น จะ ถูก นำมา รวมกัน เงินรางวัล จะ ถูก คูณ ด้วย ตัวคูณ ทั้งหมด ก่อนที่ จะ จ่าย เงินรางวัล",
"Paytable_3_3": "หลังจาก จ่าย เงินรางวัล แล้ว ตัวคูณ ที่ ใช้ ไป จะ ถูก ทำลาย และ ตัวคูณ ที่ ใหญ่กว่า จะ ไหล เข้ามา จาก ทาง ขวา",
"Paytable_4": "ฟีเจอร์ ฟรี สปิน",
"Paytable_4": "ฟีเจอร์ฟรีสปิน",
"Paytable_4_1": "สัญลักษณ์ Scatter 4 ตัว ที่ ปรากฏ ใน ตำแหน่ง ใด ก็ได้ จะ เปิดใช้งาน ฟีเจอร์ ฟรี สปิน พร้อม ฟรี สปิน 10 ครั้ง สัญลักษณ์ Scatter เพิ่มเติม แต่ละ ตัว จะ เปิดใช้งาน ฟรี สปิน เพิ่ม อีก 2 ครั้ง",
"Paytable_4_2": "ใน ช่วง เริ่มต้น ของ ฟีเจอร์ หมุน ฟรี ค่า ตัวคูณ 4 ตัว ด้านล่าง รีล จะ ถูก ตั้ง เป็น x2",
"Paytable_4_3": "ใน ระหว่าง การ หมุน ฟรี ใด ๆ ก็ตาม เมื่อใด ก็ตาม ที่ มี สัญลักษณ์ Wild ปรากฏ บน วงล้อ ตั้งแต่ 1 ตัว ขึ้นไป และ เกี่ยวข้อง กับ การ ชนะ ตัวคูณ ที่ อยู่ ใต้ สัญลักษณ์ Wild เหล่านั้น จะ ถูก นำมา รวมกัน เงินรางวัล จะ ถูก คูณ ด้วย ตัวคูณ ทั้งหมด ก่อนที่ จะ จ่าย เงินรางวัล",
"Paytable_4_4": "หลังจาก จ่าย เงินรางวัล แล้ว ตัวคูณ ที่ ใช้ ไป จะ ถูก ทำลาย และ ตัวคูณ ที่ ใหญ่กว่า จะ ไหล เข้ามา จาก ทาง ขวา",
"Paytable_4_5": "ค่า ตัวคูณ ที่ อยู่ ด้านล่าง รีล จะ ไม่ รีเซ็ต หลังจาก การ หมุน ฟรี ครั้ง แรก",
"Paytable_4_6": "ฟรี สปิน สามารถ ทริกเกอร์ ซ้ำ ได้",
"Paytable_5": "คุณสมบัติ การ ซื้อ",
"Paytable_5": "คุณสมบัติการซื้อ",
"Paytable_5_1": "แตะ ที่ ปุ่ม ซื้อ คุณสมบัติ เพื่อ เปิด เมนู ซื้อ คุณสมบัติ",
"Paytable_5_2": "แตะ ที่ ปุ่ม เริ่ม เพื่อ ซื้อ ฟีเจอร์ สปิน ฟรี ใน ราคา ที่ แสดง ใน เมนู ซื้อ ฟีเจอร์",
"Paytable_6": "400-15,625 วิธี",
"Paytable_6": "400-15,625วิธี",
"Paytable_6_1": "วิธี เดิมพัน จะ ชนะ ถ้า สัญลักษณ์ ที่ ชนะ เรียง ต่อกัน จาก รีล ซ้ายสุด ไป ทาง ขวา",
"Paytable_6_2": "จำนวน รวม ของ วิธี เดิมพัน ที่ ชนะ สำหรับ แต่ละ สัญลักษณ์ จะ คำนวณ โดย การ คูณ จำนวน สัญลักษณ์ ที่ ชนะ ที่ อยู่ ติดกัน บน แต่ละ สัญลักษณ์ จาก รีล ซ้ายสุด ไป ยัง ขวา",
"Paytable_6_3": "จาก ตัวอย่าง ข้างต้น:",
@ -2223,11 +2223,11 @@
"Paytable_6_5": "ตัวอย่าง นี้ แสดง จำนวน เงินรางวัล รวม:",
"Paytable_6_6": "หลังจาก การ จ่าย เงิน ใน แต่ละ รอบ เสร็จสิ้น แล้ว สัญลักษณ์ ที่ ชนะ ทั้งหมด จะ ระเบิด ทำให้ สัญลักษณ์ ที่ อยู่ เหนือ สัญลักษณ์ เหล่านั้น จะ ตกลงมา เพื่อ เล่น รอบ ใหม่",
"Paytable_6_7": "ระบบ จะ นับ ชุด ค่าผสม ที่ ชนะ เพิ่มเติม ใน ทุก ๆ รอบ จนกว่า จะ ไม่ สามารถ นับ ชุด ค่าผสม ที่ ชนะ เพิ่มเติม ได้ อีก",
"Paytable_6_8": "แสดง ชัยชนะ ทั้งหมด เป็น เงินสด",
"Profit": "กำลัง โหลด เพิ่ม...",
"Round": "ซื้อ ฟีเจอร์",
"Rules": "กฎ ของ เกม",
"Rules_1": "หม้อ ไฟ คาร์นิวัล",
"Paytable_6_8": "แสดงชัยชนะทั้งหมดเป็นเงินสด",
"Profit": "กำไร",
"Round": "รอบ:",
"Rules": "กฎของเกม",
"Rules_1": "หม้อไฟคาร์นิวัล",
"Rules_1_1": "Hot pot Carnival เป็น วิดีโอ สล็อต 6 รีล 5 แถว (พร้อม รีล เพิ่มเติม ที่ ด้านล่าง ของ รีล 2, 3, 4 และ 5) โดย มี สัญลักษณ์ Wilds-on-the-Way และ ตัวคูณ ที่ ด้านล่าง ของ รีล",
"Rules_1_10": "การ จ่าย เงิน สัญลักษณ์ ที่ ชนะ จะ คูณ ด้วย จำนวน วิธี เดิมพัน ที่ ชนะ",
"Rules_1_11": "เพิ่ม การ ชนะ พร้อมกัน จาก วิธี เดิมพัน ที่ แตกต่างกัน",
@ -2246,30 +2246,30 @@
"Rules_1_7": "วิธี เดิมพัน ที่ ชนะ เป็น เงินสด จะ เท่ากับ ค่า ที่ แสดง ใน \"ตาราง การ จ่าย เงิน\" คูณ ด้วย ขนาด เดิมพัน และ ระดับ เดิมพัน",
"Rules_1_8": "วิธี เดิมพัน จะ ชนะ ถ้า สัญลักษณ์ ที่ ชนะ เรียง ต่อกัน จาก รีล ซ้ายสุด ไป ทาง ขวา",
"Rules_1_9": "จำนวน รวม ของ วิธี เดิมพัน ที่ ชนะ สำหรับ แต่ละ สัญลักษณ์ จะ คำนวณ โดย การ คูณ จำนวน สัญลักษณ์ ที่ ชนะ ติดกัน บน แต่ละ สัญลักษณ์ จาก รีล ซ้ายสุด ไป ยัง ขวา",
"Rules_2": "ไวลด์ ออน เดอะ เวย์",
"Rules_2": "ไวลด์ออนเดอะเวย์",
"Rules_2_1": "ใน ระหว่าง การ หมุน ใด ๆ สัญลักษณ์ บาง ตัว (ไม่ รวม สัญลักษณ์ Wild และ สัญลักษณ์ Scatter) ใน รีล 2, 3, 4 และ/หรือ 5 ที่ ครอบครอง พื้นที่ สัญลักษณ์ 2 ถึง 4 ช่อง อาจ มี พื้นหลัง สีทอง",
"Rules_2_2": "ใน ทุก ๆ รอบ ใหม่ หลังจาก ที่ สัญลักษณ์ ใหม่ ไหล ลงมา สัญลักษณ์ พื้นหลัง สีทอง ใด ๆ ที่ เกี่ยวข้อง กับ การ ชนะ ใน รอบ ก่อนหน้า จะ ถูก เปลี่ยน เป็น สัญลักษณ์ Wild",
"Rules_3": "รีล ตัวคูณ",
"Rules_3": "รีลตัวคูณ",
"Rules_3_1": "ใน ช่วง เริ่มต้น ของ การ หมุน เกม หลัก ใด ๆ ค่า ตัวคูณ 4 ตัว ด้านล่าง รีล จะ ถูก ตั้ง เป็น x2",
"Rules_3_2": "ใน ระหว่าง การ หมุน เกม หลัก ใด ๆ ก็ตาม เมื่อใด ก็ตาม ที่ มี สัญลักษณ์ Wild ปรากฏ บน วงล้อ ตั้งแต่ 1 ตัว ขึ้นไป และ เกี่ยวข้อง กับ การ ชนะ ตัวคูณ ที่ อยู่ ใต้ สัญลักษณ์ Wild เหล่านั้น จะ ถูก นำมา รวมกัน เงินรางวัล จะ ถูก คูณ ด้วย ตัวคูณ ทั้งหมด ก่อนที่ จะ จ่าย เงินรางวัล",
"Rules_3_3": "หลังจาก จ่าย เงินรางวัล แล้ว ตัวคูณ ที่ ใช้ ไป จะ ถูก ทำลาย และ ตัวคูณ ที่ ใหญ่กว่า จะ ไหล เข้ามา จาก ทาง ขวา",
"Rules_4": "ฟีเจอร์ ฟรี สปิน",
"Rules_4": "ฟีเจอร์ฟรีสปิน",
"Rules_4_1": "สัญลักษณ์ Scatter 4 ตัว ที่ ปรากฏ ใน ตำแหน่ง ใด ก็ได้ จะ เปิดใช้งาน ฟีเจอร์ ฟรี สปิน พร้อม ฟรี สปิน 10 ครั้ง สัญลักษณ์ Scatter เพิ่มเติม แต่ละ ตัว จะ เปิดใช้งาน ฟรี สปิน เพิ่ม อีก 2 ครั้ง",
"Rules_4_2": "ใน ช่วง เริ่มต้น ของ ฟีเจอร์ การ หมุน ฟรี ค่า ตัวคูณ 4 ตัว ด้านล่าง รีล จะ ถูก ตั้ง เป็น x2",
"Rules_4_3": "ใน ระหว่าง การ หมุน ฟรี ใด ๆ ก็ตาม เมื่อใด ก็ตาม ที่ มี สัญลักษณ์ Wild ปรากฏ บน วงล้อ ตั้งแต่ 1 ตัว ขึ้นไป และ เกี่ยวข้อง กับ การ ชนะ ตัวคูณ ที่ อยู่ ใต้ สัญลักษณ์ Wild เหล่านั้น จะ ถูก นำมา รวมกัน เงินรางวัล จะ ถูก คูณ ด้วย ตัวคูณ ทั้งหมด ก่อนที่ จะ จ่าย เงินรางวัล",
"Rules_4_4": "หลังจาก จ่าย เงินรางวัล แล้ว ตัวคูณ ที่ ใช้ ไป จะ ถูก ทำลาย และ ตัวคูณ ที่ ใหญ่กว่า จะ ไหล เข้ามา จาก ทาง ขวา",
"Rules_4_5": "ค่า ตัวคูณ ที่ อยู่ ด้านล่าง รีล จะ ไม่ รีเซ็ต หลังจาก การ หมุน ฟรี ครั้ง แรก",
"Rules_4_6": "ฟรี สปิน สามารถ ทริกเกอร์ ซ้ำ ได้",
"Rules_5": "คุณสมบัติ การ ซื้อ",
"Rules_5": "คุณสมบัติการซื้อ",
"Rules_5_1": "แตะ ที่ ปุ่ม ซื้อ คุณสมบัติ เพื่อ เปิด เมนู ซื้อ คุณสมบัติ",
"Rules_5_2": "แตะ ที่ ปุ่ม เริ่ม เพื่อ ซื้อ ฟีเจอร์ สปิน ฟรี ใน ราคา ที่ แสดง ใน เมนู ซื้อ ฟีเจอร์",
"Rules_6": "เกม หลัก",
"Rules_6": "เกมหลัก",
"Rules_6_1": "สปิน",
"Rules_6_10": "การ ตั้งค่า เพิ่มเติม",
"Rules_6_10": "การตั้งค่าเพิ่มเติม",
"Rules_6_10_1": "แตะ เพื่อ เข้าถึง การ ตั้งค่า อื่น ๆ",
"Rules_6_11": "เสียง",
"Rules_6_11_1": "แตะ เพื่อ เปิด หรือ ปิด เสียง",
"Rules_6_12": "ตาราง การ จ่าย เงิน",
"Rules_6_12": "ตารางการจ่ายเงิน",
"Rules_6_12_1": "แสดง ชุด ค่าผสม ที่ ชนะ และ อัตรา การ จ่าย เงิน",
"Rules_6_13": "กฎกติกา",
"Rules_6_13_1": "แสดง กฎ เกม และ หน้าที่ ของ ปุ่ม ต่าง ๆ",
@ -2286,27 +2286,27 @@
"Rules_6_3_1": "แตะ เพื่อ ลด จำนวน เงิน เดิมพัน",
"Rules_6_4": "เพิ่ม",
"Rules_6_4_1": "แตะ เพื่อ เพิ่ม จำนวน เงิน เดิมพัน",
"Rules_6_5": "ยอด เงิน ใน กระเป๋า สตางค์",
"Rules_6_5": "ยอดเงินในกระเป๋าสตางค์",
"Rules_6_5_1": "แสดง ยอด เงิน ใน กระเป๋า สตางค์ ที่ ใช้ ได้",
"Rules_6_6": "จำนวน เงิน เดิมพัน",
"Rules_6_6_1": "แสดง จำนวน เงิน ที่ เดิมพัน ปัจจุบัน",
"Rules_6_7": "จำนวน เงิน ที่ ชนะ",
"Rules_6_7": "จำนวนเงินที่ชนะ",
"Rules_6_7_1": "แสดง จำนวน เงิน ที่ ได้รับ จาก การ เล่น รอบ นี้",
"Rules_6_8": "สปิน อัตโนมัติ",
"Rules_6_8": "สปินอัตโนมัติ",
"Rules_6_8_1": "เล่น เกม โดย อัตโนมัติ ตาม จำนวน ครั้ง ที่ เลือก",
"Rules_6_8_2": "แตะ ตัวเลข เพื่อ เลือก จำนวน สปิน อัตโนมัติ",
"Rules_6_9": "เทอร์โบ สปิน",
"Rules_6_9": "เทอร์โบสปิน",
"Rules_6_9_1": "แตะ เพื่อ เปิด หรือ ปิด เทอร์โบ สปิน เพื่อ ลด ระยะเวลา การ หมุน วงล้อ",
"Rules_7": "ข้อมูล เพิ่มเติม",
"Rules_7": "ข้อมูลเพิ่มเติม",
"Rules_7_1": "การ ทำงาน ผิดพลาด จะ ทำให้ การ จ่าย เงิน และ การ เล่น ทั้งหมด เป็น โมฆะ",
"Rules_7_2": "ใน กรณี ที่ มี ข้อ พิพาท เกี่ยวกับ ผล เกม ผล เกม ทั้งหมด ที่ แสดง ใน หน้า ประวัติ ถือเป็น ที่ สิ้นสุด และ ไม่ มี เปลี่ยนแปลง",
"Select Date Range": "กำหนด เอง",
"Time": "กำไร",
"Today": "เวลา",
"Transaction": "ไม่มี ประวัติ การ เล่น",
"Win Multiplier": "เดิมพัน / เดิมพัน พื้นฐาน x ค่า ตัวคูณ สัญลักษณ์",
"of a Kind": "เดิมพัน / เดิมพัน พื้นฐาน x ค่า ตัวคูณ สัญลักษณ์ x Way",
"way(s)": "เดิมพัน / เดิมพัน พื้นฐาน x ค่า ตัวคูณ สัญลักษณ์ x Way x ตัวคูณ"
"Select Date Range": "ลืกช่ววันที่",
"Time": "เวลา",
"Today": "วันนี้",
"Transaction": "รายการ",
"Win Multiplier": "ตัวคูณรางวัล",
"of a Kind": "ชนิดเดียวกัน",
"way(s)": "Way"
},
"tr": {
"All record(s) displayed": "Tüm Kayıtlar Görüntülendi",

View File

@ -13487,7 +13487,7 @@
"_lpos": {
"__type__": "cc.Vec3",
"x": 0,
"y": 157.016,
"y": 303.558,
"z": 0
},
"_lrot": {
@ -13528,7 +13528,7 @@
"_contentSize": {
"__type__": "cc.Size",
"width": 1080,
"height": 1300
"height": 1000
},
"_anchorPoint": {
"__type__": "cc.Vec2",

View File

@ -500,7 +500,7 @@
"__expectedType__": "sp.SkeletonData"
},
"defaultSkin": "default",
"defaultAnimation": "",
"defaultAnimation": "1_1",
"_premultipliedAlpha": false,
"_timeScale": 1,
"_preCacheMode": 0,

View File

@ -500,7 +500,7 @@
"__expectedType__": "sp.SkeletonData"
},
"defaultSkin": "default",
"defaultAnimation": "<None>",
"defaultAnimation": "1_1",
"_premultipliedAlpha": false,
"_timeScale": 1,
"_preCacheMode": 0,

View File

@ -1,146 +0,0 @@
[
{
"__type__": "cc.Prefab",
"_name": "readyHand",
"_objFlags": 0,
"__editorExtras__": {},
"_native": "",
"data": {
"__id__": 1
},
"optimizationPolicy": 0,
"persistent": false
},
{
"__type__": "cc.Node",
"_name": "readyHand",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": null,
"_children": [],
"_active": true,
"_components": [
{
"__id__": 2
},
{
"__id__": 4
}
],
"_prefab": {
"__id__": 6
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_lrot": {
"__type__": "cc.Quat",
"x": 0,
"y": 0,
"z": 0,
"w": 1
},
"_lscale": {
"__type__": "cc.Vec3",
"x": 1,
"y": 1,
"z": 1
},
"_mobility": 0,
"_layer": 33554432,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_id": ""
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 3
},
"_contentSize": {
"__type__": "cc.Size",
"width": 149.36000061035156,
"height": 721.510009765625
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.49377343129770096,
"y": 0.49974359668460616
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "b1mehXP45KqZ5ylDhnzjMj"
},
{
"__type__": "sp.Skeleton",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 5
},
"_customMaterial": null,
"_srcBlendFactor": 2,
"_dstBlendFactor": 4,
"_color": {
"__type__": "cc.Color",
"r": 255,
"g": 255,
"b": 255,
"a": 255
},
"_skeletonData": {
"__uuid__": "c540ca75-7466-4e9a-aa3f-f1d031999a27",
"__expectedType__": "sp.SkeletonData"
},
"defaultSkin": "default",
"defaultAnimation": "readyHand_01",
"_premultipliedAlpha": true,
"_timeScale": 1,
"_preCacheMode": 0,
"_cacheMode": 0,
"_sockets": [],
"_useTint": false,
"_debugMesh": false,
"_debugBones": false,
"_debugSlots": false,
"_enableBatch": false,
"loop": true,
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "092Em93rtLuav6edDSYQF4"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "e8VoLh3KlENrVZJLIIITZJ",
"targetOverrides": null
}
]

View File

@ -1,13 +0,0 @@
{
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "f6c8dc7d-3478-495c-a358-5abb883f7aab",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "readyHand"
}
}

View File

@ -370,7 +370,7 @@
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 70,
"x": 0,
"y": 94,
"z": 0
},

View File

@ -2,7 +2,7 @@
"ver": "1.2.0",
"importer": "directory",
"imported": true,
"uuid": "6433b29b-f544-440f-8be6-477a5c024f7c",
"uuid": "3da1f9de-d18f-40f5-a7f8-94737743b012",
"files": [],
"subMetas": {},
"userData": {}

View File

@ -0,0 +1,440 @@
Entering Scatter.png
size: 2033,1250
format: RGBA8888
filter: Linear,Linear
repeat: none
a/lizi_00
rotate: false
xy: 1441, 2
size: 86, 122
orig: 300, 300
offset: 107, 178
index: -1
a/lizi_01
rotate: false
xy: 380, 2
size: 89, 126
orig: 300, 300
offset: 106, 174
index: -1
a/lizi_02
rotate: false
xy: 1694, 5
size: 92, 130
orig: 300, 300
offset: 104, 170
index: -1
a/lizi_03
rotate: true
xy: 1260, 18
size: 96, 135
orig: 300, 300
offset: 102, 165
index: -1
a/lizi_04
rotate: true
xy: 1075, 6
size: 99, 139
orig: 300, 300
offset: 101, 161
index: -1
a/lizi_05
rotate: true
xy: 471, 2
size: 103, 143
orig: 300, 300
offset: 99, 157
index: -1
a/lizi_06
rotate: true
xy: 926, 26
size: 107, 147
orig: 300, 300
offset: 97, 153
index: -1
a/lizi_07
rotate: true
xy: 1620, 335
size: 110, 151
orig: 300, 300
offset: 96, 149
index: -1
a/lizi_08
rotate: false
xy: 810, 25
size: 114, 155
orig: 300, 300
offset: 94, 145
index: -1
a/lizi_09
rotate: true
xy: 1788, 3
size: 117, 159
orig: 300, 300
offset: 93, 141
index: -1
a/lizi_10
rotate: true
xy: 1529, 3
size: 121, 163
orig: 300, 300
offset: 91, 137
index: -1
a/lizi_11
rotate: false
xy: 810, 182
size: 124, 168
orig: 300, 300
offset: 90, 132
index: -1
a/lizi_12
rotate: true
xy: 616, 8
size: 128, 172
orig: 300, 300
offset: 88, 128
index: -1
a/lizi_13
rotate: true
xy: 1422, 740
size: 132, 176
orig: 300, 300
offset: 87, 124
index: -1
a/lizi_14
rotate: true
xy: 1241, 736
size: 136, 179
orig: 300, 300
offset: 85, 121
index: -1
a/lizi_15
rotate: false
xy: 951, 537
size: 140, 183
orig: 300, 300
offset: 84, 117
index: -1
a/lizi_16
rotate: true
xy: 1813, 122
size: 144, 187
orig: 300, 300
offset: 82, 113
index: -1
a/lizi_17
rotate: false
xy: 1093, 537
size: 147, 191
orig: 300, 300
offset: 81, 109
index: -1
a/lizi_18
rotate: false
xy: 936, 135
size: 151, 195
orig: 300, 300
offset: 79, 105
index: -1
a/lizi_19
rotate: true
xy: 566, 821
size: 154, 199
orig: 300, 300
offset: 78, 101
index: -1
a/lizi_20
rotate: false
xy: 937, 332
size: 158, 203
orig: 300, 300
offset: 76, 97
index: -1
a/lizi_21
rotate: false
xy: 1097, 326
size: 161, 209
orig: 300, 300
offset: 75, 91
index: -1
a/lizi_22
rotate: false
xy: 1260, 329
size: 165, 212
orig: 300, 300
offset: 73, 85
index: -1
a/lizi_23
rotate: false
xy: 1089, 107
size: 169, 217
orig: 300, 300
offset: 72, 79
index: -1
a/lizi_24
rotate: true
xy: 1017, 730
size: 173, 222
orig: 300, 300
offset: 70, 74
index: -1
a/lizi_25
rotate: true
xy: 1097, 905
size: 176, 227
orig: 300, 300
offset: 69, 68
index: -1
a/lizi_26
rotate: true
xy: 1326, 874
size: 179, 232
orig: 300, 300
offset: 68, 62
index: -1
a/lizi_27
rotate: true
xy: 705, 537
size: 183, 244
orig: 300, 300
offset: 66, 56
index: -1
a/lizi_28
rotate: false
xy: 510, 359
size: 187, 249
orig: 300, 300
offset: 65, 51
index: -1
a/lizi_29
rotate: true
xy: 1588, 1058
size: 190, 255
orig: 300, 300
offset: 64, 45
index: -1
a/lizi_30
rotate: true
xy: 1326, 1055
size: 193, 260
orig: 300, 300
offset: 63, 40
index: -1
a/lizi_31
rotate: false
xy: 276, 606
size: 195, 266
orig: 300, 300
offset: 63, 34
index: -1
a/lizi_32
rotate: false
xy: 566, 977
size: 199, 271
orig: 300, 300
offset: 61, 29
index: -1
a/lizi_33
rotate: false
xy: 1600, 856
size: 203, 200
orig: 300, 300
offset: 59, 100
index: -1
a/lizi_34
rotate: true
xy: 1441, 126
size: 207, 206
orig: 300, 300
offset: 57, 94
index: -1
a/lizi_35
rotate: false
xy: 597, 138
size: 211, 212
orig: 300, 300
offset: 55, 88
index: -1
a/lizi_36
rotate: false
xy: 380, 130
size: 215, 218
orig: 300, 300
offset: 53, 82
index: -1
a/lizi_37
rotate: false
xy: 174, 82
size: 204, 224
orig: 300, 300
offset: 52, 76
index: -1
a/lizi_38
rotate: true
xy: 473, 610
size: 209, 230
orig: 300, 300
offset: 50, 70
index: -1
a/lizi_39
rotate: true
xy: 699, 352
size: 183, 236
orig: 300, 300
offset: 78, 64
index: -1
a/lizi_40
rotate: false
xy: 1845, 1006
size: 186, 242
orig: 300, 300
offset: 77, 58
index: -1
a/lizi_41
rotate: true
xy: 767, 722
size: 188, 248
orig: 300, 300
offset: 77, 52
index: -1
a/lizi_42
rotate: false
xy: 341, 350
size: 167, 254
orig: 300, 300
offset: 76, 46
index: -1
a/lizi_43
rotate: false
xy: 185, 337
size: 154, 260
orig: 300, 300
offset: 91, 40
index: -1
a/lizi_44
rotate: true
xy: 767, 912
size: 159, 266
orig: 300, 300
offset: 89, 34
index: -1
a/lizi_45
rotate: true
xy: 1052, 1083
size: 165, 272
orig: 300, 300
offset: 86, 28
index: -1
a/lizi_46
rotate: false
xy: 2, 28
size: 170, 278
orig: 300, 300
offset: 84, 22
index: -1
a/lizi_47
rotate: true
xy: 767, 1073
size: 175, 283
orig: 300, 300
offset: 82, 17
index: -1
a/lizi_48
rotate: false
xy: 2, 308
size: 181, 289
orig: 300, 300
offset: 79, 11
index: -1
a/lizi_49
rotate: true
xy: 1813, 268
size: 185, 172
orig: 300, 300
offset: 77, 128
index: -1
a/lizi_50
rotate: true
xy: 1426, 547
size: 191, 175
orig: 300, 300
offset: 74, 125
index: -1
a/lizi_51
rotate: true
xy: 1649, 137
size: 196, 162
orig: 300, 300
offset: 72, 138
index: -1
a/lizi_52
rotate: true
xy: 1620, 447
size: 201, 167
orig: 300, 300
offset: 70, 133
index: -1
a/lizi_53
rotate: false
xy: 1805, 831
size: 206, 173
orig: 300, 300
offset: 67, 127
index: -1
a/lizi_54
rotate: true
xy: 1260, 116
size: 211, 179
orig: 300, 300
offset: 65, 121
index: -1
a/lizi_55
rotate: false
xy: 1789, 455
size: 177, 185
orig: 300, 300
offset: 63, 115
index: -1
a/lizi_56
rotate: false
xy: 1242, 543
size: 182, 191
orig: 300, 300
offset: 60, 109
index: -1
a/lizi_57
rotate: true
xy: 1792, 642
size: 187, 198
orig: 300, 300
offset: 58, 102
index: -1
a/lizi_58
rotate: false
xy: 1603, 650
size: 187, 204
orig: 300, 300
offset: 56, 96
index: -1
a/lizi_59
rotate: false
xy: 1427, 335
size: 191, 210
orig: 300, 300
offset: 54, 90
index: -1
g40
rotate: false
xy: 2, 599
size: 272, 273
orig: 283, 289
offset: 6, 10
index: -1
sg
rotate: false
xy: 2, 874
size: 562, 374
orig: 562, 374
offset: 0, 0
index: -1

View File

@ -0,0 +1,12 @@
{
"ver": "1.0.0",
"importer": "*",
"imported": true,
"uuid": "94e1d9e0-4e68-4331-8532-513a89d5ce87",
"files": [
".atlas",
".json"
],
"subMetas": {},
"userData": {}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,11 @@
{
"ver": "1.2.6",
"importer": "spine-data",
"imported": true,
"uuid": "bcdec64d-b16f-460d-99ed-d115f9226426",
"files": [
".json"
],
"subMetas": {},
"userData": {}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 937 KiB

View File

@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "f07b133b-d924-4fa6-a0c9-52c48c852b5f",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "f07b133b-d924-4fa6-a0c9-52c48c852b5f@6c48a",
"displayName": "Entering Scatter",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "f07b133b-d924-4fa6-a0c9-52c48c852b5f",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "f07b133b-d924-4fa6-a0c9-52c48c852b5f@f9941",
"displayName": "Entering Scatter",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 2,
"trimY": 2,
"width": 2029,
"height": 1246,
"rawWidth": 2033,
"rawHeight": 1250,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-1014.5,
-623,
0,
1014.5,
-623,
0,
-1014.5,
623,
0,
1014.5,
623,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
2,
1248,
2031,
1248,
2,
2,
2031,
2
],
"nuv": [
0.000983767830791933,
0.0016,
0.9990162321692081,
0.0016,
0.000983767830791933,
0.9984,
0.9990162321692081,
0.9984
],
"minPos": [
-1014.5,
-623,
0
],
"maxPos": [
1014.5,
623,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "f07b133b-d924-4fa6-a0c9-52c48c852b5f@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "f07b133b-d924-4fa6-a0c9-52c48c852b5f@6c48a"
}
}

View File

@ -41,6 +41,7 @@ import { AudioManager } from "../../Loading/scripts/manager/AudioManager";
import { showFromBottom, hideToBottom } from "./game/Tools";
import { SpinAni } from "./game/SpinAni";
import { SlotGame } from "./SlotGame";
const { ccclass, property } = _decorator;
@ -52,6 +53,8 @@ export class SlotBar extends Component {
@property(Node)
private tipSmall: Node = null;
@property(SlotGame)
private slotGame: SlotGame = null;
@property(Prefab)
pfb_history: Prefab = null;
@ -90,7 +93,6 @@ export class SlotBar extends Component {
private turboBtnAni: Animation = null;
private freeSpinBg: Node = null;
private spin_lihua: sp.Skeleton = null
private left_1: Node = null;
private leftCount: Label = null;
private left_2: Node = null;
@ -141,7 +143,6 @@ export class SlotBar extends Component {
this.menuBtn = this.btns1.getChildByName("ic_menu").getComponent(Button);
this.freeSpinBg = this.node.getChildByName("FreeSpinBg");
this.spin_lihua = this.freeSpinBg.getChildByName("spin_lihua").getComponent(sp.Skeleton);
this.left_1 = this.freeSpinBg.getChildByName("left_1");
this.left_2 = this.freeSpinBg.getChildByName("left_2");
this.leftCount = this.left_1
@ -181,6 +182,7 @@ export class SlotBar extends Component {
this.betIndex = 0;
}
// this.setBtnEnable(this.subBtn, this.betIndex > 0);
this.setBalance(this.curBalance);
this.setBet(this.curBet);
this.setWin(this.curWin);
@ -264,12 +266,19 @@ export class SlotBar extends Component {
});
}
allowClickManualStop(bl: boolean) {
this.hasClickSpin = bl;
this.manualStopNode.active = bl
}
notAllowClickManualStop(bl: boolean) {
this.hasClickManualStop = bl;
}
onBtnSpin() {
// 第一次点击 旋转
if (!this.hasClickSpin && !this.hasClickManualStop) {
AudioManager.instance.playSFX("Spin_Button_Click");
this.hasClickSpin = true;
this.manualStopNode.active = true
this.node.emit(SLOT_BAR_EVENT.ON_SPIN_CLICK);
this.spinAni.startSpin();
@ -288,13 +297,14 @@ export class SlotBar extends Component {
// 第一次点击 旋转
if (!this.hasClickSpin && !this.hasClickManualStop) {
// AudioManager.instance.playSFX('Spin_Button_Click');
this.hasClickSpin = true;
this.manualStopNode.active = true
this.setBtnEnable(this.subBtn, false);
this.setBtnEnable(this.addBtn, false);
this.setBtnEnable(this.autoBtn, false);
this.setBtnEnable(this.menuBtn, false);
}
// 第二次点击 手动停止
else if (this.hasClickSpin && !this.hasClickManualStop) {
@ -305,7 +315,7 @@ export class SlotBar extends Component {
onBtnTestSpin(event, args) {
// 第一次点击 旋转
if (!this.hasClickSpin && !this.hasClickManualStop) {
this.hasClickSpin = true;
// this.hasClickSpin = true;
this.node.emit(SLOT_BAR_EVENT.ON_TEST_SPIN_CLICK, args);
this.setBtnEnable(this.subBtn, false);
@ -326,7 +336,7 @@ export class SlotBar extends Component {
}
manualStop() {
this.hasClickManualStop = true;
this.notAllowClickManualStop(true)
this.spinAni.stopSpin();
this.setBtnEnable(this.spinBtn, false);
}
@ -497,6 +507,7 @@ export class SlotBar extends Component {
} else {
this.betIndex = this.betGrade.indexOf(bet);
}
// this.setBtnEnable(this.subBtn, this.betIndex > 0);
// 停止当前的 tween 动画
Tween.stopAllByTarget(this.betLabel.node);
@ -572,6 +583,8 @@ export class SlotBar extends Component {
this.setBtnEnable(this.menuBtn, false);
this.setBtnEnable(this.spinBtn, false);
this.slotGame.showFeatureBuy(true)
this.setBtnVisible(this.spinBtn, false);
this.setBtnVisible(this.stopAutoBtn, true);
@ -592,6 +605,8 @@ export class SlotBar extends Component {
this.setBtnVisible(this.spinBtn, true);
this.setBtnVisible(this.stopAutoBtn, false);
this.setBtnEnable(this.spinBtn, false);
this.slotGame.showFeatureBuy(false)
}
reconnectState(hasDelete: boolean = false) {
@ -605,9 +620,10 @@ export class SlotBar extends Component {
}
resetAllState() {
this.hasClickSpin = false;
this.hasClickManualStop = false;
this.manualStopNode.active = false
this.allowClickManualStop(false)
this.notAllowClickManualStop(false)
this.isAuto = false;
this.setBtnVisible(this.spinBtn, true);
this.spinAni.stopSpin();
@ -618,6 +634,8 @@ export class SlotBar extends Component {
this.setBtnEnable(this.addBtn, true);
this.setBtnEnable(this.menuBtn, true);
this.setBtnEnable(this.autoBtn, true);
this.setBtnEnable(this.subBtn, this.betIndex > 0);
}
onTurboMouseDown() {
@ -684,10 +702,6 @@ export class SlotBar extends Component {
}
}
playSpin_lihua() {
this.spin_lihua.setAnimation(0, 'animation', false)
}
exitFreeSpin() {
this.freeSpinBg.active = false;
this.btns1.active = this.BTNS1_ACTIVE;

View File

@ -7,6 +7,7 @@ import { gold2cash } from '../../Loading/scripts/comm';
import { NodePoolManager } from '../../Loading/scripts/manager/NodePoolManager';
import { I18nManager } from '../../Loading/scripts/manager/I18nManager';
import { AudioManager } from '../../Loading/scripts/manager/AudioManager';
import { UpLayer } from './game/UpLayer';
let { ccclass, property } = _decorator;
//倍率瓶子的所在位置
@ -32,6 +33,9 @@ export class SlotGame extends Component {
@property(Prefab)
multiPre: Prefab = null;
@property(UpLayer)
upLayer: UpLayer = null;
@property(Prefab)
multiLabelPre: Prefab = null;
@ -105,7 +109,7 @@ export class SlotGame extends Component {
this.grayNode = this.node.getChildByName('grayNode');
this.winLayer = this.node.getChildByName('winLayer');
this.readyHand = this.node.getChildByName('readyHand');
this.scatterLayer = this.node.getChildByPath('scatterLayer/layer')
this.scatterLayer = this.node.getChildByPath('scatterLayer')
this.winType = this.node.getChildByName('winType');
@ -225,9 +229,15 @@ export class SlotGame extends Component {
// 初始化滚轮数据
initRollerWithIcon(gameInfo: any) {
this.upLayer.hideAllLayer();
this.rollerManager.setUpLayer(this.upLayer);
this.gameInfo = gameInfo;
this.spinData = this.gameInfo.Data;
this.rollerManager.initRollerWithIcon(this.spinData);
this.rollerManager.vRollers.forEach((roller) => {
this.upLayer.syncSpecialFromRoller(roller);
})
}
setRollerIconRule(rollerIconRule: any) {
@ -239,6 +249,7 @@ export class SlotGame extends Component {
}
spin(isFree: boolean) {
this.upLayer.giveBackAllSpecials(this.rollerManager);
AudioManager.instance.playSFX('Spin_Button_Click');
this.setWaysCount('...');
if (!isFree) {
@ -578,10 +589,15 @@ export class SlotGame extends Component {
if (this.rollerManager.checkNextRollerExpect(6, 3)) {
AudioManager.instance.playSFX('Appear_Scatter_Sound_elimin', 1, true)
this.rollerManager.iconFallDown(this.spinData, true);
this.scheduleOnce(() => {
this.node.getChildByName('awaitScatter').active = true
}, 0.2)
this.scheduleOnce(() => {
AudioManager.instance.stopAllSFX()
this.setWaysCount(this.spinData.Symbol.WaysNum);
this.rollerManager.iconFallDown(this.spinData, false);
this.node.getChildByName('awaitScatter').active = false
}, 2.5)
} else {
this.scheduleOnce(() => {
@ -597,6 +613,8 @@ export class SlotGame extends Component {
}
onRollerStop(rollerId: number) {
let roller = this.rollerManager.allRollers[rollerId];
this.upLayer.syncSpecialFromRoller(roller);
// if (rollerId < 1) return;
// 计算当前停止列之前的所有数字的乘积
let totalWays = 1;
@ -627,6 +645,7 @@ export class SlotGame extends Component {
// 新增:事件处理方法
onAllRollerIconsDeleted() {
this.upLayer.giveBackAllSpecials(this.rollerManager);
// 向上传递事件
this.node.emit(SLOT_GAME_EVENT.ALL_ROLLER_ICONS_DELETED);
}
@ -637,6 +656,7 @@ export class SlotGame extends Component {
}
onAllRollerIconsFallen() {
this.upLayer.resetAndSyncAllSpecials(this.rollerManager);
// 向上传递事件
this.node.emit(SLOT_GAME_EVENT.ALL_ROLLER_ICONS_FALLEN);
}

View File

@ -23,6 +23,7 @@ import { FreeSpinEnter } from "./game/FreeSpinEnter";
import { FreeSpinAdd } from "./game/FreeSpinAdd";
import { SysGift } from "./game/SysGift";
import { ErrorManager } from "../../Loading/scripts/manager/ErrorManager";
import { SlotRanking } from "../SlotRanking/scripts/SlotRanking";
let { ccclass, property } = _decorator;
@ -36,6 +37,7 @@ interface GameState {
isInFreeSpin: boolean;
isOneRoundEnd: boolean;
isDebug: boolean;
isFeatureBuySpin: boolean;
}
// 自动旋转配置接口
@ -51,7 +53,7 @@ interface AutoSpinConfig {
export class SlotScene extends Component {
// 组件引用
@property(SlotGame)
private slotGame: SlotGame = null;
public slotGame: SlotGame = null;
@property(SlotBar)
private slotBar: SlotBar = null;
@ -77,6 +79,9 @@ export class SlotScene extends Component {
@property(SysGift)
private SysGift: SysGift = null;
@property(SlotRanking)
slotRanking: SlotRanking = null;
// 游戏数据
private gameInfo: GameInfo = null;
private spinInfo: any = null;
@ -87,7 +92,7 @@ export class SlotScene extends Component {
private objectId: string[] = [];
// 游戏状态管理
private gameState: GameState = {
public gameState: GameState = {
isOnReconnect: false,
isAutoSpin: false,
isEliminating: false,
@ -95,6 +100,7 @@ export class SlotScene extends Component {
isFirstFreeSpin: false,
isInFreeSpin: false,
isOneRoundEnd: false,
isFeatureBuySpin: false,
isDebug: false,
};
@ -110,8 +116,10 @@ export class SlotScene extends Component {
batchingTimer: number = 0;
isErr: boolean = false;
async start() {
this.slotRanking.node.active = true
this.slotRanking.setSlotScene(this);
await this.init();
// this.TotalWin.show(505000, 10)
// this.FreeSpinEnter.show(8)
@ -265,6 +273,8 @@ export class SlotScene extends Component {
this.node.addChild(panel);
featureBuy.show(this.slotBar.getBet(), this.gameInfo.BuyMul, () => {
this.spinBtnClick(false, true);
this.gameState.isFeatureBuySpin = true;
this.slotBar.featureBuySpin();
});
}
@ -313,7 +323,8 @@ export class SlotScene extends Component {
}
if (!this.gameState.isDebug) {
this.spinInfo = await callGameApi("spin", msg);
this.slotBar.allowClickManualStop(true)
this.slotBar.notAllowClickManualStop(false)
if (this.spinInfo.Frb.Ongoing) {
if (!isFreeSpin) {
let count = this.spinInfo.Frb.Ongoing.Frn;
@ -375,9 +386,9 @@ export class SlotScene extends Component {
if (!this.isReceiveMsg) return;
// 免费游戏不能手动停止
if (this.gameState.isInFreeSpin) {
return;
}
// if (this.gameState.isInFreeSpin) {
// return;
// }
// 滚轮没有开始旋转的时候不能停止
if (!this.slotGame.isScroll()) return;
@ -777,6 +788,8 @@ export class SlotScene extends Component {
isReconnect: boolean = false
) {
this.gameState.isFirstFreeSpin = false;
this.gameState.isFeatureBuySpin = false;
this.gameState.isInFreeSpin = false;
this.slotBar.exitFreeSpin();
@ -875,10 +888,6 @@ export class SlotScene extends Component {
// delay = 1.2
// }
//小游戏内单次滚动结算中奖时触发一个礼花特效
if (isFreeSpin) {
this.slotBar.playSpin_lihua()
}
this.scheduleOnce(() => {
@ -975,6 +984,14 @@ export class SlotScene extends Component {
);
}
break;
case 5:
msg1 = I18nManager.instance.t('AID_ERROR_CONTENT_4');
msg2 = I18nManager.instance.t('AID_ERROR_CODE_4');
tip = `${msg1}\n${msg2}`;
if (!this.TipPanel.getHasTip()) {
this.TipPanel.showTip(title, tip, () => { window.close() }, () => { callback?.(); }, I18nManager.instance.t('AID_ERROR_QUIT_BUTTON'), I18nManager.instance.t('AID_ERROR_RETRY_BUTTON'), true);
}
break;
}
}

View File

@ -30,6 +30,7 @@ export class Info {
receiveStopData: boolean = false;// 是否收到停止数据
speedDataComplete: boolean = false;// 速度数据是否完成
stopSpeedData: number[][] = null;// 停止时的速度数据
hasStopScrollWork: boolean = false;
state: ROLLER_STATE = ROLLER_STATE.STOP; // 当前状态
isFastSpin: boolean = false; // 是否快速旋转
isManualStop: boolean = false; // 是否手动停止
@ -47,6 +48,7 @@ export class Info {
this.speed = 0;
this.stopSpeedData = null;
this.isManualStop = false;
this.hasStopScrollWork = false;
this.speedDataComplete = false;
}
}
@ -68,7 +70,7 @@ export abstract class BaseRoller extends Component {
iconFactory: IconFactory = null;
// 保护属性,子类可访问
protected _rollerId: number = 0;
_rollerId: number = 0;
protected _view: Node = null;
protected _content: Node = null;
protected _info: Info = new Info();
@ -389,15 +391,15 @@ export abstract class BaseRoller extends Component {
*
* @param data
*/
stopScroll(data: number[], stopSpeedData: number[][]) {
this._stopData = data;
this._info.receiveStopData = true;
// stopScroll(data: number[], stopSpeedData: number[][]) {
// this._stopData = data;
// this._info.receiveStopData = true;
// 如果速度数据已完成,执行停止逻辑
if (this._info.speedDataComplete) {
this.stopScrollWork(stopSpeedData);
}
}
// // 如果速度数据已完成,执行停止逻辑
// if (this._info.speedDataComplete) {
// this.stopScrollWork(stopSpeedData);
// }
// }
/**
@ -606,7 +608,7 @@ export abstract class BaseRoller extends Component {
return null; // 返回安全的默认值
}
return this._content.getComponent(UITransform).convertToWorldSpaceAR(icon.position);
return icon.getWorldPosition();
}
/**

View File

@ -389,6 +389,11 @@ export class BigWinUI extends Component {
this.unscheduleAllCallbacks();
this.currentScore = this.winScore;
this.updateScoreLabel();
this.bigWinAudio.stop();
this.bigWinAudio.clip = this.bigWinAudioClips[3];
if (!AudioManager.instance.getMuted()) {
this.bigWinAudio.play();
}
this.endAni();
return;
}

View File

@ -236,7 +236,7 @@ export class HistoryDetail extends Component {
info.getChildByName("Label_Bet").getComponent(Label).string = getTranslate(this.dict, "Bet") + `(${currencySymbol})`;
info.getChildByName("txt_profit").getComponent(Label).string = fixNum(pan.WinInfo ? pan.WinInfo.Score : 0);
info.getChildByName("txt_profit").getComponent(Label).string = fixNum(pan.Profit);
info.getChildByName("Label_Profit").getComponent(Label).string = getTranslate(this.dict, "Profit") + `(${currencySymbol})`;
info.getChildByName("txt_balance_before").getComponent(Label).string = fixNum(pan.Balance - pan.AllScore + pan.Bet) + "➡️";
@ -432,7 +432,7 @@ export class HistoryDetail extends Component {
}
// scatter 数量统计 node_scatter
if (pan.Symbol.ScNum >= 4 && pan.Free.GamesTimes >= 10) {
if (pan.Symbol.ScNum >= 4 && (pan.Free && pan.Free.GamesTimes >= 10)) {
const node_scatter = content.getChildByName("node_scatter")
const txt_scatter_num = node_scatter.getChildByName("txt_scatter_num").getComponent(Label)
txt_scatter_num.string = "x " + pan.Symbol.ScNum

View File

@ -2,6 +2,7 @@ import { _decorator, Component, Node, Prefab, sp, Sprite, UITransform, Vec3, v3,
import { ICON_STATE, ICON_WIDTH } from './Define';
import { GameDataManager } from 'db://assets/Loading/scripts/manager/GameDataManager';
import { NodePoolManager } from 'db://assets/Loading/scripts/manager/NodePoolManager';
import { RollerManager } from './RollerManager';
const { ccclass, property } = _decorator;
@ -302,6 +303,18 @@ export class Icon extends Component {
transform.width = ICON_WIDTH;
}
// let rollerManager = this.node.parent.parent.parent.parent.parent.parent.getComponent(RollerManager)
// let scatterLayer = rollerManager.node.parent.getChildByName('scatterLayer')
// if (this._iconId == 1) {
// let worldPos = rollerManager.getIconWorldPosition(pos);
// let localPos = scatterLayer.getComponent(UITransform).convertToNodeSpaceAR(worldPos);
// this.node.parent = scatterLayer;
// this.node.setPosition(localPos);
// }
// if (this._iconId == 1) {
// this.node.parent = scatterLayer;
// this.node.setPosition(this.getWorldPosition());
// }
// 重置状态
@ -443,6 +456,11 @@ export class Icon extends Component {
if (!this.iconSpine || !this.iconSpine.node) return;
this.iconSpine.node.active = true;
if (this._isWildOrScatter) {
this.iconSpine.timeScale = 1
this.iconSpine.clearTracks()
this.iconSpine.setAnimation(0, `${this.lHeight}_1`, true);
}
this._normalSpriteNode && (this._normalSpriteNode.active = false);
// 使用计时器回调而不是匿名函数,减少闭包
@ -457,10 +475,12 @@ export class Icon extends Component {
private playSpawnAnimation() {
if (!this.iconSpine) return;
if (this._isWildOrScatter) {
this.iconSpine.timeScale = 1
this.iconSpine.setAnimation(0, `${this.lHeight}_1`, true);
} else if (this._isQKJ) {
// if (this._isWildOrScatter) {
// this.iconSpine.timeScale = 1
// this.iconSpine.clearTracks()
// this.iconSpine.setAnimation(0, `${this.lHeight}_1`, true);
// } else
if (this._isQKJ) {
this.iconSpine.setAnimation(0, "animation", false);
} else {
this.iconSpine.setAnimation(0, "tan", false);

View File

@ -226,23 +226,53 @@ export class Roller extends BaseRoller {
});
}
stopScroll(panData: number[], stopSpeedDataExpect?: number[][]) {
this._stopData = panData;
let stopSpeedData = [];
if (stopSpeedDataExpect) {
stopSpeedData = stopSpeedDataExpect;
} else {
let rollerSpeed = this.row * this.iconHeight / 0.1 * 175;
stopSpeedData = this._info.isFastSpin ? [[0, rollerSpeed]] : [[0.4, 5500]];
}
this._info.receiveStopData = true;
if (this._info.speedDataComplete) {
this.stopScrollWork(stopSpeedData);
}
}
getNodeMsgFromPos(pos: number): { node: Node, start: number, height: number } | null {
let iconNode = this.getIconNode(pos);
if (!iconNode) return null;
let start = iconNode.getComponent(Icon).startPos;
let height = iconNode.getComponent(Icon).lHeight;
return { node: iconNode, start: start, height: height };
}
stopScrollWork(stopSpeedData: number[][]) {
this._info.hasStopScrollWork = true;
this.changeState(ROLLER_STATE.DECELERATE);
this._info.stopSpeedData = stopSpeedData;
this.tweenSpeed(this._info.stopSpeedData, () => {
this.changeState(ROLLER_STATE.LAST_PAGE_CREATE);
});
}
/**
*
* @param data
*/
async manualStopScroll(data: number[]) {
if (this._info.isManualStop ||
this._info.state === ROLLER_STATE.STOP) {
return;
}
this._info.resetLxInfo();
this.resetInfo();
this._stopData = data;
this._info.isManualStop = true;
Tween.stopAllByTarget(this._info.speedNode);
// 直接回收所有动态图标
// 回收所有动态图标
while (this._info.icons.length > 0) {
let icon = this._info.icons.pop();
this.iconFactory.recycleIcon(icon);
@ -257,14 +287,8 @@ export class Roller extends BaseRoller {
this.iconFactory.recycleIcon(icon);
}
}
this._allIcons.clear();
this._posToIconKey.clear();
this.createInitIcons(data);
// 为所有创建的图标播放动画
for (let icon of this._allIcons.values()) {
icon.getComponent(Icon).playSpawnAni();
}
this.changeState(ROLLER_STATE.STOP);
}

View File

@ -43,6 +43,8 @@ export class RollerManager extends Component {
{ row: 5, col: 1 },
{ row: 5, col: 1 },
];
upLayer: any = null;
// 竖向滚轮数组
vRollers: Roller[] = [];
// 滚轮数组
@ -112,7 +114,7 @@ export class RollerManager extends Component {
let UIComponent = maskNode.addComponent(UITransform);
comp.type = Mask.Type.GRAPHICS_RECT;
UIComponent.setContentSize(1040, 840)
UIComponent.setContentSize(1040, 830)
return maskNode;
}
@ -134,6 +136,10 @@ export class RollerManager extends Component {
}
}
setUpLayer(upLayer: any) {
this.upLayer = upLayer;
}
registerEvent() {
for (let lx = 0; lx < this.allRollers.length; lx++) {
let roller = this.allRollers[lx];
@ -268,8 +274,12 @@ export class RollerManager extends Component {
AudioManager.instance.playSFX('Appear_Scatter_Sound');
}
if (!isWild && !isScatter && this._isFastSpin) {
AudioManager.instance.playSFX('Scroll_Stop_Sound');
if (!isWild && !isScatter) {
if (this._isFastSpin) {
AudioManager.instance.playSFX('Scroll_Stop_Sound_fast');
} else {
AudioManager.instance.playSFX('Scroll_Stop_Sound_normal');
}
}
}
@ -510,18 +520,9 @@ export class RollerManager extends Component {
}
}
} else {
frameOrder.forEach(({ frame, ids }) => {
let delay = Math.max(0, (frame - 1) / fps);
ids.forEach(id => {
let roller = this.allRollers[id];
if (roller) {
this.scheduleOnce(() => {
if (this._isManualStop) return;
this.allRollers.forEach(roller => {
roller.startScroll();
}, delay);
}
});
});
})
}
}
@ -571,6 +572,8 @@ export class RollerManager extends Component {
roller.setCroSymbols(rollerCroSymbols);
roller.manualStopScroll(stopData)
}
this.upLayer.resetAndSyncAllSpecials(this);
}
// 对服务器下发的数据进行操作
@ -638,6 +641,7 @@ export class RollerManager extends Component {
uniquePositions.forEach(pos => {
let iconNode = this.getIconNode(pos);
if (iconNode) {
this.upLayer.removeSpecialByNode(iconNode);
// 保存原始父节点和位置信息到Map中
this.winIconNodeMap.set(pos, {
node: iconNode,

View File

@ -28,13 +28,6 @@ export class SysGift extends Component {
onLoad(): void {
this.hideAll();
let sp_win = this.info.getChildByName("sysgift_win")
sp_win.getComponent(LocalizedSprite).fetchRender();
let scale = 116 / sp_win.getComponent(Sprite).spriteFrame.width;
sp_win.setScale(scale, scale, scale);
}
hideAll() {
@ -53,9 +46,10 @@ export class SysGift extends Component {
let txt_spin_num = this.info.getChildByName("count")
txt_spin_num.getComponent(Label).string = (frb.Ongoing.Frn.toLocaleString())
let sp_win = this.info.getChildByName("sysgift_win")
let txt_win = this.info.getChildByName("win")
let scale = 116 / sp_win.getComponent(Sprite).spriteFrame.width;
sp_win.setScale(scale, scale, scale);
let num = Math.round(frb.Ongoing.Fra * 100 + 1e-6) / 100;
txt_win.getComponent(Label).string = num.toLocaleString('en-US', {

View File

@ -0,0 +1,99 @@
import { _decorator, Component, instantiate, Node, sp, tween, UIOpacity, UITransform, v3 } from 'cc';
import { PREVIEW } from 'cc/env';
import { Icon } from './Icon';
import { Roller } from './Roller';
import { RollerManager } from './RollerManager';
let { ccclass, property } = _decorator;
@ccclass('UpLayer')
export class UpLayer extends Component {
@property(Node)
wildLayer: Node = null;
@property(Node)
scatterLayer: Node = null;
// 统一隐藏所有层
hideAllLayer() {
this.wildLayer.active = false;
this.scatterLayer.active = false;
}
// ---------------------------------------readyHandNode、scatterLayer、wildLayer相关 ---------------------------------------
adopted = new Map<Node, { rollerId: number; startPos: number; height: number; type: 'wild' | 'scatter' }>();
setSpecialLayersActive() {
let hasWild = Array.from(this.adopted.values()).some(v => v.type === 'wild');
let hasScatter = Array.from(this.adopted.values()).some(v => v.type === 'scatter');
this.wildLayer.active = hasWild;
this.scatterLayer.active = hasScatter;
}
adoptSpecial(node: Node, rollerId: number, startPos: number, height: number, type: 'wild' | 'scatter') {
if (!node || !node.isValid) return;
if (this.adopted.has(node)) return;
let wp = node.worldPosition.clone();
let layer = type === 'wild' ? this.wildLayer : this.scatterLayer;
layer.active = true;
node.parent = layer;
node.setWorldPosition(wp);
node.setSiblingIndex(9999);
this.adopted.set(node, { rollerId, startPos, height, type });
this.setSpecialLayersActive();
}
// 增量同步某列(停轮/单列落定时可用)
syncSpecialFromRoller(roller: Roller) {
if (!roller) return;
let seen = new Set<Node>();
for (let i = 0; i < roller.row; i++) {
let n = (roller as any).getIconNode(i);
if (!n || seen.has(n)) continue;
seen.add(n);
let icon = n.getComponent(Icon);
if (!icon || !icon._isWildOrScatter) continue;
let msg = (roller as any).getNodeMsgFromPos(i);
if (!msg) continue;
let type: 'wild' | 'scatter' = icon.index === 0 ? 'wild' : 'scatter';
this.adoptSpecial(msg.node, roller._rollerId, msg.start, msg.height, type);
}
}
// 删除前:去登记,避免后续“归还”
removeSpecialByNode(node: Node) {
if (!node) return;
if (this.adopted.delete(node)) this.setSpecialLayersActive();
}
// 统一归还(开新轮或重算前调用)
giveBackAllSpecials(rm: RollerManager) {
if (!rm) return;
this.adopted.forEach((info, node) => {
if (!node || !node.isValid) return;
let roller = rm.allRollers[info.rollerId];
if (!roller) return;
node.parent = roller.node;
node.setPosition(roller.getIconPosition(info.startPos, info.height));
});
this.adopted.clear();
this.setSpecialLayersActive();
}
// 全量重算:不累加,重新扫描所有列
resetAndSyncAllSpecials(rm: RollerManager) {
if (!rm) return;
this.giveBackAllSpecials(rm); // 清空旧数据与节点
for (let i = 0; i < rm.allRollers.length; i++) {
this.syncSpecialFromRoller(rm.allRollers[i]);
}
}
}

View File

@ -2,7 +2,7 @@
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "fff06ff8-efe2-4de7-a99a-f141dbd008f8",
"uuid": "55162d22-5267-4d67-9e5d-d56c2cc460eb",
"files": [],
"subMetas": {},
"userData": {}

File diff suppressed because it is too large Load Diff

View File

@ -76,7 +76,9 @@ export class LayoutAdapter extends Component {
const texH = this.sprite.spriteFrame.height;
const scale = Math.max(size.width / texW, size.height / texH);
this.BG_01.setScale(scale, scale); // 铺满并保持比例
if (this.Logo.isValid) {
this.changeLoge(size.height)
}
if (this.isMobile()) {

View File

@ -7,7 +7,7 @@ import { PREVIEW } from "cc/env"
const gameId = "rp_11001";
// let apiaddr = "https://rpgames-api.rpfafafahkdev.com";
let apiaddr = "";
let token = "eyJQIjoxMDA5NDksIkUiOjE3NjcwMTU2MDMsIlMiOjEwMDAsIkQiOiJycF8xMTAwMSJ9.ZFVTUEx8b15hwZk9wW3bJxKMkpA3IUlwbgYH5uY-uhA";
let token = "eyJQIjoxMDA5NDksIkUiOjE3Njc4ODExMzMsIlMiOjEwMDEsIkQiOiJycF8xMTAwMSJ9.N2C9PWfr9Vjv_Ve_1OTGwCBh40m1mTg_gZhq3mu43wg";
let language = "en"

View File

@ -1,123 +0,0 @@
import { _decorator, Component, resources } from 'cc';
import { sp } from 'cc';
import { I18nManager } from '../manager/I18nManager';
const { ccclass, property, executeInEditMode } = _decorator;
@ccclass('LocalizedSpine')
export class LocalizedSpine extends Component {
private spineComponent: sp.Skeleton | null = null;
@property({ tooltip: 'Spine资源名字' })
private spineName: string = '';
@property({ tooltip: '默认动画名称' })
private defaultAnimation: string = '';
@property({ tooltip: '是否自动播放默认动画' })
private autoPlay: boolean = true;
onLoad() {
if (!I18nManager.instance.getIsReady()) {
I18nManager.instance.init('en');
}
this.fetchRender();
}
fetchRender() {
if (!this.spineComponent) {
this.spineComponent = this.getComponent(sp.Skeleton);
}
if (this.spineComponent) {
this.updateSpine();
} else {
console.warn(`LocalizedSpine: No Spine component found on node ${this.node.name}`);
this.loadDefaultSpine();
}
}
public updateSpine() {
if (!this.spineComponent || !this.spineName) return;
const currentLanguage = I18nManager.instance.currentLanguage;
const cacheKey = `${currentLanguage}_${this.spineName}`;
// 从I18nManager获取缓存的SpineData
const cachedSpineData = I18nManager.instance.spineCache.get(cacheKey);
if (cachedSpineData) {
this.setNewSpineData(cachedSpineData);
return;
}
// 如果缓存中没有从resources加载
const spinePath = `i18nSprite/${currentLanguage}/${this.spineName}_${currentLanguage}`;
resources.load(spinePath, sp.SkeletonData, (err, spineData) => {
if (err) {
console.warn(`Failed to load spine: ${spinePath}`, err);
this.loadDefaultSpine();
return;
}
if (spineData) {
// 添加到I18nManager的缓存中
I18nManager.instance.spineCache.set(cacheKey, spineData);
this.setNewSpineData(spineData);
}
});
}
private loadDefaultSpine() {
const defaultPath = `i18nSpine/en/${this.spineName}_en`;
const cacheKey = `en_${this.spineName}`;
// 从I18nManager获取默认语言的缓存
const cachedSpineData = I18nManager.instance.spineCache.get(cacheKey);
if (cachedSpineData) {
this.setNewSpineData(cachedSpineData);
return;
}
resources.load(defaultPath, sp.SkeletonData, (err, spineData) => {
if (err) {
console.error('Failed to load default spine:', err);
return;
}
if (spineData) {
I18nManager.instance.spineCache.set(cacheKey, spineData);
this.setNewSpineData(spineData);
}
});
}
private setNewSpineData(newData: sp.SkeletonData) {
if (this.spineComponent) {
this.spineComponent.skeletonData = newData;
// 如果设置了默认动画且启用了自动播放,则播放默认动画
if (this.defaultAnimation && this.autoPlay) {
this.spineComponent.setAnimation(0, this.defaultAnimation, true);
}
}
}
public setSpineName(name: string) {
this.spineName = name;
this.updateSpine();
}
public playAnimation(animName: string, loop: boolean = false) {
if (this.spineComponent) {
this.spineComponent.setAnimation(0, animName, loop);
}
}
onDestroy() {
// 清理组件引用
if (this.spineComponent) {
this.spineComponent.skeletonData = null;
}
this.spineComponent = null;
}
}

View File

@ -1,7 +1,7 @@
import { _decorator, Component, SpriteFrame, Sprite, resources } from 'cc';
import { _decorator, Component, Sprite } from 'cc';
import { I18nManager } from '../manager/I18nManager';
const { ccclass, property, executeInEditMode } = _decorator;
const { ccclass, property } = _decorator;
@ccclass('LocalizedSprite')
export class LocalizedSprite extends Component {
@ -11,95 +11,25 @@ export class LocalizedSprite extends Component {
private spriteName: string = '';
onLoad() {
if (I18nManager.instance.ready) {
this.fetchRender();
}
}
fetchRender() {
if (!this.sprite) {
this.sprite = this.getComponent(Sprite);
}
if (this.sprite) {
this.updateSprite();
} else {
console.warn(`LocalizedSprite: No Sprite component found on node ${this.node.name}`);
this.loadDefaultSprite();
}
}
public updateSprite() {
if (!this.sprite || !this.spriteName) return;
if (!I18nManager.instance.ready) return;
let cacheKey = `${I18nManager.instance.currentLanguage}_${this.spriteName}`;
let cachedFrame = I18nManager.instance.spriteFrameCache.get(cacheKey);
const currentLanguage = I18nManager.instance.currentLanguage;
const cacheKey = `${currentLanguage}_${this.spriteName}`;
// 从I18nManager获取缓存的SpriteFrame
const cachedFrame = I18nManager.instance.spriteFrameCache.get(cacheKey);
if (cachedFrame) {
this.setNewSpriteFrame(cachedFrame);
return;
}
// 如果缓存中没有从resources加载
const spritePath = `i18nSprite/${currentLanguage}/${this.spriteName}/spriteFrame`;
resources.load(spritePath, SpriteFrame, (err, spriteFrame) => {
if (err) {
console.warn(`Failed to load sprite: ${spritePath}`, err);
this.loadDefaultSprite();
return;
}
if (spriteFrame) {
// 添加到I18nManager的缓存中
I18nManager.instance.spriteFrameCache.set(cacheKey, spriteFrame);
this.setNewSpriteFrame(spriteFrame);
}
});
}
private loadDefaultSprite() {
const defaultPath = `i18nSprite/en/${this.spriteName}/spriteFrame`;
const cacheKey = `en_${this.spriteName}`;
// 从I18nManager获取默认语言的缓存
const cachedFrame = I18nManager.instance.spriteFrameCache.get(cacheKey);
if (cachedFrame) {
this.setNewSpriteFrame(cachedFrame);
return;
}
resources.load(defaultPath, SpriteFrame, (err, spriteFrame) => {
if (err) {
console.error('Failed to load default sprite:', err);
return;
}
if (spriteFrame) {
// 添加到I18nManager的缓存中
I18nManager.instance.spriteFrameCache.set(cacheKey, spriteFrame);
this.setNewSpriteFrame(spriteFrame);
}
});
}
private setNewSpriteFrame(newFrame: SpriteFrame) {
if (this.sprite) {
this.sprite.spriteFrame = newFrame;
this.sprite.spriteFrame = cachedFrame;
}
}
public setSpriteName(name: string) {
this.spriteName = name;
this.updateSprite();
}
onDestroy() {
// 只清理当前组件的引用
if (this.sprite) {
this.sprite.spriteFrame = null;
}
this.sprite = null;
updateSpriteForPreload(language: string) {
this.sprite = this.getComponent(Sprite);
let cacheKey = `${language}_${this.spriteName}`;
let cachedFrame = I18nManager.instance.spriteFrameCache.get(cacheKey);
this.sprite.spriteFrame = cachedFrame;
}
}

View File

@ -1,34 +1,46 @@
import { _decorator, Component, Node, ProgressBar, Label, Button, view, VideoPlayer, UITransform, AssetManager, tween, ResolutionPolicy, game, director, Director, sys, macro, JsonAsset } from 'cc';
import { callGameApi, getIsRB7, getLanguage, initReqAddr } from './comm';
import { GameDataManager } from './manager/GameDataManager';
import { ResManager } from './manager/ResManager';
import { AudioManager } from './manager/AudioManager';
import { NodePoolManager } from './manager/NodePoolManager';
import { I18nManager } from './manager/I18nManager';
import { LocalizedSprite } from './i18n/LocalizedSprite';
import { initErrorManager } from './manager/ErrorManager';
let { ccclass, property } = _decorator;
import {
_decorator,
Component,
Node,
ProgressBar,
Label,
UITransform,
tween,
JsonAsset,
Button,
} from "cc";
import {
callGameApi,
getIsRB7,
getLanguage,
initReqAddr,
} from "./comm";
import { DEBUG } from "cc/env";
import { initErrorManager } from "./manager/ErrorManager";
import { I18nManager } from "./manager/I18nManager";
import { LocalizedSprite } from "./i18n/LocalizedSprite";
import { AudioManager } from "./manager/AudioManager";
import { GameDataManager } from "./manager/GameDataManager";
import { ResManager } from "./manager/ResManager";
import { NodePoolManager } from "./manager/NodePoolManager";
@ccclass('LoadingUI')
export class LoadingUI extends Component {
//test
@property(Node)
BG: Node = null;
@property(Node)
LoadingUINode: Node = null;
@property(ProgressBar)
progressBar: ProgressBar = null;
const { ccclass, property } = _decorator;
@ccclass("Loading")
export class Loading extends Component {
// UI组件
@property(Node) progressNode: Node = null;
@property(ProgressBar) progressBar: ProgressBar = null;
@property(Label) progressLabel: Label = null;
@property(Label) loadingLabel: Label = null;
@property(Node) maskSpineNode: Node = null;
@property(Node) lightSpineNode: Node = null;
@property(Node) startBtnNode: Node = null;
@property(Node) LoadingUINode: Node = null;
@property(Node) rb7Logo: Node = null;
@property(JsonAsset) languageJson: JsonAsset = null;
@property(Label)
progressLabel: Label = null;
@property(Label)
loadingTipLabel: Label = null;
@property(Label)
retryTipLabel: Label = null;
tipLabel: Label = null;
@property(Button)
startBtn: Button = null;
@ -36,261 +48,275 @@ export class LoadingUI extends Component {
@property(Label)
startBtnLabel: Label = null;
@property(Node)
GameNode: Node = null;
@property(JsonAsset)
languageJson: JsonAsset = null;
private _networkComplete = false;
private _retryCount = 0;
private readonly MAX_RETRY = 5;
private INITIAL_PROGRESS = 0.3;
private _instanceGameNode = null;
// 加载状态
private isNetworkReady = false;
private readonly PROGRESS_ANIMATION_DURATION = 0.3;
// 进度条阶段
private readonly PROGRESS_INIT = 0.2; // 初始化完成
private readonly PROGRESS_NETWORK = 0.5; // 网络请求完成
private readonly PROGRESS_RESOURCE = 0.9; // 资源加载完成
private readonly PROGRESS_COMPLETE = 1.0; // 完全加载完成
// 新增动画
private maskUITransform: UITransform = null;
private lightNode: Node = null;
// 游戏节点
private gameContainer: Node = null;
private gameNode: Node = null;
protected async onLoad() {
// initErrorManager();
// 初始显示状态
this.initUI();
this.LoadingUINode.active = false;
}
async start() {
try {
initReqAddr();
this.node.getChildByName('Logo').active = getIsRB7();
await I18nManager.instance.init(getLanguage(), this.languageJson);
let language = getLanguage();
if (getLanguage() == 'zh') {
this.node.getChildByPath("Mask/LoadingUINode/logo_zh").active = true;
this.node.getChildByPath("Mask/LoadingUINode/logo_en").active = false;
} else {
this.node.getChildByPath("Mask/LoadingUINode/logo_zh").active = false;
this.node.getChildByPath("Mask/LoadingUINode/logo_en").active = true;
}
// initErrorManager();
await I18nManager.instance.ensureI18nSprite(language, "2");
this.node
.getChildByPath('Mask/LoadingUINode/msg')
.getComponent(LocalizedSprite)
.updateSpriteForPreload(language);
this.node.getChildByPath('Mask/LoadingUINode/msg').active = true;
await I18nManager.instance.init(language, this.languageJson);
I18nManager.instance.updateSceneRenderers();
// this.LoadingUINode.getChildByName("bg").getComponent(LocalizedSprite).fetchRender();
this.LoadingUINode.active = true;
// 更新进度条到 0.4
this.updateProgress(0.4);
this.initializeUI();
// 初始化完成进度条到20%
this.updateProgress(this.PROGRESS_INIT);
try {
await this.initializeSystem();
AudioManager.instance.init();
game.setFrameRate(61);
// this.checkStartLoading();
// 开始网络请求
this.initNetwork();
this.updateLoadingText("AID_LOADING");
} catch (error) {
console.error('Network initialization failed:', error);
this.handleError(error);
}
}
private initUI() {
this.BG.active = true;
this.startBtn.node.active = false;
this.maskUITransform = this.LoadingUINode.getChildByName('mask').getComponent(UITransform);
this.lightNode = this.LoadingUINode.getChildByName('light');
this.updateProgress(this.INITIAL_PROGRESS);
}
private async initNetwork() {
try {
// 更新进度条到 0.6
this.updateProgress(0.6);
this.loadingTipLabel.string = I18nManager.instance.t('AID_LOADING');
this.retryTipLabel.string = '';
let gameInfo = await callGameApi("gameinfo", {});
if (!gameInfo) throw new Error('Get game info failed');
GameDataManager.instance.gameInfo = gameInfo;
// 更新进度条到 0.8
this.updateProgress(0.8);
this._networkComplete = true;
await GameDataManager.instance.preloadFrameTypeCache();
await GameDataManager.instance.preloadSymbolCache();
this.checkStartLoading();
} catch (error) {
console.error('Network initialization failed:', error);
this.handleError(error);
}
}
private checkStartLoading() {
if (this._networkComplete) {
this.LoadingUINode.active = true;
this.startLoadingGameBundle();
}
}
private async startLoadingGameBundle() {
try {
// 显示加载UI
this.loadingTipLabel.string = I18nManager.instance.t('AID_LOADING');
this.retryTipLabel.string = '';
this.startBtn.node.active = false;
// 从 0.8 开始加载
let startProgress = 0.8;
// 使用新的合并函数加载 Bundle 和预制体
this._instanceGameNode = await ResManager.instance.loadPrefabFromBundle(
'Game',
'prefabs/SlotScene',
(finished: number, total: number) => {
if (total <= 0) return;
let bundleProgress = finished / total;
// 将加载进度映射到 0.8-1 的范围
let mappedProgress = startProgress + (bundleProgress * (1 - startProgress));
this.updateProgress(mappedProgress);
}
);
this.updateProgress(1);
this.onLoadComplete();
} catch (error) {
console.error('Loading error:', error);
this.handleError(error);
}
}
private updateProgress(progress: number) {
// 使用 tween 使进度条更新更平滑
tween(this.progressBar)
.to(0.2, { progress: progress }, {
easing: 'smooth',
onUpdate: (target: any, ratio: number) => {
this.progressLabel.string = `${Math.floor(target.progress * 100)}%`;
this.maskUITransform.width = target.progress * 494;
this.lightNode.setPosition(target.progress * 496 - 274, -612, 0);
}
})
.start();
}
private onLoadComplete() {
// 开始游戏
// 延迟一下让用户看到进度条开始
this.scheduleOnce(() => {
this.loadingTipLabel.string = '';
this.retryTipLabel.string = '';
this.startBtn.node.active = true;
this.startBtnLabel.string = I18nManager.instance.t('AID_GET_STARTED');
this.progressBar.node.active = false;
this.progressLabel.node.active = false;
this.maskUITransform.node.active = false;
this.lightNode.active = false;
}, 0.3);
this.startNetworkLoading();
}, 0.2);
} catch (error) {
console.error("Network initialization failed:", error);
this.handleError(error);
}
}
/** 初始化系统 */
private async initializeSystem() {
this.rb7Logo.active = getIsRB7();
}
/** 初始化UI */
private initializeUI() {
this.startBtnNode.active = false;
this.gameContainer = this.node
.getChildByPath('Mask/GameNode')
// 初始化进度条为0
this.updateProgress(0);
}
/** 开始网络加载 */
private async startNetworkLoading() {
this.updateLoadingText("AID_LOADING");
try {
let gameInfo = await callGameApi("gameinfo", {});
GameDataManager.instance.gameInfo = gameInfo;
this.isNetworkReady = true;
// 网络请求完成进度条到50%
this.updateProgress(this.PROGRESS_NETWORK);
// 稍微延迟一下让用户看到进度变化
this.scheduleOnce(() => {
this.startResourceLoading();
}, 0.3);
} catch (error) {
console.error("Network initialization failed:", error);
this.handleError(error);
}
}
private handleError(error: Error) {
this._retryCount++;
this.loadingTipLabel.string = '';
if (this._retryCount <= this.MAX_RETRY) {
// 自动重试
// this.tipLabel.string = `retry(${this._retryCount}/${this.MAX_RETRY})...`;
switch (this._retryCount) {
case 1:
this.retryTipLabel.string = I18nManager.instance.t('AID_NETWORK_RETRY_1');
break
this.tipLabel.string = I18nManager.instance.t("AID_NETWORK_RETRY_1");
break;
case 2:
this.retryTipLabel.string = I18nManager.instance.t('AID_NETWORK_RETRY_2');
break
this.tipLabel.string = I18nManager.instance.t("AID_NETWORK_RETRY_2");
break;
case 3:
this.retryTipLabel.string = I18nManager.instance.t('AID_NETWORK_RETRY_3');
break
this.tipLabel.string = I18nManager.instance.t("AID_NETWORK_RETRY_3");
break;
case 4:
this.retryTipLabel.string = I18nManager.instance.t('AID_NETWORK_RETRY_4');
break
this.tipLabel.string = I18nManager.instance.t("AID_NETWORK_RETRY_4");
break;
case 5:
this.retryTipLabel.string = I18nManager.instance.t('AID_NETWORK_RETRY_5');
break
this.tipLabel.string = I18nManager.instance.t("AID_NETWORK_RETRY_5");
break;
}
this.scheduleOnce(() => {
if (!this._networkComplete) {
this.initNetwork();
this.startNetworkLoading();
} else {
this.startLoadingGameBundle();
this.startResourceLoading();
}
}, 2);
} else {
// 显示重试按钮
this.loadingTipLabel.string = I18nManager.instance.t('AID_LOADING');
this.retryTipLabel.string = '';
this.tipLabel.string = I18nManager.instance.t("AID_LOADING");
this.startBtn.node.active = true;
this.progressBar.node.active = false;
this.progressLabel.node.active = false;
this.maskUITransform.node.active = false;
this.lightNode.active = false;
this.startBtnLabel.string = I18nManager.instance.t('AID_ERROR_RETRY_BUTTON');
this.startBtnLabel.string = I18nManager.instance.t(
"AID_ERROR_RETRY_BUTTON"
);
}
}
/** 开始资源加载 */
private async startResourceLoading() {
if (!this.isNetworkReady) return;
this.tipLabel.string = I18nManager.instance.t("AID_LOADING");
this.startBtnNode.active = false;
this.gameNode = await ResManager.instance.loadPrefabFromBundle(
"Game",
"SlotScene",
(finished: number, total: number) => {
if (total > 0) {
// 资源加载进度从50%到90%
const resourceProgress = finished / total;
const currentProgress =
this.PROGRESS_NETWORK +
resourceProgress * (this.PROGRESS_RESOURCE - this.PROGRESS_NETWORK);
this.updateProgress(currentProgress);
}
}
);
// 资源加载完成进度条到90%
this.updateProgress(this.PROGRESS_RESOURCE);
// 延迟一下然后完成最后的10%
this.scheduleOnce(() => {
this.finishLoading();
}, 0.2);
}
/** 完成加载 */
private finishLoading() {
// this.updateLoadingText('Loading More...');
// 最后10%快速完成
this.updateProgress(this.PROGRESS_COMPLETE);
// 0.5秒后显示开始按钮
this.scheduleOnce(() => {
this.onLoadComplete();
}, 0.5);
}
/** 更新进度条 */
private updateProgress(progress: number) {
tween(this.progressBar)
.to(
this.PROGRESS_ANIMATION_DURATION,
{ progress },
{
easing: "smooth",
onUpdate: (target: any) => {
const currentProgress = target.progress;
this.progressLabel.string = `${Math.floor(currentProgress * 100)}%`;
this.maskSpineNode
.getComponent(UITransform)
.setContentSize(currentProgress * 509, 100);
this.lightSpineNode.setPosition(
currentProgress * 509 - 278,
-612,
0
);
},
}
)
.start();
}
/** 更新加载文本 */
private updateLoadingText(key: string) {
this.loadingLabel.string = I18nManager.instance.t("AID_LOADING");
}
/** 加载完成 */
private onLoadComplete() {
this.startBtnLabel.string = I18nManager.instance.t("AID_GET_STARTED");
this.hideProgressUI();
this.showStartButton();
}
/** 隐藏进度UI */
private hideProgressUI() {
this.loadingLabel.string = '';
this.progressBar.node.active = false;
this.progressLabel.node.active = false;
this.maskSpineNode.active = false;
this.lightSpineNode.active = false;
}
/** 显示开始按钮 */
private showStartButton() {
this.startBtnNode.active = true;
}
/** 开始游戏 */
private startGame() {
if (!this.gameContainer) {
console.error("Game container not found");
return;
}
this.gameContainer.addChild(this.gameNode);
// 隐藏加载界面
this.LoadingUINode.destroy();
}
/** 按钮点击事件 */
onStartBtnClick() {
if (this.startBtnLabel.string === I18nManager.instance.t('AID_ERROR_RETRY_BUTTON')) {
if (
this.startBtnLabel.string ===
I18nManager.instance.t("AID_ERROR_RETRY_BUTTON")
) {
// 重试逻辑
this._retryCount = 0;
this.startBtn.node.active = false;
this.progressBar.node.active = true;
this.progressLabel.node.active = true;
this.maskUITransform.node.active = true;
this.lightNode.active = true;
if (!this._networkComplete) {
this.initNetwork();
this.startNetworkLoading();
} else {
this.startLoadingGameBundle();
this.startResourceLoading();
}
} else if (this.startBtnLabel.string === I18nManager.instance.t('AID_GET_STARTED')) {
this.node.getChildByName('Logo').active = false;
// 确保 GameNode 存在
if (!this.GameNode) {
throw new Error('GameNode is not set');
}
// 添加到场景
this.GameNode.addChild(this._instanceGameNode);
// 隐藏加载界面
this.LoadingUINode.destroy();
} else {
this.startGame();
}
}
onDestroy() {
this.unscheduleAllCallbacks();
tween(this.progressBar).stop();
AudioManager.instance.destroy();
NodePoolManager.instance.clearAll();
}
// UNKNOWN = 0, // 未知平台
// WINDOWS = 1, // Windows
// LINUX = 2, // Linux
// MACOS = 3, // macOS
// ANDROID = 4, // Android
// IOS = 5, // iOS
// MOBILE_BROWSER = 6, // 移动端浏览器
// DESKTOP_BROWSER = 7,// 桌面端浏览器
// WECHAT_GAME = 8, // 微信小游戏
// BAIDU_MINI_GAME = 9,// 百度小游戏
// XIAOMI_QUICK_GAME = 10,// 小米快游戏
// ALIPAY_MINI_GAME = 11, // 支付宝小游戏
// BYTEDANCE_MINI_GAME = 12,// 字节跳动小游戏
// OPPO_MINI_GAME = 13,// OPPO小游戏
// VIVO_MINI_GAME = 14,// vivo小游戏
// HUAWEI_QUICK_GAME = 15,// 华为快游戏
// COCOSPLAY = 16, // Cocos Play
// LINKSURE_MINI_GAME = 17,// 连尚小游戏
// QTT_MINI_GAME = 18 // 趣头条小游戏
}

View File

@ -1,53 +1,91 @@
import { resources, JsonAsset, director, SpriteFrame, Sprite, Node, SpriteAtlas, sp } from 'cc';
import { LocalizedSprite } from '../i18n/LocalizedSprite';
import { resources, JsonAsset, director, SpriteFrame, SpriteAtlas, sp } from 'cc';
export class I18nManager {
private static _instance: I18nManager = null;
private static _instance: I18nManager;
spriteFrameCache: Map<string, SpriteFrame> = new Map();
spineCache: Map<string, sp.SkeletonData> = new Map();
_sfTasks = new Map<string, Promise<SpriteFrame>>();
languageData: Record<string, any> = {};
currentLanguage: string = 'en';
ready: boolean = false;
static get instance() {
if (this._instance) {
return this._instance;
}
this._instance = new I18nManager();
return this._instance;
return this._instance || (this._instance = new I18nManager());
}
private constructor() { }
// yield/await 风格:谁都可以 await且只加载一次
ensureI18nSprite(lang: string, name: string): Promise<SpriteFrame> {
const key = `${lang}_${name}`;
const path = `i18nSprite/${lang}/${name}/spriteFrame`;
const cached = this.spriteFrameCache.get(key);
if (cached) return Promise.resolve(cached);
const pending = this._sfTasks.get(key);
if (pending) return pending;
const task = new Promise<SpriteFrame>((resolve, reject) => {
resources.load(path, SpriteFrame, (err, sf) => {
this._sfTasks.delete(key);
if (err || !sf) return reject(err);
this.spriteFrameCache.set(key, sf);
resolve(sf);
});
});
this._sfTasks.set(key, task);
return task;
}
/**
*
* @param language
*
* @param language
* @param languageJson JSON资源
*/
public async init(language: string = 'en', languageJson: JsonAsset): Promise<void> {
public async init(language: string = 'en', languageJson: JsonAsset = null): Promise<void> {
this.currentLanguage = language;
try {
if (languageJson) {
this.languageData = languageJson.json;
// 预加载并缓存图片资源
await this.preloadSpriteFrames();
await this.preloadSpriteFrameAltas();
await this.preloadSpineAssets(); // 新增预加载 spine 资源
this.ready = true;
} catch (error) {
}
}
getIsReady() {
return this.ready;
}
/**
*
*/
private async preloadSpriteFrames(): Promise<void> {
const imageNames = [
'loadingBg',
// 预加载资源(目前资源列表为空,可根据需要添加)
let okSprite = await this.preloadAssets('spriteFrame', [
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'10',
'11',
'12',
'13',
'14',
'15',
'16',
'17',
'18',
'19',
'20',
'21',
'22',
'23',
'24',
'25',
'26',
'27',
'29',
'30',
'98',
'99',
'Buy_5',
'sysgift_completed',
'sysgift_continue',
'sysgift_fbs',
@ -56,93 +94,72 @@ export class I18nManager {
'sysgift_symbols',
'sysgift_total',
'sysgift_win',
];
]);
let okAtlas = await this.preloadAssets('atlas', []);
let okSpine = await this.preloadAssets('spine', []);
for (const name of imageNames) {
const path = `i18nSprite/${this.currentLanguage}/${name}/spriteFrame`;
const cacheKey = `${this.currentLanguage}_${name}`;
if (!this.spriteFrameCache.has(cacheKey)) {
await new Promise<void>((resolve) => {
resources.load(path, SpriteFrame, (err, spriteFrame) => {
if (!err && spriteFrame) {
this.spriteFrameCache.set(cacheKey, spriteFrame);
this.ready = okSprite && okAtlas && okSpine;
} catch (error) {
console.error('I18nManager init failed:', error);
}
}
/**
*
* @param type
* @param names
*/
private async preloadAssets(type: 'spriteFrame' | 'atlas' | 'spine', names: string[]): Promise<boolean> {
let results = await Promise.all(names.map(name => this.loadAsset(type, name)));
return results.every(ok => ok);
}
/**
*
* @param type
* @param name
*/
private loadAsset(type: 'spriteFrame' | 'atlas' | 'spine', name: string): Promise<boolean> {
return new Promise(resolve => {
let cacheKey = `${this.currentLanguage}_${name}`;
if (type === 'spriteFrame') {
let path = `i18nSprite/${this.currentLanguage}/${name}/spriteFrame`;
resources.load(path, SpriteFrame, (err, asset) => {
if (!err && asset) {
this.spriteFrameCache.set(cacheKey, asset);
resolve(true);
} else {
console.warn(`[i18n] spriteFrame load failed: ${path}`, err?.message || err);
resolve(false);
}
resolve();
});
});
}
}
}
private async preloadSpriteFrameAltas(): Promise<void> {
const altasNames = [
`FreeSpinINOUT_${this.currentLanguage}`,
`BuyFeature_${this.currentLanguage}`,
`Others_${this.currentLanguage}`,
`SymbolsInfo_${this.currentLanguage}`,
]
for (const altasName of altasNames) {
const atlasPath = `i18nSprite/${this.currentLanguage}/${altasName}`;
// 加载图集并缓存其中的多个 SpriteFrame
await new Promise<void>((resolve) => {
resources.load(atlasPath, SpriteAtlas, (err, atlas) => {
} else if (type === 'atlas') {
let path = `i18nSprite/${this.currentLanguage}/${name}`;
resources.load(path, SpriteAtlas, (err, atlas) => {
if (!err && atlas) {
const spriteFrames = atlas.getSpriteFrames();
spriteFrames.forEach((frame, index) => {
let name = frame.name;
const cacheKey = `${this.currentLanguage}_${name}`;
this.spriteFrameCache.set(cacheKey, frame);
atlas.getSpriteFrames().forEach(frame => {
this.spriteFrameCache.set(`${this.currentLanguage}_${frame.name}`, frame);
});
resolve(true);
} else {
console.warn(`[i18n] atlas load failed: ${path}`, err?.message || err);
resolve(false);
}
});
} else if (type === 'spine') {
let path = `i18nSpine/${this.currentLanguage}/${name}`;
resources.load(path, sp.SkeletonData, (err, asset) => {
if (!err && asset) {
this.spineCache.set(cacheKey, asset);
resolve(true);
} else {
console.warn(`[i18n] spine load failed: ${path}`, err?.message || err);
resolve(false);
}
});
}
resolve();
});
});
}
}
// 添加预加载 Spine 资源的方法
private async preloadSpineAssets(): Promise<void> {
const spineNames = [
`WinWinWin_${this.currentLanguage}`,
];
for (const name of spineNames) {
const path = `i18nSprite/${this.currentLanguage}/${name}`;
const cacheKey = `${this.currentLanguage}_${name}`;
if (!this.spineCache.has(cacheKey)) {
await new Promise<void>((resolve) => {
resources.load(path, sp.SkeletonData, (err, spineData) => {
if (!err && spineData) {
this.spineCache.set(cacheKey, spineData);
}
resolve();
});
});
}
}
}
setSpriteFrame(node: Node, name: string) {
// 先尝试从缓存获取
const cacheKey = `${this.currentLanguage}_${name}`;
const cachedFrame = this.spriteFrameCache.get(cacheKey);
if (cachedFrame) {
const sprite = node.getComponent(Sprite);
if (sprite) {
sprite.spriteFrame = cachedFrame;
return;
}
}
// 如果缓存中没有,则使用原有逻辑
let spriteNode = node.getComponent(LocalizedSprite);
if (spriteNode) {
spriteNode.setSpriteName(name);
}
}
/**
@ -159,17 +176,21 @@ export class I18nManager {
/**
*
* @param key
* @returns
*/
public t(key: string): string {
const translation = this.languageData[this.currentLanguage]?.[key];
if (!translation) {
return key; // Return the key itself if translation is not found
return this.languageData[this.currentLanguage]?.[key] || key;
}
return translation;
public getSpriteFrame(spriteName: string): SpriteFrame {
let cacheKey = `${this.currentLanguage}_${spriteName}`;
let cachedFrame = this.spriteFrameCache.get(cacheKey);
return cachedFrame;
}
/**
*
*
*
*/
public updateSceneRenderers(): void {
if (!this.ready) {
@ -178,41 +199,23 @@ export class I18nManager {
}
let scene = director.getScene();
if (!scene || !scene.isValid) return;
if (!scene?.isValid) return;
const rootNodes = director.getScene()?.children || [];
const allLocalizedLabels: any[] = [];
const allLocalizedSprites: any[] = [];
// 收集所有本地化组件
let allLocalizedLabels = [];
let allLocalizedSprites = [];
rootNodes.forEach(node => {
scene.children.forEach(node => {
allLocalizedLabels.push(...node.getComponentsInChildren('LocalizedLabel'));
allLocalizedSprites.push(...node.getComponentsInChildren('LocalizedSprite'));
});
allLocalizedLabels.forEach(label => {
if (label.node.active) {
label.updateLabel();
}
});
allLocalizedSprites.forEach(sprite => {
if (sprite.node.active) {
sprite.updateSprite();
// 更新所有激活的本地化组件
[...allLocalizedLabels, ...allLocalizedSprites].forEach(component => {
if (component.node.active) {
// 调用对应的更新方法
component.updateLabel?.() || component.updateSprite?.();
}
});
}
}
// // 供插件查询当前语言使用
// const win = window as any;
// win._languageData = {
// get language() {
// return I18nManager.instance.currentLanguage;
// },
// init(lang: string) {
// I18nManager.instance.init(lang);
// },
// updateSceneRenderers() {
// I18nManager.instance.updateSceneRenderers();
// },
// };

View File

Before

Width:  |  Height:  |  Size: 143 KiB

After

Width:  |  Height:  |  Size: 143 KiB

View File

@ -11,7 +11,7 @@
"6c48a": {
"importer": "texture",
"uuid": "fc4357cf-5f55-416c-b94a-b412108a32a7@6c48a",
"displayName": "logo",
"displayName": "logo_en",
"id": "6c48a",
"name": "texture",
"userData": {
@ -35,7 +35,7 @@
"f9941": {
"importer": "sprite-frame",
"uuid": "fc4357cf-5f55-416c-b94a-b412108a32a7@f9941",
"displayName": "logo",
"displayName": "logo_en",
"id": "f9941",
"name": "spriteFrame",
"userData": {

View File

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 115 KiB

View File

@ -11,7 +11,7 @@
"6c48a": {
"importer": "texture",
"uuid": "51ffde0b-ff7a-4e4e-b639-b58e4b55b73f@6c48a",
"displayName": "logo",
"displayName": "logo_zh",
"id": "6c48a",
"name": "texture",
"userData": {
@ -35,7 +35,7 @@
"f9941": {
"importer": "sprite-frame",
"uuid": "51ffde0b-ff7a-4e4e-b639-b58e4b55b73f@f9941",
"displayName": "logo",
"displayName": "logo_zh",
"id": "f9941",
"name": "spriteFrame",
"userData": {

View File

@ -55,7 +55,7 @@
"Weekly Ranking": "Ugentlig rangliste",
"Monthly Ranking": "Månedlig rangliste",
"Event Description": "Eventbeskrivelse",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Deltag i udvalgte spil i eventperioden, og bliv rangeret efter “gevinstpoint”. De XX bedst placerede spillere modtager attraktive præmier!",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "I kampagneperioden — deltag i de udvalgte spil, og hvis dine indsatser ligger i top XX, kan du få store præmier!",
"Accumulate XX bets or a total wager of XX to participate in the event": "Opnå i alt XX indsatser og en samlet indsats på XX for at deltage i eventet",
"Historical leaderboard records": "Historik for ranglister",
"Claim with one click": "Hent alle præmier",
@ -125,7 +125,7 @@
"Weekly Ranking": "Wochenrangliste",
"Monthly Ranking": "Monatsrangliste",
"Event Description": "Eventbeschreibung",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Nehmen Sie während des Eventzeitraums an den angegebenen Spielen teil und werden Sie nach „Gewinnpunkten“ gerankt. Die Top XX Spieler erhalten attraktive Preise!",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Während der Aktionszeit nimm an den ausgewählten Spielen teil und sichere dir großartige Preise, wenn deine Einsätze unter den Top-XX liegen!",
"Accumulate XX bets or a total wager of XX to participate in the event": "Erreichen Sie insgesamt XX Einsätze und einen kumulierten Einsatz von XX, um am Event teilzunehmen",
"Historical leaderboard records": "Ranglistenverlauf",
"Claim with one click": "Alle Belohnungen abholen",
@ -195,7 +195,7 @@
"Weekly Ranking": "Weekly Ranking",
"Monthly Ranking": "Monthly Ranking",
"Event Description": "Event Description",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "During the event, participate in the designated games and rank within the top XX by bets to win generous rewards!",
"Accumulate XX bets or a total wager of XX to participate in the event": "Accumulate XX bets or a total wager of XX to participate in the event",
"Historical leaderboard records": "Historical leaderboard records",
"Claim with one click": "Claim with one click",
@ -265,7 +265,7 @@
"Weekly Ranking": "Ranking Semanal",
"Monthly Ranking": "Ranking Mensual",
"Event Description": "Descripción del Evento",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Durante el período del evento, participa en los juegos designados y clasifícate según los “puntos de ganancia”. ¡Los XX mejores jugadores obtendrán grandes premios!",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Durante el período del evento, participa en los juegos designados y, si tus apuestas se ubican entre los primeros XX, ¡podrás ganar grandes premios!",
"Accumulate XX bets or a total wager of XX to participate in the event": "Acumula XX apuestas y alcanza un total de apuestas de XX para poder participar en el evento",
"Historical leaderboard records": "Historial de Rankings",
"Claim with one click": "Reclamar Todo",
@ -335,7 +335,7 @@
"Weekly Ranking": "Viikoittainen lista",
"Monthly Ranking": "Kuukausittainen lista",
"Event Description": "Tapahtuman kuvaus",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Osallistu tapahtuman aikana määrättyihin peleihin ja sijoitu “voittopisteiden” perusteella. Parhaat XX pelaajaa saavat houkuttelevia palkintoja!",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Kampanjan aikana osallistu valittuihin peleihin, ja jos panoksesi sijoittuvat kärjen XX joukkoon, voit voittaa upeita palkintoja!",
"Accumulate XX bets or a total wager of XX to participate in the event": "Saavuta yhteensä XX panostusta ja XX kokonaispanos osallistuaksesi tapahtumaan",
"Historical leaderboard records": "Tulostaulukon historia",
"Claim with one click": "Lunasta kaikki",
@ -405,7 +405,7 @@
"Weekly Ranking": "Classement hebdomadaire",
"Monthly Ranking": "Classement mensuel",
"Event Description": "Description de lévénement",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Pendant la période de lévénement, participez aux jeux désignés et soyez classé selon les « points de gain ». Les XX meilleurs joueurs recevront des récompenses attractives !",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Pendant la période de lévénement, participez aux jeux désignés et, si vos mises se classent parmi les XX premiers, vous pourrez remporter de superbes récompenses !",
"Accumulate XX bets or a total wager of XX to participate in the event": "Cumulez XX mises et atteignez un montant total de mises de XX pour pouvoir participer à lévénement",
"Historical leaderboard records": "Historique des classements",
"Claim with one click": "Tout réclamer",
@ -475,7 +475,7 @@
"Weekly Ranking": "Peringkat Mingguan",
"Monthly Ranking": "Peringkat Bulanan",
"Event Description": "Deskripsi Acara",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Selama periode acara, mainkan game yang ditentukan dan menangkan poin untuk masuk ke peringkat XX teratas dan dapatkan hadiah menarik!",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Selama periode acara, ikut serta dalam permainan yang ditentukan dan raih peringkat teratas XX berdasarkan taruhan untuk mendapatkan hadiah besar!",
"Accumulate XX bets or a total wager of XX to participate in the event": "Akumulasi taruhan mencapai XX kali dan total taruhan mencapai XX untuk berpartisipasi dalam acara",
"Historical leaderboard records": "Riwayat Papan Peringkat",
"Claim with one click": "Klaim Sekaligus",
@ -545,7 +545,7 @@
"Weekly Ranking": "Classifica Settimanale",
"Monthly Ranking": "Classifica Mensile",
"Event Description": "Descrizione dellEvento",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Durante il periodo dellevento, partecipa ai giochi selezionati e vieni classificato in base ai “punti vincita”. I primi XX giocatori riceveranno premi interessanti!",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Durante il periodo dellevento, partecipa ai giochi designati e, se le tue puntate rientrano tra le prime XX, potrai ottenere ricche ricompense!",
"Accumulate XX bets or a total wager of XX to participate in the event": "Accumula XX puntate e raggiungi un totale di puntate pari a XX per partecipare allevento",
"Historical leaderboard records": "Cronologia delle Classifiche",
"Claim with one click": "Riscatta Tutto",
@ -615,7 +615,7 @@
"Weekly Ranking": "ウィークリーランキング",
"Monthly Ranking": "マンスリーランキング",
"Event Description": "イベント概要",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "イベント期間中に指定されたゲームに参加し、「獲得ポイント」に基づいてランキングが決定されます。上位 XX 名のプレイヤーには豪華報酬が贈られます!",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "イベント期間中、指定されたゲームに参加し、ベットがトップXXに入れば、豪華な報酬を獲得できます!",
"Accumulate XX bets or a total wager of XX to participate in the event": "累計ベット回数が XX 回、かつ累計ベット額が XX に達すると、イベントに参加できます",
"Historical leaderboard records": "ランキング履歴",
"Claim with one click": "一括受け取り",
@ -685,7 +685,7 @@
"Weekly Ranking": "주간 랭킹",
"Monthly Ranking": "월간 랭킹",
"Event Description": "이벤트 안내",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "이벤트 기간 동안 지정된 게임에 참여하고 “획득 포인트” 기준으로 랭킹이 결정됩니다. 상위 XX명의 플레이어에게 푸짐한 보상이 지급됩니다!",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "이벤트 기간 동안 지정된 게임에 참여하고 베팅 순위가 상위 XX위 안에 들면 풍성한 보상을 받을 수 있습니다!",
"Accumulate XX bets or a total wager of XX to participate in the event": "누적 베팅 횟수 XX회 및 누적 베팅 금액 XX를 달성하면 이벤트에 참여할 수 있습니다",
"Historical leaderboard records": "랭킹 기록",
"Claim with one click": "일괄 수령",
@ -755,7 +755,7 @@
"Weekly Ranking": "အပတ်စဉ် အဆင့်သတ်မှတ်ဇယား",
"Monthly Ranking": "လစဉ် အဆင့်သတ်မှတ်ဇယား",
"Event Description": "ပွဲလှုပ်ရှားမှု အကြောင်းအရာ",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "ပွဲလှုပ်ရှားမှုကာလအတွင်း သတ်မှတ်ထားသော ဂိမ်းများတွင် ပါဝင်ကစားပြီး “အနိုင်ရမှတ်များ” အပေါ် မူတည်၍ အဆင့်သတ်မှတ်မည်ဖြစ်ပါသည်။ ထိပ်ဆုံး XX ဦးသည် ဆုလာဘ်အထူးများကို ရရှိမည်ဖြစ်ပါသည်။",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "အစီအစဉ်ကာလအတွင်း သတ်မှတ်ထားသောဂိမ်းများတွင် ပါဝင်ကာ ပေါက်ကြေးတင်ထားမှုများသည် ထိပ်တန်း XX အဆင့်အတွင်းဝင်လျှင် စျေးကြီးမော်လပြည့် ရခိုင်ထောက်ပံ့မျိုးစုံကို ရယူနိုင်ပါသည်!",
"Accumulate XX bets or a total wager of XX to participate in the event": "စုစုပေါင်း လောင်းကစားအကြိမ် XX ကြိမ်နှင့် စုစုပေါင်း လောင်းကစားပမာဏ XX ကို ပြည့်မီပါက ပွဲလှုပ်ရှားမှုတွင် ပါဝင်နိုင်ပါသည်",
"Historical leaderboard records": "အဆင့်သတ်မှတ်ဇယား မှတ်တမ်း",
"Claim with one click": "တစ်ကြိမ်တည်း ဆုလက်ခံမည်",
@ -825,7 +825,7 @@
"Weekly Ranking": "Wekelijkse ranglijst",
"Monthly Ranking": "Maandelijkse ranglijst",
"Event Description": "Beschrijving van het evenement",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Neem tijdens de evenementperiode deel aan de geselecteerde spellen en word gerangschikt op basis van “winstpunten”. De beste XX spelers ontvangen aantrekkelijke beloningen!",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Tijdens de actieperiode kun je deelnemen aan de aangewezen spellen en, als je inzetten bij de top XX horen, geweldige prijzen winnen!",
"Accumulate XX bets or a total wager of XX to participate in the event": "Bereik in totaal XX inzetten en een cumulatief inzetbedrag van XX om aan het evenement deel te nemen",
"Historical leaderboard records": "Geschiedenis van ranglijsten",
"Claim with one click": "Alles claimen",
@ -895,7 +895,7 @@
"Weekly Ranking": "Classificação Semanal",
"Monthly Ranking": "Classificação Mensal",
"Event Description": "Descrição do Evento",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Durante o período do evento, participe dos jogos selecionados e seja classificado com base nos “pontos de ganho”. Os XX melhores jogadores receberão prêmios atrativos!",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Durante o período do evento, participe nos jogos designados e, se as suas apostas ficarem entre os primeiros XX, você poderá ganhar grandes recompensas!",
"Accumulate XX bets or a total wager of XX to participate in the event": "Acumule XX apostas e alcance um total de apostas de XX para participar do evento",
"Historical leaderboard records": "Histórico de Classificações",
"Claim with one click": "Resgatar Tudo",
@ -965,7 +965,7 @@
"Weekly Ranking": "Clasament săptămânal",
"Monthly Ranking": "Clasament lunar",
"Event Description": "Descrierea evenimentului",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Pe durata evenimentului, participă la jocurile selectate și fii clasat în funcție de „punctele de câștig”. Primii XX de jucători vor primi recompense atractive!",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "În perioada evenimentului, participă la jocurile desemnate și, dacă pariurile tale se află în top XX, poți obține recompense generoase!",
"Accumulate XX bets or a total wager of XX to participate in the event": "Acumulează XX pariuri și atinge un total al pariurilor de XX pentru a putea participa la eveniment",
"Historical leaderboard records": "Istoric clasamente",
"Claim with one click": "Revendică tot",
@ -1035,7 +1035,7 @@
"Weekly Ranking": "Еженедельный рейтинг",
"Monthly Ranking": "Ежемесячный рейтинг",
"Event Description": "Описание события",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "В период проведения события участвуйте в выбранных играх и занимайте места в рейтинге на основе «очков выигрыша». Топ XX игроков получат щедрые награды!",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "В период проведения акции участвуйте в выбранных играх и, если ваши ставки войдут в топ XX, вы сможете получить щедрые призы!",
"Accumulate XX bets or a total wager of XX to participate in the event": "Совершите XX ставок и наберите общий объём ставок XX, чтобы принять участие в событии",
"Historical leaderboard records": "История рейтингов",
"Claim with one click": "Забрать всё",
@ -1048,7 +1048,6 @@
"Event": "Событие",
"Claim": "Забрать",
"Event Time": "Время события"
},
"sv": {
"AID_AUTO_BUTTON": "Starta autospinn",
@ -1106,7 +1105,7 @@
"Weekly Ranking": "Veckovis topplista",
"Monthly Ranking": "Månatlig topplista",
"Event Description": "Evenemangsbeskrivning",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Delta i de utvalda spelen under evenemangsperioden och rangordnas baserat på ”vinstpoäng”. De XX bästa spelarna får attraktiva belöningar!",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Under kampanjperioden — delta i de utvalda spelen, och om dina insatser hamnar bland topp XX kan du vinna fina priser!",
"Accumulate XX bets or a total wager of XX to participate in the event": "Uppnå totalt XX insatser och ett sammanlagt insatsbelopp på XX för att delta i evenemanget",
"Historical leaderboard records": "Topplistehistorik",
"Claim with one click": "Hämta alla",
@ -1176,7 +1175,7 @@
"Weekly Ranking": "อันดับรายสัปดาห์",
"Monthly Ranking": "อันดับรายเดือน",
"Event Description": "รายละเอียดกิจกรรม",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "ร่วมเล่นเกมที่กำหนดในช่วงเวลากิจกรรม และจัดอันดับตาม “คะแนนชนะ” ผู้เล่นที่ติดอันดับ XX แรก รับรางวัลสุดพิเศษทันที!",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "ในช่วงกิจกรรม เพียงเข้าร่วมเล่นเกมที่กำหนด และมียอดเดิมพันติดอันดับ XX อันดับแรก ก็รับรางวัลใหญ่ได้เลย!",
"Accumulate XX bets or a total wager of XX to participate in the event": "สะสมยอดเดิมพันครบ XX ครั้ง และมียอดเดิมพันสะสมครบ XX จึงจะมีสิทธิ์เข้าร่วมกิจกรรม",
"Historical leaderboard records": "ประวัติตารางจัดอันดับ",
"Claim with one click": "รับรางวัลทั้งหมดในครั้งเดียว",
@ -1246,7 +1245,7 @@
"Weekly Ranking": "Haftalık Sıralama",
"Monthly Ranking": "Aylık Sıralama",
"Event Description": "Etkinlik Açıklaması",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Etkinlik süresi boyunca belirlenen oyunlara katılın ve “kazanç puanları”na göre sıralamaya girin. İlk XX oyuncu cazip ödüller kazanacaktır!",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Etkinlik süresi boyunca belirlenen oyunlara katıl ve bahislerin ilk XX sırada yer alırsa büyük ödüller kazan!",
"Accumulate XX bets or a total wager of XX to participate in the event": "Etkinliğe katılmak için toplam XX bahis yapın ve toplam bahis tutarınız XXe ulaşsın",
"Historical leaderboard records": "Sıralama Geçmişi",
"Claim with one click": "Hepsini Al",
@ -1316,7 +1315,7 @@
"Weekly Ranking": "Bảng tuần",
"Monthly Ranking": "Bảng tháng",
"Event Description": "Giới thiệu sự kiện",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Trong thời gian diễn ra sự kiện, tham gia các trò chơi được chỉ định và xếp hạng theo “điểm thắng”. Người chơi nằm trong Top XX sẽ nhận được phần thưởng hấp dẫn!",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "Trong thời gian diễn ra sự kiện, hãy tham gia các trò chơi được chỉ định và xếp hạng trong top XX về tổng cược để nhận những phần thưởng hấp dẫn!",
"Accumulate XX bets or a total wager of XX to participate in the event": "Tích lũy XX lượt cược và tổng số tiền cược đạt XX để đủ điều kiện tham gia sự kiện",
"Historical leaderboard records": "Lịch sử bảng xếp hạng",
"Claim with one click": "Nhận thưởng một lần",
@ -1386,7 +1385,7 @@
"Weekly Ranking": "週榜",
"Monthly Ranking": "月榜",
"Event Description": "活動說明",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "活動期間內參與指定遊戲,依「贏分」排名前 XX 名,即可獲得豐富大獎!",
"During the event, participate in designated games and rank in the top XX by winnings to receive generous rewards!": "活動期間內參與指定遊戲,依「投注」排名前 XX 名,即可獲得豐富大獎!",
"Accumulate XX bets or a total wager of XX to participate in the event": "累積投注達 XX 次,且累積投注金額達 XX即可參與活動",
"Historical leaderboard records": "歷史排行榜紀錄",
"Claim with one click": "一鍵領取",

View File

@ -16,7 +16,7 @@
"physics-2d": "inherit-project-setting"
},
"macroConfig": {
"cleanupImageCache": "off"
"cleanupImageCache": "inherit-project-setting"
}
},
"nativeCodeBundleMode": "both",
@ -35,7 +35,7 @@
"handleTemplateMd5Link": true
},
"mainBundleIsRemote": false,
"mainBundleCompressionType": "merge_dep",
"mainBundleCompressionType": "merge_all_json",
"useSplashScreen": false,
"bundleCommonChunk": false,
"packAutoAtlas": true,

View File

@ -1,3 +1,11 @@
{
"__version__": "1.3.9"
"__version__": "1.3.9",
"splash-setting": {
"background": {
"type": "color"
},
"logo": {
"type": "none"
}
}
}

View File

@ -6,7 +6,7 @@
"label": "customSplash",
"enable": true,
"customSplash": {
"complete": false,
"complete": true,
"form": "https://creator-api.cocos.com/api/form/show?sid=d7d2df3c7819de249897b8f170c1432d"
}
},