本系统实现了一个完整的每日奖励机制,包括:
实现原理:
localStorage 存储每日奖励数据lastResetDate 与当前日期关键代码:
private loadDailyRewardData() {
const savedData = localStorage.getItem(this.DAILY_REWARD_KEY);
const today = this.getCurrentDateString();
if (savedData) {
const data = JSON.parse(savedData) as DailyRewardData;
// 检查是否需要重置(新的一天)
if (data.lastResetDate !== today) {
this.resetDailyRewardData(today);
} else {
this.dailyRewardData = data;
}
} else {
this.resetDailyRewardData(today);
}
}
private getCurrentDateString(): string {
const now = new Date();
const month = (now.getMonth() + 1).toString();
const day = now.getDate().toString();
const paddedMonth = month.length === 1 ? '0' + month : month;
const paddedDay = day.length === 1 ? '0' + day : day;
return `${now.getFullYear()}-${paddedMonth}-${paddedDay}`;
}
DailyRewardData接口:
interface DailyRewardData {
lastResetDate: string; // 上次重置日期
moneyFreeCount: number; // 金币免费领取次数
moneyAdCount: number; // 金币广告观看次数
diamondsFreeCount: number; // 钻石免费领取次数
diamondsAdCount: number; // 钻石广告观看次数
costAdCount: number; // Cost按钮广告观看次数
costFreeUsed: boolean; // Cost按钮免费使用标记
}
shop.json配置:
{
"dailyRewards": {
"money": {
"baseAmount": 100,
"maxClaimsPerDay": 36,
"maxAdsPerDay": 4,
"firstClaimFree": true,
"adRequiredAfterFirst": true
},
"diamond": {
"baseAmount": 10,
"maxClaimsPerDay": 36,
"maxAdsPerDay": 2,
"firstClaimFree": true,
"adRequiredAfterFirst": true
},
"costButtons": {
"maxAdsPerDay": 5
}
},
"ui": {
"moneyClaimButton": {
"normalText": "领取钞票",
"adText": "看广告领取",
"disabledText": "今日已达上限"
},
"diamondClaimButton": {
"normalText": "领取钻石",
"adText": "看广告领取",
"disabledText": "今日已达上限"
},
"costButtons": {
"freeText": "免 费",
"normalText": "免费观看",
"disabledText": "今日已达上限"
}
}
}
在ShopController中新增了两个按钮属性:
@property(Button)
billCostButton: Button = null;
@property(Button)
diamondCostButton: Button = null;
免费机制:
// 钞票Cost按钮点击事件
public onBillCostClick() {
// 检查每日广告观看次数限制
// 显示广告并增加计数
}
// 钻石Cost按钮点击事件
public onDiamondCostClick() {
// 检查每日广告观看次数限制
// 显示广告并增加计数
}
新增 updateCostButtonsUI() 方法,根据当前广告观看次数更新按钮状态:
在Cocos Creator编辑器中:
shop.json 文件拖拽到 ShopController 的 shopConfigAsset 属性billCostButton: Canvas/ShopUI/ScrollView/view/content/bill/CostdiamondCostButton: Canvas/ShopUI/ScrollView/view/content/diamond/Cost在编辑器中为按钮绑定点击事件:
ShopController.onBillCostClickShopController.onDiamondCostClickmaxAdsPerDay: 每日最大广告观看次数firstClaimFree: 是否首次免费领取baseAmount: 基础奖励数量maxClaimsPerDay: 每日最大领取次数配置参数:
maxAdsPerDay: 每日最大广告观看次数UI文本:
freeText: 每天第一次免费状态显示文本normalText: 正常状态显示文本(广告观看)disabledText: 禁用状态显示文本(达到上限后)resetDailyRewards() 方法重置(调试用)localStorage 存储daily_reward_data// 重置每日奖励数据(调试用)
public resetDailyRewards()
// 获取当前状态(调试用)
public getDailyRewardStatus()
这些方法可以在开发过程中用于测试每日刷新功能。