import { BlockType } from "./Block"; // 主游戏控制类 const {ccclass, property} = cc._decorator; @ccclass export default class GameManager extends cc.Component { @property(cc.Node) Map: cc.Node = null; @property(cc.Prefab) Block: cc.Prefab = null; @property(cc.Label) Time: cc.Label = null; @property(cc.Label) Countdown: cc.Label = null; @property(cc.Node) Guide: cc.Node = null; step:number; //引导步骤 bgClick:boolean //引导时Mask遮罩可不可以点击 btnClick:boolean //引导时,按钮可不可点击 custom:number; //当前难度随机地图ID countTime: number; //总倒计时 waterTime: number //洪峰倒计时 startTime: number; //游戏开始计时 replaceTime: number //洪峰倒计时,当总剩余时间小于洪峰倒计时,用于替代 finishiTime:number; //提交时间 scoreTime:number //用于计算提交到洪峰来的时间差 block_Array: any; //所有块数组 path_Array: any; //修筑路径 water_Array: any; //水流路径 map_Array: any; //地图数组 water_PathAray:any; //洪峰路径 tip_Array: any; //引导数组 map_Hight:number; //地图高度 map_Width:number; //地图宽度 min_Time:number; //上一把地图结束时,距离洪峰来临时间 (>5秒是个分水岭) min_Steps:number; //当前地图最优步数 plan_over:boolean; //是否修建完 waterTween:cc.Tween; //河水倒计时动画 onLoad () { } start () { cc.fx.GameConfig.CLICK_init(); this.fit(); this.init(); } //处理地图数据 第一关完全随机,从第二关开始,赢了根据5秒洪峰来临增加难度步数,输了当前难度减步数 getMap(){ var custom = 0; var map = []; if(cc.fx.GameConfig.GM_INFO.level == 1){ custom = Math.floor(Math.random()* cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level].length); } else{ var arr = cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level]; if(cc.fx.GameConfig.GM_INFO.min_Time == -1){ map = this.getMapArray(arr,cc.fx.GameConfig.GM_INFO.min_Steps - 1,false); } else if(cc.fx.GameConfig.GM_INFO.min_Time >= 5){ map = this.getMapArray(arr,cc.fx.GameConfig.GM_INFO.min_Steps + 2,true); } else{ map = this.getMapArray(arr,cc.fx.GameConfig.GM_INFO.min_Steps + 1,true); } var random = Math.floor(Math.random()* map.length); custom = map[random]; // console.log(custom,map); } //记录当前最小步数 cc.fx.GameConfig.GM_INFO.min_Steps = cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level][custom].min_steps; cc.fx.GameConfig.GM_INFO.min_Time = 0; return custom; } /** * 获取下一关难度,步数增加2或者1,如果没有则降到有. * @param arr 配置里读取,当前(x*x)地图等级内所有地图数组 * @param min_steps 最佳步数,下一关难度或者输了降难度,根据最佳步数增加或者减少。 * @param type true为增加步数,false为输了降低难度步数 */ getMapArray(arr,min_steps,type){ var map = []; for(let i=0; i { return arr.map((val) => val[i]) }) this.map_Width = this.map_Array.length; this.map_Hight = this.map_Array[0].length; this.Map.x =(6 - this.map_Array.length)*48; this.Map.y = (this.map_Array[0].length - 6.5)*48; for(let i=0;i 0){ if(this.path_Array[order-1].z == 0){ //console.log("1正常放入",this.path_Array[order-1].x,this.path_Array[order-1].y,this.path_Array[order-1].z) this.changeWater(cc.v3(this.path_Array[order-1].x,this.path_Array[order-1].y,0)); if(order == this.path_Array.length-1){ this.changeWater(cc.v3(this.path_Array[order].x,this.path_Array[order].y,0)); // console.log("最后放入",this.path_Array[order].x,this.path_Array[order].y) } } else{ //console.log("2插入",this.path_Array[order].x,this.path_Array[order].y,this.path_Array[order].z) this.changeWater(cc.v3(this.path_Array[order].x,this.path_Array[order].y,0)); } } if(order <= this.path_Array.length-1){ let i = this.path_Array[order].x*this.map_Array[0].length+this.path_Array[order].y; let direction = ""; let circulate = true; //最后一步结束 if(order == this.path_Array.length-1){ circulate = false; direction = "End"; // console.log("进入结束"); if(this.path_Array.length > 1){ // console.log("准备出水"); setTimeout(() => { if(!this.plan_over){ this.plan_over = true; var head = this.node.getChildByName("Top").getChildByName("head"); var progress = this.node.getChildByName("Top").getChildByName("progress").getComponent(cc.Sprite); head.stopAllActions(); head.setPosition(310,head.y); if(this.waterTween) this.waterTween.stop(); progress.fillRange = 1; cc.fx.GameConfig.GM_INFO.min_Time = this.waterTime; this.runWater(0); } }, 500); } else{ direction = "err"; // console.log("进入结束err"); } } else{ if(this.path_Array[order].z == 6 && order + 1 < this.path_Array.length ) { direction = "Reinforce"; i = this.path_Array[order+1].x*this.map_Array[0].length+this.path_Array[order+1].y; } else if(order+1 < this.path_Array.length){ if(this.path_Array[order+1].z == 5){ direction = "Xi_Soil"; } else if(this.path_Array[order+1].z == 6 && order == 0 && order + 1 < this.path_Array.length){ // direction = this.getDirection(order+1,this.path_Array); direction = this.getDirection(order,this.path_Array); } else{ direction = this.getDirection(order,this.path_Array); } } else{ direction = this.getDirection(order,this.path_Array); } } // console.log(order,this.path_Array[order].x,this.path_Array[order].y,i); // console.log("步骤:",order,"方向",direction); let jg = this.getBoundary(order,this.path_Array[order].x,this.path_Array[order].y,direction,this.path_Array); // if(direction == "" || jg == false) return; if(direction == "err" || direction == "" || jg == false){ cc.fx.Notifications.emit(cc.fx.Message.showResult,"lose"); return; } if( i<0 || i > (this.block_Array.length-1)){ cc.fx.Notifications.emit(cc.fx.Message.showResult,"lose"); return; } let target = this.block_Array[i].getComponent("Block"); target.setPath(direction); if(order > 0 && order < this.path_Array.length-1){ if(this.path_Array[order+1].z == 5){ this.set_Soil(order+1,this.path_Array,"road"); circulate = false; return; } else if(order == 1 && this.path_Array[order].z == 5){ this.set_Soil(order,this.path_Array,"road"); circulate = false; return; } } let pos = cc.v2(); if(direction == "End"){ if(order > 0){ // if(this.path_Array[order-1].z == 0){ pos = cc.v2(this.path_Array[order-1].x, this.path_Array[order-1].y); // } } } let data = { order:order, time:cc.fx.GameConfig.TIME_INFO.waterSpeed[cc.fx.GameConfig.GM_INFO.level], type:this.path_Array[order].z, circulate:circulate, last:pos }; target.runRoad(data); } } /** * 判断边界。或者撞山,或者湿地没有加固 * @param order 建筑地图数组里的执行的序列号 * @param x 当前操作地块横坐标 * @param y 当前操作地块纵坐标 * @param direction 当前操作方向,若不是方向则为息壤或者加固 * @param road 建筑地图数组,可理解为路径数组,path_Array */ getBoundary(order,x,y,direction,road){ let jg = true; if(x < 0 || x >= this.map_Width || y < 0 || y >= this.map_Hight){ jg = false; // console.log("超过边界,游戏结束"); // alert("超过边界,治水失败"); cc.fx.Notifications.emit(cc.fx.Message.showResult,"lose"); } else { let i = road[order].x*this.map_Array[0].length+road[order].y; let target = this.block_Array[i].getComponent("Block"); if(target.block_Type == 3){ jg = false; // console.log("修筑山峰,游戏结束"); // alert("修筑山峰,治水失败"); cc.fx.Notifications.emit(cc.fx.Message.showResult,"lose"); } else if(target.block_Type == 2 && direction != "Reinforce"){ jg = false; // console.log("修筑未加固湿地,游戏结束"); // alert("修筑未加固湿地,游戏结束"); cc.fx.Notifications.emit(cc.fx.Message.showResult,"lose"); } } return jg; } /** * 开始执行洪峰来了的动画 * @param order 建筑地图数组里的执行的序列号,依次往下加 */ runWater(order){ order = parseInt(order); if(order <= this.water_Array.length-1){ let i = this.water_Array[order].x*this.map_Array[0].length+this.water_Array[order].y; let direction = ""; let circulate = true; //最后一步结束 if(order == this.water_Array.length-1){ circulate = false; direction = "End"; } else{ if(this.water_Array[order].z == 6 && order + 1 < this.water_Array.length && order!=1) { direction = "Reinforce"; i = this.water_Array[order+1].x*this.map_Array[0].length+this.water_Array[order+1].y; } else if(order+1 < this.water_Array.length){ if(this.water_Array[order+1].z == 5){ direction = "Xi_Soil"; } else if(this.water_Array[order+1].z == 6 && order == 0){ direction = "Reinforce"; } else{ direction = this.getDirection(order,this.water_Array); } } else{ direction = this.getDirection(order,this.water_Array); } } let jg = this.getBoundary(order,this.water_Array[order].x,this.water_Array[order].y,direction,this.water_Array); if(direction == "" || jg == false || direction == "err"){ cc.fx.Notifications.emit(cc.fx.Message.showResult,"lose"); return; } let target = this.block_Array[i].getComponent("Block"); target.setPath(direction); if(order > 0 && order < this.water_Array.length-1){ if(this.water_Array[order+1].z == 5){ this.set_Soil(order+1,this.water_Array,"water"); circulate = false; return; } else if(order == 1 && this.water_Array[order].z == 5){ this.set_Soil(order,this.water_Array,"water"); circulate = false; return; } } let pos = cc.v2(); if(direction == "End"){ if(order > 0){ if(this.water_Array[order-1].z == 0){ pos = cc.v2(this.water_Array[order-1].x, this.water_Array[order-1].y); } } } let data = { order:order, time:cc.fx.GameConfig.TIME_INFO.waterSpeed[cc.fx.GameConfig.GM_INFO.level], type:this.water_Array[order].z, circulate:circulate, last:pos }; target.runWater(data); } } /** * 获取息壤的格子的方向 * @param order 建筑地图数组里的执行的序列号,依次往下加 * @param road 建筑地图数组或者洪峰路径数组,可理解为路径数组,path_Array water_Array */ getXi_Soil(order,road){ var direction = null; //如果息壤后面还有下一步的话 if(order + 1 < road.length){ direction = this.getDirection(order,road); if(direction == "up" || direction == "right_up" || direction == "left_up"){ direction = "up"; } else if(direction == "down" || direction == "left_down" || direction == "right_down"){ direction = "down"; } else if(direction == "left" || direction == "up_left" || direction == "down_left"){ direction = "left"; } else if(direction == "right" || direction == "up_right" || direction == "down_right"){ direction = "right"; } } return direction; } /** * 设置息壤执行方法 * @param order 建筑地图数组里的执行的序列号,依次往下加 * @param road 建筑地图数组或者洪峰路径数组,可理解为路径数组,path_Array water_Array * @param name road或者water,建筑路径或者洪峰路径 */ set_Soil(order,road,name){ var direction = this.getXi_Soil(order,road); var length = 0; if(direction == "right"){ length = this.map_Width - 1; // let temp = this.map_Width - 1; for(let i=road[order].x;i<=length;i++){ let n = i*this.map_Array[0].length+road[order].y; let target = this.block_Array[n].getComponent("Block"); if(target.block_Type == 3 || target.block_Type == 4){ length = i-1; if(target.block_Type == 4){ length += 1; } i = 10000; break; } } } else if(direction == "left"){ length = 0; for(let i=road[order].x;i>=length;i--){ let n = i*this.map_Array[0].length+road[order].y; let target = this.block_Array[n].getComponent("Block"); if(target.block_Type == 3 || target.block_Type == 4){ length = i + 1; if(target.block_Type == 4){ length -= 1; } i = -1; break; } } } else if(direction == "up"){ length = 0; for(let i=road[order].y;i>=length;i--){ let n = road[order].x*this.map_Array[0].length + i; let target = this.block_Array[n].getComponent("Block"); if(target.block_Type == 3 || target.block_Type == 4){ length = i + 1; if(target.block_Type == 4){ length -= 1; } i = -1; break; } } } else if(direction == "down"){ length = this.map_Hight - 1; for(let i=road[order].y;i<=length;i++){ let n = road[order].x*this.map_Array[0].length + i; let target = this.block_Array[n].getComponent("Block"); if(target.block_Type == 3 || target.block_Type == 4){ length = i-1; if(target.block_Type == 4){ length += 1; } i = 10000; break; } } } this.soil_Find(direction,order,length,road,name); } //查找息壤蛮遗憾路径 soil_Find(direction,order,length,road,name){ let start = road[order].x; if(direction == "right"){ for(let i = start; i<=length; i++){ let n = i*this.map_Array[0].length+road[order].y; let target = this.block_Array[n].getComponent("Block"); if(i == start){ if(i == start && i==length){ cc.fx.Notifications.emit(cc.fx.Message.showResult,"lose"); target.set_Xi_SoilType(this.getDirection(order,road),order,name); } else target.set_Xi_SoilType(this.getDirection(order,road),null,name); let value = cc.v3(this.path_Array[order].x,this.path_Array[order].y,0); if(this.water_Array[this.water_Array.length-1] != value){ // console.log("特别插入:",this.path_Array[order].x,this.path_Array[order].y); this.changeWater(value); } } else { let jg = null; if(i == length){ let number = i - start -1; this.changePath(order,number,false,road); jg = order; } target.set_Xi_SoilType(direction,jg,name); } } } else if(direction == "left"){ for(let i = start; i>=length; i--){ let n = i*this.map_Array[0].length+road[order].y; let target = this.block_Array[n].getComponent("Block"); if(i == start){ if(i == start && i==length){ cc.fx.Notifications.emit(cc.fx.Message.showResult,"lose"); target.set_Xi_SoilType(this.getDirection(order,road),order,name); } else target.set_Xi_SoilType(this.getDirection(order,road),null,name); let value = cc.v3(this.path_Array[order].x,this.path_Array[order].y,0); if(this.water_Array[this.water_Array.length-1] != value){ // console.log("特别插入:",this.path_Array[order].x,this.path_Array[order].y); this.changeWater(value); } } else { let jg = null; if(i == length){ let number = i - start + 1; this.changePath(order,number,false,road); jg = order; } target.set_Xi_SoilType(direction,jg,name); } } } else if(direction == "up"){ start = road[order].y; for(let i = start; i>=length; i--){ let n = road[order].x*this.map_Array[0].length+i; let target = this.block_Array[n].getComponent("Block"); if(i == start){ if(i == start && i==length){ cc.fx.Notifications.emit(cc.fx.Message.showResult,"lose"); target.set_Xi_SoilType(this.getDirection(order,road),order,name); } else{ target.set_Xi_SoilType(this.getDirection(order,road),null,name); } let value = cc.v3(this.path_Array[order].x,this.path_Array[order].y,0); if(this.water_Array[this.water_Array.length-1] != value){ // console.log("特别插入:",this.path_Array[order].x,this.path_Array[order].y); this.changeWater(value); } } else { let jg = null; if(i == length){ let number = i - start + 1; this.changePath(order,number,true,road); jg = order; } // console.log("想上息壤插入:",this.path_Array[order].x,i); target.set_Xi_SoilType(direction,jg,name); } } } else if(direction == "down"){ start = road[order].y; for(let i = start; i<=length; i++){ let n = road[order].x*this.map_Array[0].length+i; let target = this.block_Array[n].getComponent("Block"); if(i == start){ if(i == start && i==length){ cc.fx.Notifications.emit(cc.fx.Message.showResult,"lose"); target.set_Xi_SoilType(this.getDirection(order,road),order,name); } else target.set_Xi_SoilType(this.getDirection(order,road),null,name); let value = cc.v3(this.path_Array[order].x,this.path_Array[order].y,0); if(this.water_Array[this.water_Array.length-1] != value){ // console.log("特别插入:",this.path_Array[order].x,this.path_Array[order].y); this.changeWater(value); } } else { let jg = null; if(i == length){ let number = i - start - 1; this.changePath(order,number,true,road); jg = order; } target.set_Xi_SoilType(direction,jg,name); } } } } /** * 改变水流地图 * @param value 需要根据使用息壤情况,插入到洪峰路径的点 */ changeWater(value){ let jg = true; if(this.water_Array.length > 0){ if(this.water_Array[this.water_Array.length-1].x == value.x && this.water_Array[this.water_Array.length-1].y == value.y){ jg = false; } } if(jg) this.water_Array.push(value); } /** * 息壤过后改变修筑路径 * @param order 建筑地图数组里的执行的序列号 * @param number 息壤执行长度,改变息壤用后其他路径的X或Y值 * @param direction 只为两个方向,横向false,纵向true * @param road 建筑地图数组或者洪峰路径数组,可理解为路径数组,path_Array water_Array */ changePath(order,number,direction,road){ for(let i = (order+1); i0; n--){ this.changeWater(cc.v3(this.path_Array[order+1].x,this.path_Array[order+1].y+n,0)); // console.log("1特殊放入:",this.path_Array[order+1].x,this.path_Array[order+1].y+n) } } else{ for(let n=number; n>0; n--){ this.changeWater(cc.v3(this.path_Array[order+1].x,this.path_Array[order+1].y-n,0)); // console.log("2特殊放入:",this.path_Array[order+1].x,this.path_Array[order+1].y-n) } } }else{ if(number < 0){ for(let m= -number; m>0; m--){ this.changeWater(cc.v3(this.path_Array[order+1].x+m,this.path_Array[order+1].y,0)); // console.log("3特殊放入:",this.path_Array[order+1].x+m,this.path_Array[order+1].y) } } else{ for(let m=number; m>0; m--){ this.changeWater(cc.v3(this.path_Array[order+1].x-m,this.path_Array[order+1].y,0)); // console.log("4特殊放入:",this.path_Array[order+1].x-m,this.path_Array[order+1].y) } } } } /** * 获取洪峰方向 * @param order 建筑地图数组里的执行的序列号 * @param road 建筑地图数组或者洪峰路径数组,可理解为路径数组,path_Array water_Array */ getDirection(order,road){ var name = ""; //入海口比较复杂单独判断 if(order == 0){ if(this.path_Array[order+1].z == 6 && road == this.path_Array) order += 1; let nextX = road[order+1].x - road[order].x; let nextY = road[order].y - road[order+1].y; //在底边 if(road[order].y == this.map_Array[0].length-1){ if(nextX == 0){ if(nextY == 1)name = "up"; else if(nextY == -1) name = "err"; } else if(nextX == 1) name = "up_right"; else if(nextX == -1) name = "up_left"; } //在顶边 else if(road[order].y == 0){ if(nextX == 0){ if(nextY == 1)name = "err"; else if(nextY == -1) name = "down"; } else if(nextX == 1) name = "down_right"; else if(nextX == -1) name = "down_left"; } //在左边 else if(road[order].x == 0){ if(nextX == 0){ if(nextY == 1)name = "right_up"; else if(nextY == -1) name = "right_down"; } else if(nextX == 1) name = "right"; else if(nextX == -1) name = "err"; } //在右边 else if(road[order].x == this.map_Array.length-1){ if(nextX == 0){ if(nextY == 1)name = "left_up"; else if(nextY == -1) name = "left_down"; } else if(nextX == 1) name = "err"; else if(nextX == -1) name = "left"; } } //不是第一步,已经走过一步 else if(order > 0){ var next = 1; if(order+2 < road.length){ if(road[order+1].z == 6) next = 2; } //用于判断此点的上一个点,是为了判断当前方块洪水七点,以及下一个移动方向,判断洪终点方向 let nextX = road[order+next].x - road[order].x; let nextY = road[order].y - road[order+next].y let previousX = road[order].x - road[order-1].x; let previousY = road[order-1].y - road[order].y; if(previousX == 0 && previousY == 0){ if(order > 1){ previousX = road[order].x - road[order-2].x; previousY = road[order-2].y - road[order].y; } else if(order + 1 < road.length){ previousX = road[order+1].x - road[order].x; previousY = road[order].y - road[order+1].y; // console.log("息壤,上下坐标差距",previousX,previousY); } } if(previousX == 0 && previousY >= 1){ if(nextX == 0){ if(nextY == 1)name = "up"; else if(nextY == -1) name = "err"; } else if(nextX == 1) name = "up_right"; else if(nextX == -1) name = "up_left"; } else if(previousX == 0 && previousY <= -1){ if(nextX == 0){ if(nextY == 1)name = "err"; else if(nextY == -1) name = "down"; } else if(nextX == 1) name = "down_right"; else if(nextX == -1) name = "down_left"; } else if(previousX >= 1 && previousY == 0){ if(nextX == 0){ if(nextY == 1)name = "right_up"; else if(nextY == -1) name = "right_down"; } else if(nextX == 1) name = "right"; else if(nextX == -1) name = "err"; } else if(previousX <= -1 && previousY == 0){ if(nextX == 0){ if(nextY == 1)name = "left_up"; else if(nextY == -1) name = "left_down"; } else if(nextX == 1) name = "err"; else if(nextX == -1) name = "left"; } } return name ; } //根据是否全面屏,做独立适配方面 fit(){ var jg = this.setFit(); if(!jg){ this.Map.scale = 1.2; }else{ this.Map.scale = 1; } } //判断全面屏 getSetScreenResolutionFlag () { let size = cc.winSize; let width = size.width; let height = size.height; if ((height / width) > (16.2 / 9)) return false; return true; } //判断全面屏适配 setFit () { let flag = this.getSetScreenResolutionFlag(); if (flag) { } else { } return flag; } //返回首页 backScene(){ cc.director.loadScene("LoadScene"); } /** * 开始修筑 * @param data 记录操作的数组 */ startGame(data){ this.unschedule(this.updateWaterTime); for(let i=0; i 0){ for(let i=0; i 0) { this.waterTime -= 1; this.Countdown.string = cc.fx.GameTool.getTimeMargin(this.waterTime); if(this.waterTime <= 0){ this.unschedule(this.updateWaterTime); if(!this.plan_over){ this.waterTime = 0; this.plan_over = true; setTimeout(() => { if(this.water_Array.length == 0){ cc.fx.Notifications.emit(cc.fx.Message.showResult,"lose"); } else{ cc.fx.GameConfig.GM_INFO.min_Time = this.waterTime; this.runWater(0); } }, 500); } } } } //如果是倒计时 调用此方法 updateCountDownTime () { if (this.countTime > 0) { this.countTime -= 1; cc.fx.GameConfig.TIME_INFO.totalTime = this.countTime; this.Time.string = cc.fx.GameTool.getTimeMargin(this.countTime); if(this.countTime < 5){ let over = this.node.getChildByName("Over"); cc.tween(over) .to(0.2,{opacity:255}) .delay(0.1) .to(0.2,{opacity:0}) .start(); } if(this.countTime <= 0){ this.countTime = 0; this.setData("lose"); this.unschedule(this.updateCountDownTime); this.gameOver(); } } } //上传每次操作数据 success为成功还是失败 setData(success){ //设置埋点数据 cc.fx.GameConfig.CLICK_SET("mapId",cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level][this.custom].id); cc.fx.GameConfig.CLICK_SET("difficulty",cc.fx.GameConfig.GM_INFO.level); cc.fx.GameConfig.CLICK_SET("optimizedSteps",cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level][this.custom].min_steps); cc.fx.GameConfig.CLICK_SET("round",cc.fx.GameConfig.GM_INFO.round); cc.fx.GameConfig.CLICK_SET("timer",cc.fx.GameConfig.TIME_INFO.totalTime); cc.fx.GameConfig.CLICK_SET("cumulativeScore",cc.fx.GameConfig.GM_INFO.score); success = success =="lose"?false:true if(success != null){ cc.fx.GameConfig.CLICK_SET("success",success); cc.fx.GameConfig.GM_INFO.fen = this.getScore(); if(!success) cc.fx.GameConfig.GM_INFO.fen = 0; cc.fx.GameConfig.CLICK_SET("getScore",cc.fx.GameConfig.GM_INFO.fen); cc.fx.GameConfig.GM_INFO.score += cc.fx.GameConfig.GM_INFO.fen; this.node.getChildByName("Top").getChildByName("id").getComponent(cc.Label).string = cc.fx.GameConfig.GM_INFO.score; cc.fx.GameConfig.CLICK_SET("cumulativeScore",cc.fx.GameConfig.GM_INFO.score); if(this.countTime != 0)cc.fx.GameConfig.GM_INFO.successList.push(success); } cc.fx.GameTool.setGameData(); } //计算得分 getScore(){ //最小步数 let min = cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level][this.custom].min_steps; //实际使用步数 let now = this.path_Array.length-1; if(now <=0) now = 0; var x = (2.5*min - now) / min; let score = Math.pow(min,x) ** 0.5; score = score * (this.scoreTime + 10)*100; return Math.floor(score); } //上传排行榜数据 gameOver(){ var rate = 0; var successList = cc.fx.GameConfig.GM_INFO.successList; if(successList.length > 0){ var success = 0; for(let i=0; i{ cc.director.loadScene("OverScene"); }) .start() } //展示结果 data为成功或者失败 showResult(data){ if(this.node.getChildByName("GameOver").active == false && this.node.getChildByName("Window").active == false){ cc.fx.Notifications.emit(cc.fx.Message.setData,data); if(data == "lose"){ cc.fx.AudioManager._instance.playEffect("lose",null); cc.fx.GameConfig.GM_INFO.min_Time = -1; } else{ cc.fx.AudioManager._instance.playEffect("win",null); } this.node.getChildByName("Window").active = true; this.node.getChildByName("Window").getComponent("Window").init(data); } } //记录反应时长,以及做步骤提示 data为操作名称 clickSun(data){ //如果没有记录过 回合开始到操作反应时长,则第一次记录, 后面不记录 if(cc.fx.GameConfig.CLICK_DATA.startTime == -1){ this.finishiTime = cc.fx.GameTool.getTime(); var now = this.finishiTime - this.startTime; // console.log("startTime:",this.finishiTime); cc.fx.GameConfig.CLICK_SET("startTime",now); } if(cc.fx.GameConfig.GM_INFO.level > 3) return; //步骤提示 var nowPos = this.path_Array[0]; if(this.tip_Array.length != 0){ if(this.tip_Array[this.tip_Array.length-1] == null){ this.tip_Array.push(null); return; } nowPos = this.tip_Array[this.tip_Array.length-1][this.tip_Array[this.tip_Array.length-1].length-1]; if(nowPos){ let n = nowPos.x*this.map_Array[0].length+nowPos.y; let targetNode = this.block_Array[n]; if(targetNode.getChildByName("tipLose").active == true){ this.tip_Array.push(null); return; } } else{ return; } } if(data == "up"){ let n = cc.v2(nowPos.x,nowPos.y-1); this.tipCan(n,data); } else if(data == "down"){ let n = cc.v2(nowPos.x,nowPos.y+1); this.tipCan(n,data); } else if(data == "left"){ let n = cc.v2(nowPos.x-1,nowPos.y); this.tipCan(n,data); } else if(data == "right"){ let n = cc.v2(nowPos.x+1,nowPos.y); this.tipCan(n,data); } else if(data == "reinforce"){ let n = cc.v3(nowPos.x,nowPos.y,2); this.tip_Array.push([n]); } else if(data == "soil"){ let n = cc.v3(nowPos.x,nowPos.y,3); this.tip_Array.push([n]); } } //提示是否错误 只前三关有 ,pos为位置,data为操作方向 tipCan(pos,data){ //先判断是否出边界 if(pos.x <0 || pos.x >this.map_Array.length-1 || pos.y <0 || pos.y > this.map_Array[0].length-1 ){ this.tip_Array.push(null); return; } let n = pos.x*this.map_Array[0].length+pos.y; let target = this.block_Array[n].getComponent("Block"); target.node.getChildByName("tipWin").active = true; //重复路回头路,或者山峰 if(target.repeatRoad(false,null) == true || target.block_Type == 3){ this.tip_Array.push([cc.v3(pos.x,pos.y,0)]); target.node.getChildByName("tipLose").active = true; target.node.getChildByName("tipWin").active = false; } //湿地 上一步如果没用息壤或者加固 else if(target.block_Type == 2){ if(this.tip_Array.length > 0){ if(this.tip_Array[this.tip_Array.length-1][0].z == 0){ target.node.getChildByName("tipLose").active = true; target.node.getChildByName("tipWin").active = false; } else if(this.tip_Array[this.tip_Array.length-1][0].z == 2){ target.node.getChildByName("tipLose").active = false; target.node.getChildByName("tipWin").active = true; } } else{ target.node.getChildByName("tipLose").active = true; target.node.getChildByName("tipWin").active = false; } } if(this.tip_Array.length > 0){ if(this.tip_Array[this.tip_Array.length-1][0].z == 3){ if(data == "up"){ var arr = []; for(let i=pos.y; i >=0;i--){ let block = this.block_Array[pos.x*this.map_Array[0].length+i].getComponent("Block"); if(block.block_Type == 3){ i = -10000; } else{ block.node.getChildByName("tipWin").active = true; arr.push(cc.v3(pos.x,i,0)); if( block.block_Type == 4) i = -10000; } } this.tip_Array.push(arr); } else if(data == "down"){ var arr = []; for(let i=pos.y; i=0 ;i--){ let block = this.block_Array[i*this.map_Array[0].length+pos.y].getComponent("Block"); if(block.block_Type == 3){ i = -10000; } else{ block.node.getChildByName("tipWin").active = true; arr.push(cc.v3(i,pos.y,0)); if( block.block_Type == 4) i = -10000; } } this.tip_Array.push(arr); } } else{ let posJg = cc.v3(pos.x,pos.y,0); if(data == "reinforce") pos.z = 2; if(data == "soil") pos.z = 3; this.tip_Array.push([posJg]); } // console.log(this.tip_Array); return; } let posJg = cc.v3(pos.x,pos.y,0); if(data == "reinforce") pos.z = 2; if(data == "soil") pos.z = 3; this.tip_Array.push([posJg]); // console.log(this.tip_Array); } //移除提示 removeTip(data){ if(cc.fx.GameConfig.GM_INFO.level > 3) return; //分为撤回一步 和全部清空 if(this.tip_Array.length > 0){ if(data == "back"){ let target = this.tip_Array[this.tip_Array.length-1]; if(target == null){ this.tip_Array.pop(); } else{ this.tip_Array.pop(); for(let i=0; i 0) this.Guide.children[this.step-1].active = false; this.step += 1; let name = this.getGuideName(); var target = this.Guide.getChildByName(name); target.active = true; let size = cc.winSize; if(size.height > 1334){ let height = (size.height - 1334)/2; target.getChildByName("sp").height += height; } } onEnable () { cc.fx.Notifications.on(cc.fx.Message.control, this.clickSun, this); cc.fx.Notifications.on(cc.fx.Message.next, this.runRoad, this); cc.fx.Notifications.on(cc.fx.Message.nextWater, this.runWater, this); cc.fx.Notifications.on(cc.fx.Message.startGame, this.startGame, this); cc.fx.Notifications.on(cc.fx.Message.changePath, this.changePath, this); cc.fx.Notifications.on(cc.fx.Message.setData, this.setData, this); cc.fx.Notifications.on(cc.fx.Message.guideNext, this.guideNext, this); cc.fx.Notifications.on(cc.fx.Message.showResult, this.showResult, this); cc.fx.Notifications.on(cc.fx.Message.removeTip, this.removeTip, this); } onDisable () { cc.fx.Notifications.off(cc.fx.Message.control, this.clickSun); cc.fx.Notifications.off(cc.fx.Message.next, this.runRoad); cc.fx.Notifications.off(cc.fx.Message.nextWater, this.runWater); cc.fx.Notifications.off(cc.fx.Message.startGame, this.startGame); cc.fx.Notifications.off(cc.fx.Message.changePath, this.changePath); cc.fx.Notifications.off(cc.fx.Message.setData, this.setData); cc.fx.Notifications.off(cc.fx.Message.guideNext, this.guideNext); cc.fx.Notifications.off(cc.fx.Message.showResult, this.showResult); cc.fx.Notifications.off(cc.fx.Message.removeTip, this.removeTip); } update (dt) { } }