"use strict"; cc._RF.push(module, 'b0432BA295DjIOcuitdGKO1', 'GameManager'); // Script/GameManager.ts "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); var Block_1 = require("./Block"); // 主游戏控制类 var _a = cc._decorator, ccclass = _a.ccclass, property = _a.property; var GameManager = /** @class */ (function (_super) { __extends(GameManager, _super); function GameManager() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.Map = null; _this.Block = null; _this.Time = null; _this.Countdown = null; _this.Guide = null; return _this; } GameManager.prototype.onLoad = function () { }; GameManager.prototype.start = function () { this.fit(); this.init(); }; //初始化数据 GameManager.prototype.init = function () { this.initMap(); this.finishiTime = 0; this.scoreTime = 0; this.startTime = cc.fx.GameTool.getTime(); this.countTime = cc.fx.GameConfig.TIME_INFO.totalTime; this.waterTime = cc.fx.GameConfig.TIME_INFO.waterTime[cc.fx.GameConfig.GM_INFO.level]; this.Time.string = cc.fx.GameTool.getTimeMargin(this.countTime); if (!cc.fx.GameConfig.GM_INFO.guide) { this.Guide.active = false; this.step = 0; var head = this.node.getChildByName("Top").getChildByName("head"); var progress = this.node.getChildByName("Top").getChildByName("progress").getComponent(cc.Sprite); head.runAction(cc.moveTo(this.waterTime, cc.v2(310, head.y))); this.waterTween = cc.tween(progress) .to(this.waterTime, { fillRange: 1 }) .start(); this.schedule(this.updateWaterTime, 1); this.schedule(this.updateCountDownTime, 1); } else { this.Guide.active = true; this.guideNext(); } }; //初始化地图 GameManager.prototype.initMap = function () { cc.fx.GameConfig.GM_INFO.round += 1; cc.fx.GameConfig.GM_INFO.fen = 0; this.block_Array = []; this.path_Array = []; this.water_Array = []; this.map_Array = []; this.tip_Array = []; this.plan_over = false; this.map_Hight = 0; this.map_Width = 0; this.step = 0; this.bgClick = false; this.btnClick = false; if (!cc.fx.GameConfig.GM_INFO.guide && cc.fx.GameConfig.GM_INFO.level == 0) { cc.fx.GameConfig.GM_INFO.level = 1; } this.custom = 10; //9 this.custom = Math.floor(Math.random() * cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level].length); // this.custom = 0; var arr = cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level][this.custom].map; if (cc.fx.GameConfig.GM_INFO.level == 0) { this.Map.scale = 1.2; } this.node.getChildByName("Top").getChildByName("id").getComponent(cc.Label).string = cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level][this.custom].id; //将地图x,y轴切换 this.map_Array = arr[0].map(function (item, i) { return arr.map(function (val) { return 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 (var i = 0; i < this.map_Array.length; i++) { for (var j = 0; j < this.map_Array[i].length; j++) { var block = cc.instantiate(this.Block); block.parent = this.Map; block.getComponent("Block").initData(this.map_Array[i][j], cc.v2(i, j), cc.v2(this.map_Width, this.map_Hight)); if (this.map_Array[i][j] == cc.Enum(Block_1.BlockType).Start) { this.path_Array.push(cc.v3(i, j, cc.Enum(Block_1.BlockType).Nomal)); // this.water_Array.push(cc.v3(i,j,cc.Enum(BlockType).Nomal)); } block.setPosition(cc.v2(-block.width * 2.5 + i * block.width, block.height * 4 - j * block.height)); this.block_Array.push(block); } } }; //开始后,按玩家操作,将路径中地图块放入数组中 GameManager.prototype.setMap = function (data) { for (var i = 0; i < data.length; i++) { var start = this.path_Array[this.path_Array.length - 1]; switch (data[i]) { case "up": this.path_Array.push(cc.v3(start.x, start.y - 1, cc.Enum(Block_1.BlockType).Nomal)); break; case "down": this.path_Array.push(cc.v3(start.x, start.y + 1, cc.Enum(Block_1.BlockType).Nomal)); break; case "left": this.path_Array.push(cc.v3(start.x - 1, start.y, cc.Enum(Block_1.BlockType).Nomal)); break; case "right": this.path_Array.push(cc.v3(start.x + 1, start.y, cc.Enum(Block_1.BlockType).Nomal)); break; case "reinforce": this.path_Array.push(cc.v3(start.x, start.y, cc.Enum(Block_1.BlockType).Reinforce)); break; case "soil": this.path_Array.push(cc.v3(start.x, start.y, cc.Enum(Block_1.BlockType).Xi_Soil)); break; } } this.runRoad(0); }; //开始执行洪峰来了的动画 GameManager.prototype.runRoad = function (order) { var _this = this; order = parseInt(order); if (order > 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) { var i = this.path_Array[order].x * this.map_Array[0].length + this.path_Array[order].y; var direction = ""; var circulate = true; //最后一步结束 if (order == this.path_Array.length - 1) { circulate = false; direction = "End"; setTimeout(function () { if (!_this.plan_over) { console.log("准备出水"); _this.plan_over = true; _this.unschedule(_this.updateWaterTime); 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; _this.runWater(0); } }, 500); } else { if (this.path_Array[order].z == 6 && order + 1 < this.path_Array.length && order != 1) { 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) { direction = "Reinforce"; } 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); var jg = this.getBoundary(order, this.path_Array[order].x, this.path_Array[order].y, direction, this.path_Array); if (direction == "" || jg == false) return; var 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; } } var pos = cc.v2(); // if(order > 0){ 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); } } } // } var 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); } }; //判断边界。或者撞山,或者湿地没有加固 GameManager.prototype.getBoundary = function (order, x, y, direction, road) { var 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"); cc.fx.Notifications.emit(cc.fx.Message.setData, false); // cc.director.loadScene("GameScene"); } else { var i = road[order].x * this.map_Array[0].length + road[order].y; var 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"); cc.fx.Notifications.emit(cc.fx.Message.setData, false); // cc.director.loadScene("GameScene"); } else if (target.block_Type == 2 && direction != "Reinforce") { jg = false; // console.log("修筑未加固湿地,游戏结束"); alert("修筑未加固湿地,游戏结束"); cc.fx.Notifications.emit(cc.fx.Message.showResult, "lose"); cc.fx.Notifications.emit(cc.fx.Message.setData, false); // cc.director.loadScene("GameScene"); } } return jg; }; //开始执行洪峰来了的动画 GameManager.prototype.runWater = function (order) { order = parseInt(order); if (order <= this.water_Array.length - 1) { var i = this.water_Array[order].x * this.map_Array[0].length + this.water_Array[order].y; var direction = ""; var 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) { 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); } } // console.log(order,this.path_Array[order].x,this.path_Array[order].y,i); var jg = this.getBoundary(order, this.water_Array[order].x, this.water_Array[order].y, direction, this.water_Array); // console.log("步骤:",order,"方向",direction); if (direction == "" || jg == false) { return; } var 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; } } var 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); } } } var 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); } }; //获取息壤的格子的方向 GameManager.prototype.getXi_Soil = function (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; }; //设置息壤 GameManager.prototype.set_Soil = function (order, road, name) { var direction = this.getXi_Soil(order, road); var length = 0; if (direction == "right") { length = this.map_Width - 1; for (var i = road[order].x; i <= length; i++) { var n = i * this.map_Array[0].length + road[order].y; var 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.scheduleOnce; } else if (direction == "left") { length = 0; for (var i = road[order].x; i >= length; i--) { var n = i * this.map_Array[0].length + road[order].y; var 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 (var i = road[order].y; i >= length; i--) { var n = road[order].x * this.map_Array[0].length + i; var 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 (var i = road[order].y; i <= length; i++) { var n = road[order].x * this.map_Array[0].length + i; var 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); }; //查找息壤蛮遗憾路径 GameManager.prototype.soil_Find = function (direction, order, length, road, name) { var start = road[order].x; if (direction == "right") { for (var i = start; i <= length; i++) { var n = i * this.map_Array[0].length + road[order].y; var target = this.block_Array[n].getComponent("Block"); if (i == start) { target.set_Xi_SoilType(this.getDirection(order, road), null, name); var 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 { var jg = null; if (i == length) { var number = i - start - 1; this.changePath(order, number, false, road); jg = order; } target.set_Xi_SoilType(direction, jg, name); } } } else if (direction == "left") { for (var i = start; i >= length; i--) { var n = i * this.map_Array[0].length + road[order].y; var target = this.block_Array[n].getComponent("Block"); if (i == start) { target.set_Xi_SoilType(this.getDirection(order, road), null, name); var 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 { var jg = null; if (i == length) { var 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 (var i = start; i >= length; i--) { var n = road[order].x * this.map_Array[0].length + i; var target = this.block_Array[n].getComponent("Block"); if (i == start) { target.set_Xi_SoilType(this.getDirection(order, road), null, name); var 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 { var jg = null; if (i == length) { var 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 (var i = start; i <= length; i++) { var n = road[order].x * this.map_Array[0].length + i; var target = this.block_Array[n].getComponent("Block"); if (i == start) { target.set_Xi_SoilType(this.getDirection(order, road), null, name); var 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 { var jg = null; if (i == length) { var number = i - start - 1; this.changePath(order, number, true, road); jg = order; } target.set_Xi_SoilType(direction, jg, name); } } } }; //改变水流地图 GameManager.prototype.changeWater = function (value) { var 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); }; //息壤过后改变修筑路径 GameManager.prototype.changePath = function (order, number, direction, road) { for (var i = (order + 1); i < road.length; i++) { if (!direction) { road[i].x += (number); } else { road[i].y += (number); } } if (direction) { if (number < 0) { for (var 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("1特殊放入:",this.path_Array[order+1].x,this.path_Array[order+1].y+n) } } else { for (var 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 (var 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 (var 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) } } } }; GameManager.prototype.changeMap = function (data) { }; //获取洪峰方向 GameManager.prototype.getDirection = function (order, road) { var name = ""; //入海口比较复杂单独判断 if (order == 0) { var nextX = road[order + 1].x - road[order].x; var 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; } //用于判断此点的上一个点,是为了判断当前方块洪水七点,以及下一个移动方向,判断洪终点方向 var nextX = road[order + next].x - road[order].x; var nextY = road[order].y - road[order + next].y; var previousX = road[order].x - road[order - 1].x; var 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; }; //根据是否全面屏,做独立适配方面 GameManager.prototype.fit = function () { var jg = this.setFit(); if (!jg) { this.Map.scale = 1.2; } else { this.Map.scale = 1; } }; //判断全面屏 GameManager.prototype.getSetScreenResolutionFlag = function () { var size = cc.winSize; var width = size.width; var height = size.height; if ((height / width) > (16.2 / 9)) return false; return true; }; //判断全面屏适配 GameManager.prototype.setFit = function () { var flag = this.getSetScreenResolutionFlag(); if (flag) { } else { } return flag; }; //返回首页 GameManager.prototype.backScene = function () { cc.director.loadScene("LoadScene"); }; //开始游戏 GameManager.prototype.startGame = function (data) { for (var i = 0; i < this.block_Array.length; i++) { this.block_Array[i].getChildByName("tipWin").active = false; this.block_Array[i].getChildByName("tipLose").active = false; } this.unschedule(this.updateCountDownTime); var now = cc.fx.GameTool.getTime(); var finishi = now - this.finishiTime; var totalTime = now - this.startTime; this.scoreTime = this.waterTime; if (this.waterTime <= 0.5) finishi = -1; cc.fx.GameConfig.CLICK_SET("submitTime", finishi); if (finishi == -1) cc.fx.GameConfig.CLICK_SET("duration", cc.fx.GameConfig.TIME_INFO.waterTime[cc.fx.GameConfig.GM_INFO.level]); else cc.fx.GameConfig.CLICK_SET("duration", totalTime); cc.fx.GameConfig.CLICK_SET("usedSteps", data.length); this.setMap(data); var arr = this.changeStep(data); cc.fx.GameConfig.CLICK_SET("stepList", arr); }; //用于埋点记录 GameManager.prototype.changeStep = function (data) { var arr = []; if (data.length > 0) { for (var i = 0; i < data.length; i++) { if (data[i] == "up") arr[i] = "U"; else if (data[i] == "down") arr[i] = "D"; else if (data[i] == "left") arr[i] = "L"; else if (data[i] == "right") arr[i] = "R"; else if (data[i] == "soil") arr[i] = "X"; else if (data[i] == "reinforce") arr[i] = "F"; } } return arr; }; //洪峰倒计时,计时器 GameManager.prototype.updateWaterTime = function () { var _this = this; if (this.waterTime > 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.plan_over = true; setTimeout(function () { if (_this.water_Array.length == 0) { cc.fx.Notifications.emit(cc.fx.Message.showResult, "lose"); cc.fx.Notifications.emit(cc.fx.Message.setData, false); } else { _this.runWater(0); } }, 500); } } } }; //如果是倒计时 调用此方法 GameManager.prototype.updateCountDownTime = function () { 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) { var 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(null); this.unschedule(this.updateCountDownTime); this.gameOver(); } } }; //上传每次操作数据 GameManager.prototype.setData = function (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); if (success != null) { cc.fx.GameConfig.CLICK_SET("success", success); cc.fx.GameConfig.GM_INFO.fen = this.getScore(); cc.fx.GameConfig.CLICK_SET("getScore", cc.fx.GameConfig.GM_INFO.fen); cc.fx.GameConfig.GM_INFO.score += cc.fx.GameConfig.GM_INFO.fen; cc.fx.GameConfig.CLICK_SET("cumulativeScore", cc.fx.GameConfig.GM_INFO.score); cc.fx.GameConfig.GM_INFO.successList.push(success); } cc.fx.GameTool.setGameData(); }; //计算得分 GameManager.prototype.getScore = function () { //最小步数 var min = cc.fx.GameConfig.LEVEL_INFO[cc.fx.GameConfig.GM_INFO.level][this.custom].min_steps; //实际使用步数 var now = this.path_Array.length - 1; if (now <= 0) now = 0; var x = (2.5 * min - now) / min; var score = Math.pow(Math.pow(min, x), 0.5); score = score * (this.scoreTime + 10) * 100; return Math.floor(score); }; //上传排行榜数据 GameManager.prototype.gameOver = function () { var rate = 0; var successList = cc.fx.GameConfig.GM_INFO.successList; if (successList.length > 0) { var success = 0; for (var i = 0; i < successList.length; i++) { if (successList[i] == true) success += 1; } rate = success / successList.length; } rate = Math.floor(rate * 1000) / 10; var data = { score: cc.fx.GameConfig.GM_INFO.score, rate: rate }; cc.fx.GameTool.setRank(data); this.node.getChildByName("GameOver").active = true; this.node.getChildByName("GameOver").opacity = 0; cc.tween(this.node.getChildByName("GameOver")) .to(0.4, { opacity: 255 }) .delay(1) .to(0.4, { opacity: 50 }) .call(function () { cc.director.loadScene("OverScene"); }) .start(); }; //展示结果 GameManager.prototype.showResult = function (data) { this.node.getChildByName("Window").active = true; this.node.getChildByName("Window").getComponent("Window").init(data); }; //记录反应时长,以及做步骤提示 GameManager.prototype.clickSun = function (data) { if (cc.fx.GameConfig.GM_INFO.level > 3) return; //如果没有记录过 回合开始到操作反应时长,则第一次记录, 后面不记录 if (cc.fx.GameConfig.CLICK_DATA.startTime == 0) { var now = cc.fx.GameTool.getTime(); this.finishiTime = now - this.startTime; cc.fx.GameConfig.CLICK_SET("startTime", this.finishiTime); } //步骤提示 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]; var n = nowPos.x * this.map_Array[0].length + nowPos.y; var targetNode = this.block_Array[n]; if (targetNode.getChildByName("tipLose").active == true) { this.tip_Array.push(null); return; } } if (data == "up") { var n = cc.v2(nowPos.x, nowPos.y - 1); this.tipCan(n, data); } else if (data == "down") { var n = cc.v2(nowPos.x, nowPos.y + 1); this.tipCan(n, data); } else if (data == "left") { var n = cc.v2(nowPos.x - 1, nowPos.y); this.tipCan(n, data); } else if (data == "right") { var n = cc.v2(nowPos.x + 1, nowPos.y); this.tipCan(n, data); } else if (data == "reinforce") { var n = cc.v3(nowPos.x, nowPos.y, 2); this.tip_Array.push([n]); } else if (data == "soil") { var n = cc.v3(nowPos.x, nowPos.y, 3); this.tip_Array.push([n]); } }; //提示是否错误 GameManager.prototype.tipCan = function (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; } var n = pos.x * this.map_Array[0].length + pos.y; var target = this.block_Array[n].getComponent("Block"); target.node.getChildByName("tipWin").active = true; // target.node.getChildByName("tipWin").opacity = 255; // target.node.getChildByName("tipLose").opacity = 255; // debugger; //重复路回头路,或者山峰 if (target.repeatRoad(false) == true || target.block_Type == 3) { target.node.getChildByName("tipLose").active = true; target.node.getChildByName("tipWin").active = false; } //湿地 上一步如果没用息壤或者加固 else if (target.block_Type == 2) { if (this.tip_Array.length > 1) { if (this.tip_Array[this.tip_Array.length - 1][0].z == 0) { 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 (var i = pos.y; i >= 0; i--) { var 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 (var i = pos.y; i < this.map_Array[0].length; i++) { var 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 == "right") { var arr = []; for (var i = pos.x; i < this.map_Array.length; i++) { var 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 if (data == "left") { var arr = []; for (var i = pos.x; i >= 0; i--) { var 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 { var posJg_1 = cc.v3(pos.x, pos.y, 0); if (data == "reinforce") pos.z = 2; if (data == "soil") pos.z = 3; this.tip_Array.push([posJg_1]); } console.log(this.tip_Array); return; } var 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); }; //移除提示 GameManager.prototype.removeTip = function (data) { if (cc.fx.GameConfig.GM_INFO.level > 3) return; //分为撤回一步 和全部清空 if (this.tip_Array.length > 0) { if (data == "back") { var target = this.tip_Array[this.tip_Array.length - 1]; if (target == null) { this.tip_Array.pop(); } else { this.tip_Array.pop(); for (var i = 0; i < target.length; i++) { if (target[i]) { if (target[0].z == 0) { var n = target[i].x * this.map_Array[0].length + target[i].y; var node = this.block_Array[n]; node.getChildByName("tipWin").active = false; node.getChildByName("tipLose").active = false; } } } } } else if (data == "remove") { for (var j = 0; j < this.tip_Array.length; j++) { var target = this.tip_Array[j]; if (target != null) { for (var i = 0; i < target.length; i++) { if (target[i]) { var n = target[i].x * this.map_Array[0].length + target[i].y; var node = this.block_Array[n]; node.getChildByName("tipWin").active = false; node.getChildByName("tipLose").active = false; } } } } this.tip_Array = []; } } }; //获取引导名字 GameManager.prototype.getGuideName = function () { var name = "one"; switch (this.step) { case 1: name = "one"; this.btnClick = false; this.bgClick = true; break; case 2: name = "two"; this.btnClick = false; this.bgClick = true; break; case 3: name = "three"; this.btnClick = false; this.bgClick = true; break; case 4: name = "four"; this.btnClick = false; this.bgClick = true; break; case 5: name = "five"; this.btnClick = true; this.bgClick = false; break; case 6: name = "six"; this.btnClick = true; this.bgClick = false; break; case 7: name = "seven"; this.btnClick = false; this.bgClick = true; break; case 8: name = "eight"; this.btnClick = false; this.bgClick = true; break; case 9: name = "nine"; this.btnClick = false; this.bgClick = true; break; case 10: name = "ten"; this.btnClick = true; this.bgClick = false; break; case 11: name = "eleven"; this.btnClick = false; this.bgClick = true; break; case 12: name = "twelve"; this.btnClick = true; this.bgClick = false; break; case 13: name = "thirteen"; this.btnClick = true; this.bgClick = false; break; case 14: name = "fourteen"; this.btnClick = true; this.bgClick = false; break; case 15: name = "fiveteen"; this.btnClick = true; this.bgClick = false; break; case 16: name = "sixteen"; this.btnClick = true; this.bgClick = false; break; case 17: name = "last"; this.btnClick = true; this.bgClick = false; break; } return name; }; //引导下一步 GameManager.prototype.guideNext = function () { //每次先把所有的 console.log(this.step, this.Guide.children.length); if (this.step + 1 == this.Guide.children.length) { cc.fx.GameConfig.GM_INFO.guide = false; // cc.director.loadScene("GameScene"); } if (this.step > 0) this.Guide.children[this.step - 1].active = false; this.step += 1; var name = this.getGuideName(); var target = this.Guide.getChildByName(name); target.active = true; var size = cc.winSize; if (size.height > 1334) { var height = (size.height - 1334) / 2; target.getChildByName("sp").height += height; } }; GameManager.prototype.addEnd = function (data) { }; GameManager.prototype.onEnable = function () { 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.changeMap, this.changeMap, this); cc.fx.Notifications.on(cc.fx.Message.addEnd, this.addEnd, 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); }; GameManager.prototype.onDisable = function () { 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.changeMap, this.changeMap); cc.fx.Notifications.off(cc.fx.Message.addEnd, this.addEnd); 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); }; GameManager.prototype.update = function (dt) { }; __decorate([ property(cc.Node) ], GameManager.prototype, "Map", void 0); __decorate([ property(cc.Prefab) ], GameManager.prototype, "Block", void 0); __decorate([ property(cc.Label) ], GameManager.prototype, "Time", void 0); __decorate([ property(cc.Label) ], GameManager.prototype, "Countdown", void 0); __decorate([ property(cc.Node) ], GameManager.prototype, "Guide", void 0); GameManager = __decorate([ ccclass ], GameManager); return GameManager; }(cc.Component)); exports.default = GameManager; cc._RF.pop();