477 lines
17 KiB
TypeScript
477 lines
17 KiB
TypeScript
// Learn TypeScript:
|
|
// - https://docs.cocos.com/creator/manual/en/scripting/typescript.html
|
|
// Learn Attribute:
|
|
// - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
|
|
// Learn life-cycle callbacks:
|
|
// - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html
|
|
|
|
import MapConroler from "./Map";
|
|
import NumberToImage from "./NumberToImage";
|
|
import { MiniGameSdk } from "./Sdk/MiniGameSdk";
|
|
|
|
const { ccclass, property } = cc._decorator;
|
|
|
|
@ccclass
|
|
export default class SceneManager extends cc.Component {
|
|
|
|
|
|
// 缓存 shop 预制体
|
|
private static cachedShopPrefab: cc.Prefab | null = null;
|
|
// 缓存 shop 节点
|
|
private shopNode: cc.Node | null = null;
|
|
|
|
// 缓存 reward 预制体
|
|
private static cachedRewardPrefab: cc.Prefab | null = null;
|
|
// 缓存 reward 奖励窗口 节点
|
|
private RewardNode: cc.Node | null = null;
|
|
//缓存月卡
|
|
private static cachedMonthlyCardPrefab: cc.Prefab | null = null;
|
|
// 缓存月卡节点
|
|
private monthlyCardNode: cc.Node | null = null;
|
|
|
|
@property(cc.Label)
|
|
label: cc.Label = null;
|
|
|
|
@property
|
|
text: string = 'hello';
|
|
|
|
@property(cc.Node)
|
|
freeze: cc.Node = null;
|
|
|
|
@property(cc.Node)
|
|
hammer: cc.Node = null;
|
|
|
|
@property(cc.Node)
|
|
magic_wand: cc.Node = null;
|
|
|
|
@property(cc.Node)
|
|
pause: cc.Node = null;
|
|
|
|
@property(cc.Node)
|
|
level: cc.Node = null;
|
|
//time 弹窗的金币数
|
|
@property(cc.Node)
|
|
timeCoin: cc.Node = null;
|
|
|
|
//赢了win金币数
|
|
@property(cc.Node)
|
|
winCoin: cc.Node = null;
|
|
|
|
@property({ type: [cc.Prefab], tooltip: "方块数组" })
|
|
Block_Array: Array<cc.Prefab> = [];
|
|
|
|
@property({ type: [cc.Prefab], tooltip: "墙壁数组" })
|
|
Wall_Prefab: Array<cc.Prefab> = [];
|
|
|
|
particleEffects: cc.ParticleAsset[];
|
|
// @property({type: [cc.ParticleSystem], tooltip:"粒子数组"})
|
|
// particleEffects : Array<cc.ParticleSystem> = [];
|
|
|
|
load1: boolean = false;
|
|
load2: boolean = false;
|
|
load3: boolean = false;
|
|
btnName: string = '';
|
|
callBack: any;
|
|
|
|
|
|
// LIFE-CYCLE CALLBACKS:
|
|
|
|
onLoad() {
|
|
cc.game.setFrameRate(63);
|
|
this.changeBg();
|
|
// 预加载 shop 预制体
|
|
if (!SceneManager.cachedShopPrefab) {
|
|
cc.assetManager.loadBundle('shop', (err: Error, bundle: cc.AssetManager.Bundle) => {
|
|
if (err) {
|
|
cc.error(err.message || err);
|
|
return;
|
|
}
|
|
bundle.load('prefab/shop', cc.Prefab, (err: Error, prefab: cc.Prefab) => {
|
|
if (err) {
|
|
cc.error(err.message || err);
|
|
return;
|
|
}
|
|
SceneManager.cachedShopPrefab = prefab;
|
|
});
|
|
bundle.load('prefab/RewardWindow', cc.Prefab, (err: Error, prefab: cc.Prefab) => {
|
|
if (err) {
|
|
cc.error(err.message || err);
|
|
return;
|
|
}
|
|
SceneManager.cachedRewardPrefab = prefab;
|
|
});
|
|
bundle.load('prefab/monthlyCard', cc.Prefab, (err: Error, prefab: cc.Prefab) => {
|
|
if (err) {
|
|
cc.error(err.message || err);
|
|
return;
|
|
}
|
|
SceneManager.cachedMonthlyCardPrefab = prefab;
|
|
});
|
|
});
|
|
}
|
|
setTimeout(() => {
|
|
cc.director.preloadScene("HomeScene", (err) => {
|
|
if (err) {
|
|
// console.error('预加载 HomeScene 场景失败:', err);
|
|
return;
|
|
}
|
|
// console.log('成功预加载 HomeScene 场景');
|
|
});
|
|
}, 1000);
|
|
|
|
}
|
|
//更新关卡获得金币
|
|
updateWinCoin() {
|
|
console.log("更新关卡获得金币");
|
|
let winCoin = 40;
|
|
winCoin = winCoin * cc.fx.GameConfig.GM_INFO.doubleCoin;
|
|
if (winCoin > 0) {
|
|
NumberToImage.numberToImageNodes(winCoin, 50, 8, "time_", this.winCoin, false);
|
|
} else {
|
|
this.winCoin.active = false;
|
|
}
|
|
}
|
|
|
|
changeBg() {
|
|
let number = Math.floor(Math.random() * 8) + 1;
|
|
const path = 'bg/bg' + number;
|
|
cc.resources.load(path, cc.SpriteFrame, (err, spriteFrame: cc.SpriteFrame) => {
|
|
if (err) {
|
|
console.error('动态加载背景图失败:', err);
|
|
return;
|
|
}
|
|
this.node.getChildByName("Game").getChildByName("bg").getComponent(cc.Sprite).spriteFrame = spriteFrame;
|
|
})
|
|
let levelName = (cc.fx.GameConfig.GM_INFO.level + 1);
|
|
if (cc.fx.GameConfig.GM_INFO.otherLevel > 0) {
|
|
levelName = cc.fx.GameConfig.GM_INFO.otherLevel;
|
|
}
|
|
NumberToImage.numberToImageNodes(levelName, 43, 15, "level_", this.level, true);
|
|
//time金币数量
|
|
NumberToImage.numberToImageNodes(1000, 25, 15, "button_", this.timeCoin, false);
|
|
}
|
|
|
|
loadParticleEffects() {
|
|
const path = 'Particle';
|
|
cc.resources.loadDir(path, cc.ParticleAsset, (err, assets: cc.ParticleAsset[]) => {
|
|
if (err) {
|
|
console.error('动态加载粒子特效失败:', err);
|
|
return;
|
|
}
|
|
|
|
this.particleEffects = assets;
|
|
this.setParticleSort();
|
|
this.load3 = true;
|
|
//console.log('粒子特效加载成功,共加载了', this.particleEffects.length, '个粒子特效');
|
|
});
|
|
}
|
|
|
|
setWallPrefabSort() {
|
|
const order = ['down', 'downLeft', 'downRight', 'left', 'right', 'up', 'upLeft', 'upRight'];
|
|
this.Wall_Prefab.sort((a, b) => {
|
|
const indexA = order.indexOf(a.name);
|
|
const indexB = order.indexOf(b.name);
|
|
if (indexA === -1) return 1;
|
|
if (indexB === -1) return -1;
|
|
return indexA - indexB;
|
|
});
|
|
|
|
}
|
|
|
|
setParticleSort() {
|
|
const order = ['top', 'bot', 'rig', 'lef'];
|
|
this.particleEffects.sort((a, b) => {
|
|
// console.log(a.name.substr(0,3),b.name.substr(0,3));
|
|
const indexA = order.indexOf(a.name.substr(0, 3));
|
|
const indexB = order.indexOf(b.name.substr(0, 3));
|
|
if (indexA === -1) return 1;
|
|
if (indexB === -1) return -1;
|
|
return indexA - indexB;
|
|
});
|
|
}
|
|
|
|
setSort() {
|
|
this.Block_Array.sort((a, b) => {
|
|
// 从名称中提取数字部分
|
|
const numberA = parseInt(a.name.match(/\d+/)?.[0] || '0', 10);
|
|
const numberB = parseInt(b.name.match(/\d+/)?.[0] || '0', 10);
|
|
return numberA - numberB;
|
|
});
|
|
}
|
|
|
|
start() {
|
|
|
|
}
|
|
|
|
startGame() {
|
|
cc.director.loadScene("HomeScene", (err) => {
|
|
if (err) {
|
|
console.error('加载 HomeScene 场景失败:', err);
|
|
} else {
|
|
// console.log('成功切换到 HomeScene 场景');
|
|
cc.director.loadScene("HomeScene");
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
returnHome() {
|
|
if (this.node.getChildByName("Pause").getChildByName("btn").getComponent("btnControl")._touch) {
|
|
this.closePause();
|
|
if (MapConroler._instance.gameStart == true) {
|
|
// MiniGameSdk.API.showToast("体力值减少");
|
|
if (MapConroler._instance.count_Time) {
|
|
let overTime = Date.now();
|
|
let count_Time = overTime - MapConroler._instance.count_Time;
|
|
let add_Time = MapConroler._instance.add_Time;
|
|
let data = {
|
|
time: count_Time,
|
|
add_Time: add_Time,
|
|
result: "give_up"
|
|
}
|
|
cc.fx.GameTool.shushu_Track("finish_stage", data);
|
|
}
|
|
}
|
|
this.node.getChildByName("Pause").getChildByName("btn").getComponent("btnControl").setTouch(false);
|
|
cc.fx.AudioManager._instance.playEffect("zhuan1", null);
|
|
this.node.getChildByName("zhuanchang").active = true;
|
|
this.node.getChildByName("zhuanchang").getComponent(sp.Skeleton).setAnimation(1, "up", false);
|
|
cc.director.preloadScene("HomeScene", (err, asset) => {
|
|
if (err) {
|
|
console.error('动态加载 Prefab 失败:', err);
|
|
return;
|
|
}
|
|
|
|
});
|
|
|
|
setTimeout(() => {
|
|
cc.director.loadScene("HomeScene");
|
|
}, 1200);
|
|
}
|
|
}
|
|
|
|
|
|
destroyNodesInFrames(nodes: cc.Node[], callback: () => void) {
|
|
const BATCH_SIZE = 10; // 每帧销毁的节点数量
|
|
let index = 0;
|
|
|
|
const destroyBatch = () => {
|
|
let count = 0;
|
|
while (index < nodes.length && count < BATCH_SIZE) {
|
|
const node = nodes[index];
|
|
if (node) {
|
|
|
|
node.active = false;
|
|
}
|
|
index++;
|
|
count++;
|
|
}
|
|
|
|
if (index < nodes.length) {
|
|
this.scheduleOnce(destroyBatch, 6);
|
|
} else {
|
|
callback();
|
|
}
|
|
};
|
|
|
|
destroyBatch();
|
|
}
|
|
|
|
// 改进后的切换场景方法
|
|
switchToEmptyScene() {
|
|
const allNodes = cc.director.getScene().children;
|
|
this.destroyNodesInFrames(allNodes, () => {
|
|
cc.director.loadScene("HomeScene");
|
|
});
|
|
}
|
|
|
|
openPause() {
|
|
cc.fx.AudioManager._instance.playEffect("anniu_little", null);
|
|
if (this.pause.getComponent("btnControl")._touch) {
|
|
this.pause.getComponent("btnControl").setTouch(false);
|
|
this.node.getChildByName("Pause").active = true;
|
|
|
|
let pauseNode = this.node.getChildByName("Pause").getChildByName("pause");
|
|
pauseNode.scale = 0.3;
|
|
cc.tween(pauseNode)
|
|
.to(0.2, { scale: 1.05 }, { easing: 'backOut' })
|
|
.to(0.15, { scale: 1.0 }, { easing: 'sineOut' })
|
|
.start();
|
|
|
|
|
|
MapConroler._instance.pause = true;
|
|
MapConroler._instance.stopBoom();
|
|
}
|
|
}
|
|
|
|
closeShop() {
|
|
if (this.shopNode) {
|
|
this.shopNode.active = false;
|
|
MapConroler._instance.pause = false;
|
|
}
|
|
}
|
|
|
|
closePause() {
|
|
cc.fx.AudioManager._instance.playEffect("anniu_little", null);
|
|
this.pause.getComponent("btnControl").setTouch(true);
|
|
this.node.getChildByName("Pause").active = false;
|
|
var pause = MapConroler._instance.iceTrue();
|
|
if (pause == false) {
|
|
MapConroler._instance.pause = false;
|
|
MapConroler._instance.startBoom();
|
|
}
|
|
}
|
|
|
|
openPropBuy(name) {
|
|
MapConroler._instance.pause = true;
|
|
MapConroler._instance.stopBoom();
|
|
|
|
this.btnName = name;
|
|
cc.fx.AudioManager._instance.playEffect("tanchuang", null);
|
|
let propWindow = this.node.getChildByName("Game").getChildByName("propWindow");
|
|
propWindow.active = true;
|
|
propWindow = propWindow.getChildByName("prop");
|
|
cc.fx.AudioManager._instance.playEffect("tanchuang", null);
|
|
let pauseNode = propWindow;
|
|
pauseNode.scale = 0.3;
|
|
cc.tween(pauseNode)
|
|
.to(0.2, { scale: 1.05 }, { easing: 'backOut' })
|
|
.to(0.15, { scale: 1.0 }, { easing: 'sineOut' })
|
|
.start();
|
|
propWindow.getChildByName("freeze").active = false;
|
|
propWindow.getChildByName("hammer").active = false;
|
|
propWindow.getChildByName("magic").active = false;
|
|
propWindow.getChildByName("buy_Btn").getComponent("btnControl").setTouch(true);
|
|
propWindow.getChildByName(name).active = true;
|
|
// if(name == "hammer"){
|
|
// propWindow.getChildByName("buy_Btn").getChildByName("hammer").active = true;
|
|
// propWindow.getChildByName("buy_Btn").getChildByName("nomal").active = false;
|
|
// }
|
|
// else{
|
|
// propWindow.getChildByName("buy_Btn").getChildByName("hammer").active = false;
|
|
// propWindow.getChildByName("buy_Btn").getChildByName("nomal").active = true;
|
|
// }
|
|
}
|
|
|
|
|
|
clickBtn() {
|
|
cc.fx.AudioManager._instance.playEffect("anniu_Big", null);
|
|
let propWindow = this.node.getChildByName("Game").getChildByName("propWindow").getChildByName("prop");
|
|
if (propWindow.getChildByName("buy_Btn").getComponent("btnControl")._touch) {
|
|
propWindow.getChildByName("buy_Btn").getComponent("btnControl").setTouch(false);
|
|
if (this.btnName == "freeze")
|
|
MapConroler._instance.buyFreeze();
|
|
else if (this.btnName == "hammer")
|
|
MapConroler._instance.buyHammer();
|
|
else if (this.btnName == "magic")
|
|
MapConroler._instance.buyMagic();
|
|
}
|
|
}
|
|
|
|
resetBtn() {
|
|
let propWindow = this.node.getChildByName("Game").getChildByName("propWindow").getChildByName("prop");
|
|
propWindow.getChildByName("buy_Btn").getComponent("btnControl").setTouch(true);
|
|
}
|
|
|
|
|
|
//打开商店
|
|
openShop() {
|
|
if (!SceneManager.cachedShopPrefab) {
|
|
cc.error('Shop prefab is not loaded yet.');
|
|
return;
|
|
}
|
|
MapConroler._instance.pause = true;
|
|
if (!this.shopNode) {
|
|
// 第一次使用,创建节点
|
|
this.shopNode = cc.instantiate(SceneManager.cachedShopPrefab);
|
|
this.node.addChild(this.shopNode);
|
|
this.shopNode.getComponent("shop").init();
|
|
} else {
|
|
// 非第一次使用,直接激活节点
|
|
this.shopNode.active = true;
|
|
this.shopNode.getComponent("shop").init();
|
|
}
|
|
// console.log("shopNode parent:", this.shopNode.parent);
|
|
}
|
|
//打开月卡
|
|
openMonthlyCard() {
|
|
if (!SceneManager.cachedMonthlyCardPrefab) {
|
|
cc.error('MonthlyCard prefab is not loaded yet.');
|
|
return;
|
|
}
|
|
if (!this.monthlyCardNode) {
|
|
// 第一次使用,创建节点
|
|
this.monthlyCardNode = cc.instantiate(SceneManager.cachedMonthlyCardPrefab);
|
|
this.node.addChild(this.monthlyCardNode);
|
|
this.monthlyCardNode.getComponent("monthlyCard").init();
|
|
this.monthlyCardNode.getComponent("monthlyCard").juwai = false;
|
|
} else {
|
|
// 非第一次使用,直接激活节点
|
|
this.monthlyCardNode.active = true;
|
|
this.monthlyCardNode.getComponent("monthlyCard").init();
|
|
this.monthlyCardNode.getComponent("monthlyCard").juwai = false;
|
|
}
|
|
}
|
|
|
|
updateCoin() {
|
|
MapConroler._instance.updateCoin();
|
|
}
|
|
|
|
|
|
closePropBuy() {
|
|
var pause = MapConroler._instance.iceTrue();
|
|
if (pause == false) {
|
|
MapConroler._instance.pause = false;
|
|
MapConroler._instance.startBoom();
|
|
}
|
|
|
|
let freezeBtn = MapConroler._instance.node.parent.getChildByName("Bottom").getChildByName("timeBtn");
|
|
let hammerBtn = MapConroler._instance.node.parent.getChildByName("Bottom").getChildByName("destroyBtn");
|
|
let magicBtn = MapConroler._instance.node.parent.getChildByName("Bottom").getChildByName("magicBtn");
|
|
if (this.btnName == "freeze") freezeBtn.getComponent("btnControl").setTouch(true);
|
|
else if (this.btnName == "hammer") hammerBtn.getComponent("btnControl").setTouch(true);
|
|
else if (this.btnName == "magic") magicBtn.getComponent("btnControl").setTouch(true);
|
|
|
|
this.node.getChildByName("Game").getChildByName("propWindow").active = false;
|
|
}
|
|
|
|
openRewardWindow(data) {
|
|
console.log("_____________________打开奖励弹窗", data);
|
|
if (!SceneManager.cachedRewardPrefab) {
|
|
cc.error('Reward prefab is not loaded yet.');
|
|
return;
|
|
}
|
|
if (!this.RewardNode) {
|
|
// 第一次使用,创建节点
|
|
this.RewardNode = cc.instantiate(SceneManager.cachedRewardPrefab);
|
|
this.node.addChild(this.RewardNode);
|
|
this.RewardNode.zIndex = 99;
|
|
this.RewardNode.getComponent("Reward").init(data);
|
|
}
|
|
else {
|
|
this.RewardNode.destroy();
|
|
this.RewardNode = null;
|
|
this.RewardNode = cc.instantiate(SceneManager.cachedRewardPrefab);
|
|
this.node.addChild(this.RewardNode);
|
|
this.RewardNode.zIndex = 99;
|
|
this.RewardNode.getComponent("Reward").init(data);
|
|
}
|
|
this.RewardNode.zIndex = 1001;
|
|
}
|
|
|
|
shareFriend() {
|
|
console.log("设置分享链接");
|
|
let timeStamp = Date.now();
|
|
let otherInfo = {
|
|
timeStamp: timeStamp,
|
|
otherLevel: (cc.fx.GameConfig.GM_INFO.level + 1),
|
|
}
|
|
cc.fx.StorageMessage.setStorage("otherLevel", otherInfo);
|
|
MiniGameSdk.API.shareGame();
|
|
}
|
|
|
|
update(dt) {
|
|
|
|
}
|
|
}
|