cb/assets/shop/script/passCheckItem.ts

392 lines
14 KiB
TypeScript

import NumberToImage from "../../Script/NumberToImage";
const { ccclass, property } = cc._decorator;
@ccclass
export default class PassCheckItem extends cc.Component {
@property(cc.Prefab)
passCheckItemLvPrefab: cc.Prefab = null;
@property(cc.Sprite)
leftReward: cc.Sprite = null;
@property(cc.Sprite)
rightReward: cc.Sprite = null;
@property(cc.Node)
leftNum: cc.Node = null;
@property(cc.Node)
rightNum: cc.Node = null;
@property(cc.SpriteAtlas)
texture_atlas: cc.SpriteAtlas = null;
// 添加更多图集属性
@property(cc.SpriteAtlas)
newUserAtlas: cc.SpriteAtlas = null;
// @property(cc.SpriteAtlas)
// textureAtlas1: cc.SpriteAtlas = null;
@property(cc.SpriteAtlas)
uiAtlas: cc.SpriteAtlas = null;
// 数据
private data: any = null;
private itemIndex: number = 0;
private isUIInitialized: boolean = false;
// 1001 金币 2001 锤子 2003 魔棒 3001 15分钟无限体力 3002 30分钟 3003 1小时 3004 2小时 3005 3小时
// 添加物品ID到图片名称的映射
private itemImageMap: { [key: number]: { imageName: string, atlas: string } } = {
1001: { imageName: "coins4", atlas: "texture_atlas" }, // shop/img/texture_atlas-1
2001: { imageName: "iceb", atlas: "newUserAtlas" }, // action_bundle/img/newUser
2002: { imageName: "chuizi", atlas: "newUserAtlas" }, // action_bundle/img/newUser
2003: { imageName: "starb", atlas: "newUserAtlas" }, // action_bundle/img/newUser
3001: { imageName: "skylineHealth", atlas: "uiAtlas" }, // UI/UI/
3002: { imageName: "skylineHealth", atlas: "uiAtlas" }, // UI/UI/
3003: { imageName: "skylineHealth", atlas: "uiAtlas" }, // UI/UI/ skylineHealth
// 可以继续添加更多物品ID和对应图片的映射
};
private numImgmap: { [key: number]: { imageName: string, atlas: string } } = {
3001: { imageName: "15", atlas: "uiAtlas" },
3002: { imageName: "30min", atlas: "texture_atlas" },
3003: { imageName: "1h", atlas: "texture_atlas" },
}
init(data: any, index: number) {
this.data = data;
this.itemIndex = index;
this.updateUI();
}
initUI() {
if (!this.data) {
return;
}
// 防止重复初始化
if (this.isUIInitialized) {
return;
}
// 处理passCheckItemLv prefab的实例化
if (this.passCheckItemLvPrefab) {
// 实例化并添加新的prefab
const itemLvNode = cc.instantiate(this.passCheckItemLvPrefab);
itemLvNode.parent = this.node.parent;
itemLvNode.setPosition(this.node.x, this.node.y);
itemLvNode.zIndex = 2;
let bright_bg = itemLvNode.getChildByName("bright_bg").getComponent(cc.Sprite);
let levelNum = itemLvNode.getChildByName("levelNum");
let lvNum = this.itemIndex + 1
NumberToImage.numberToImageNodes(lvNum, 43, 15, "tili_", levelNum, true);
if (lvNum == 1 || (lvNum >= 10 && lvNum <= 19)) {
levelNum.x -= 5;
}
if (this.data.free === -1) {
// 未激活状态
if (this.uiAtlas) {
const spriteFrame = this.uiAtlas.getSpriteFrame("no_bright_bg");
if (spriteFrame) {
bright_bg.spriteFrame = spriteFrame;
}
cc.fx.GameTool.setGray(levelNum, true)
}
} else {
// 已激活状态
if (this.uiAtlas) {
const spriteFrame = this.uiAtlas.getSpriteFrame("bright_bg");
if (spriteFrame) {
bright_bg.spriteFrame = spriteFrame;
}
}
}
}
// 初始化按钮点击事件(只执行一次)
this.setupButtonEvents();
// 标记UI已初始化
this.isUIInitialized = true;
// 首次更新UI
this.updateUI();
}
// 专门用于设置按钮事件的方法
private setupButtonEvents() {
let node1 = this.node.getChildByName("leftNode");
let node2 = this.node.getChildByName("rightNode");
if (node1) {
let getBtn = node1.getChildByName("getBtn");
if (getBtn) {
getBtn.on('click', () => {
this.onGetRewardClicked(node1);
}, this);
}
}
if (node2) {
let getBtn = node2.getChildByName("getBtn");
if (getBtn) {
getBtn.on('click', () => {
this.onGetRewardClicked(node2);
}, this);
}
}
}
updateUI() {
if (!this.data) {
return;
}
// 根据数据更新界面元素
let node1 = this.node.getChildByName("leftNode");
let node2 = this.node.getChildByName("rightNode");
if (this.data.ItemID1 !== undefined && this.data.ItemNum1 !== undefined) {
this.updateItemInfo(this.data.ItemID1, this.data.ItemNum1, node1, this.data.free);
}
if (this.data.ItemID2 !== undefined && this.data.ItemNum2 !== undefined) {
this.updateItemInfo(this.data.ItemID2, this.data.ItemNum2, node2, this.data.passCheck);
}
if (this.data.free !== undefined) {
this.updateRewardState(this.data.free, node1);
}
if (this.data.passCheck !== undefined) {
this.updateRewardState(this.data.passCheck, node2);
}
}
updateRewardState(itemData: any, targetNode: cc.Node) {
// 更新免费状态的UI 0已领 1 未领
let getSpr = targetNode.getChildByName("get")
let getBtn = targetNode.getChildByName("getBtn")
let lock = targetNode.getChildByName("lock")
let activate = cc.fx.GameConfig.GM_INFO.passCheckActivate
if (lock) {
lock.active = false;
}
if (itemData === 1) {
getSpr.active = false;
getBtn.active = true;
if (lock && activate == false) {
lock.active = true;
getBtn.active = false;
}
} else if (itemData === 0) {
getSpr.active = true;
getBtn.active = false;
this.setNodeGray(targetNode)
} else {
if (lock && activate == false) {
lock.active = true;
}
getSpr.active = false;
getBtn.active = false;
}
}
updateItemInfo(itemID: number, itemNum: number, node: cc.Node, itemData: any) {
// 更新物品信息的UI
const imageInfo = this.itemImageMap[itemID];
let freeRewardNode = node.getChildByName("freeReward");
let freeReward: cc.Sprite = null;
if (freeRewardNode) {
freeReward = freeRewardNode.getComponent(cc.Sprite);
}
if (imageInfo) {
// 根据图集名称获取对应的图集
let targetAtlas: cc.SpriteAtlas = null;
switch (imageInfo.atlas) {
case "texture_atlas":
targetAtlas = this.texture_atlas;
break;
case "newUserAtlas":
targetAtlas = this.newUserAtlas;
break;
case "uiAtlas":
targetAtlas = this.uiAtlas;
break;
default:
console.warn(`Unknown atlas: ${imageInfo.atlas}`);
break;
}
// 加载对应的图片资源
if (targetAtlas && freeReward) {
const spriteFrame = targetAtlas.getSpriteFrame(imageInfo.imageName);
if (spriteFrame) {
freeReward.spriteFrame = spriteFrame;
let imgScale = 1;
switch (itemID) {
case 1001:
imgScale = 1;
break;
case 2001:
imgScale = 0.7;
break;
case 2002:
imgScale = 0.6;
break;
case 2003:
imgScale = 0.6;
break;
default:
imgScale = 1.1;
break;
}
freeRewardNode.scale = imgScale;
} else {
console.warn(`Sprite frame ${imageInfo.imageName} not found in atlas ${imageInfo.atlas}`);
}
} else {
}
} else {
console.warn(`No image found for item ID: ${itemID}`);
// 使用默认图片
}
let addTiem = node.getChildByName("addTiem");
addTiem.active = false;
let num1 = node.getChildByName("num_1");
let num_x = node.getChildByName("num_x");
num1.active = false;
num_x.active = false;
if ([3001, 3002, 3003].includes(itemID) && addTiem) {
addTiem.active = true;
const numImageInfo = this.numImgmap[itemID];
if (numImageInfo) {
let targetAtlas: cc.SpriteAtlas = null;
switch (numImageInfo.atlas) {
case "texture_atlas":
targetAtlas = this.texture_atlas;
break;
case "uiAtlas":
targetAtlas = this.uiAtlas;
break;
default:
console.warn(`Unknown atlas for num image: ${numImageInfo.atlas}`);
break;
}
if (targetAtlas) {
const spriteFrame = targetAtlas.getSpriteFrame(numImageInfo.imageName);
if (spriteFrame) {
let numSprite = addTiem.getComponent(cc.Sprite);
if (numSprite) {
numSprite.spriteFrame = spriteFrame;
}
} else {
console.warn(`Sprite frame ${numImageInfo.imageName} not found in atlas ${numImageInfo.atlas}`);
}
}
}
} else {
num1.active = true;
num_x.active = true;
NumberToImage.numberToImageNodes(itemNum, 50, 25, "pc_num_", num1, true);
if (itemData === 0) {
this.setNodeGray(num1)
this.setNodeGray(num_x)
}
num1.scale = 0.8;
if (num_x && num1) {
// 计算数值的位数
const digitCount = itemNum.toString().length;
const offset = Math.max(0, digitCount);
const num_xWidth = num_x.width;
if (digitCount == 4) {
num_x.x = num1.x - (offset - 1) * num_xWidth - 20;
} else if (digitCount == 3) {
num_x.x = num1.x - offset * num_xWidth;
}
}
}
}
updateItem(data: any, index: number) {
// 在这里处理数据更新
this.data = data;
this.itemIndex = index;
this.initUI();
}
// 数据改变时调用
public dataChanged() {
this.updateUI();
}
// 组件生命周期函数
protected onLoad() {
this.isUIInitialized = false;
}
protected start() {
// console.log("PassCheckItem component started");
}
private onGetRewardClicked(targetNode: cc.Node) {
// 确定是左侧还是右侧的奖励
let isLeftReward = targetNode.name === "leftNode";
// 获取对应的物品ID和数量
let itemId = isLeftReward ? this.data.ItemID1 : this.data.ItemID2;
let itemNum = isLeftReward ? this.data.ItemNum1 : this.data.ItemNum2;
console.log("领取物品:", itemId, "数量:", itemNum);
// 调用领取奖励方法
this.claimReward(itemId, itemNum, isLeftReward);
}
private claimReward(itemId: number, itemNum: number, isLeftReward: boolean) {
let passCheckMgr = this.node.parent.parent.parent.parent.getComponent('passCheckMgr');
if (passCheckMgr && typeof passCheckMgr.claimReward === 'function') {
console.log("更新奖励状态到服务器:", itemId, itemNum, isLeftReward);
passCheckMgr.claimReward(this.itemIndex, itemId, itemNum, isLeftReward);
}
}
private claimInfiniteHealth(amount: number, itemId: number) {
}
public updateRewardUIAfterClaim(isLeftReward: boolean) {
let targetNode = isLeftReward ?
this.node.getChildByName("leftNode") :
this.node.getChildByName("rightNode");
let num1 = targetNode.getChildByName("num_1");
let num_x = targetNode.getChildByName("num_x");
console.log("更新奖励UI:", isLeftReward);
if (targetNode) {
let getSpr = targetNode.getChildByName("get");
let getBtn = targetNode.getChildByName("getBtn");
if (getSpr && getBtn) {
getSpr.active = true;
getBtn.active = false;
this.setNodeGray(targetNode);
this.setNodeGray(num1);
}
}
}
private setNodeGray(node: cc.Node, color?: cc.Color) {
let setColor = color || cc.color(190, 190, 190, 255);
for (let i = 0; i < node.children.length; i++) {
// console.log("设置子节点颜色", node.children[i]);
node.children[i].color = setColor;
}
}
}