colorBlock/assets/Script/SceneManager.ts
2025-06-30 14:29:29 +08:00

278 lines
9.2 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 { MiniGameSdk } from "./Sdk/MiniGameSdk";
const {ccclass, property} = cc._decorator;
@ccclass
export default class SceneManager extends cc.Component {
@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({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();
setTimeout(() => {
cc.director.preloadScene("HomeScene", (err) => {
if (err) {
// console.error('预加载 HomeScene 场景失败:', err);
return;
}
// console.log('成功预加载 HomeScene 场景');
});
}, 1000);
}
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;
})
}
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){
if(MapConroler._instance.gameStart == true){
MiniGameSdk.API.showToast("体力值减少");
cc.fx.GameTool.setUserHealth(-1,(data)=>{
})
if(MapConroler._instance.count_Time){
let count_Time = 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;
MapConroler._instance.pause = true;
}
}
closePause(){
cc.fx.AudioManager._instance.playEffect("anniu_little",null);
this.pause.getComponent("btnControl").setTouch(true);
this.node.getChildByName("Pause").active = false;
if(MapConroler._instance.node.parent.getChildByName("Ice").active == false){
MapConroler._instance.pause = false;
}
}
openPropBuy(name){
MapConroler._instance.pause = true;
this.btnName = name;
let propWindow = this.node.getChildByName("Game").getChildByName("propWindow");
propWindow.active = true;
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;
}
clickBtn(){
cc.fx.AudioManager._instance.playEffect("anniu_Big",null);
let propWindow = this.node.getChildByName("Game").getChildByName("propWindow");
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();
}
}
closePropBuy(){
MapConroler._instance.pause = false;
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;
}
update (dt) {
}
}