WaterControl/assets/Script/GameManager.ts
2024-08-16 14:17:58 +08:00

1425 lines
56 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<arr.length; i++){
if(arr[i].min_steps == min_steps){
map.push(i);
}
}
if(map.length == 0){
if(type) map = this.getMapArray(arr,min_steps - 1,type);
else map = this.getMapArray(arr,min_steps + 1,type);
}
return map;
}
//初始化数据
init(){
let name = cc.fx.GameConfig.GM_INFO.gameId + "_guide";
var data = JSON.parse(localStorage.getItem(name));
if(data != false){
cc.fx.GameConfig.GM_INFO.guide = true;
cc.fx.StorageMessage.setStorage(name,cc.fx.GameConfig.GM_INFO.guide);
}
else{
cc.fx.GameConfig.GM_INFO.guide = cc.fx.StorageMessage.getStorage(name);
}
this.initMap();
this.finishiTime = 0;
this.scoreTime = 0;
this.replaceTime = 0;
this.startTime = cc.fx.GameTool.getTime();
this.countTime = cc.fx.GameConfig.TIME_INFO.totalTime;
if(this.countTime == 0 ){
this.gameOver();
}
this.waterTime = cc.fx.GameConfig.TIME_INFO.waterTime[cc.fx.GameConfig.GM_INFO.level];
// if(this.countTime < this.waterTime) this.replaceTime = this.countTime;
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();
}
}
//初始化地图
initMap(){
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;
this.custom = 0; //9
if(!cc.fx.GameConfig.GM_INFO.guide &&cc.fx.GameConfig.GM_INFO.level == 0 ){
cc.fx.GameConfig.GM_INFO.level = 1;
this.custom = this.getMap();
}
else if(!cc.fx.GameConfig.GM_INFO.guide){
this.custom = this.getMap();
}
// this.custom = 7;
// console.log(this.custom);
let 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.GM_INFO.score;
//将地图x,y轴切换
this.map_Array = arr[0].map((item, 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<this.map_Array.length;i++){
for(let j=0; j<this.map_Array [i].length;j++){
let 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(BlockType).Start){
this.path_Array.push(cc.v3(i,j,cc.Enum(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);
}
}
}
/**
* 开始后按玩家操作将路径中地图块放入数组中
* @param data 根据当前操作添加建筑地图数组
*/
setMap(data){
for(let i=0; i<data.length; i++){
let 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(BlockType).Nomal));
break;
case "down":
this.path_Array.push(cc.v3(start.x,start.y+1,cc.Enum(BlockType).Nomal));
break;
case "left":
this.path_Array.push(cc.v3(start.x-1,start.y,cc.Enum(BlockType).Nomal));
break;
case "right":
this.path_Array.push(cc.v3(start.x+1,start.y,cc.Enum(BlockType).Nomal));
break;
case "reinforce":
this.path_Array.push(cc.v3(start.x,start.y,cc.Enum(BlockType).Reinforce));
break;
case "soil":
this.path_Array.push(cc.v3(start.x,start.y,cc.Enum(BlockType).Xi_Soil));
break;
}
}
if(this.path_Array[this.path_Array.length-1].z != 0){
this.path_Array.pop();
}
this.runRoad(0);
}
/**
* 开始执行洪峰来了的动画
* @param order 建筑地图数组里的执行的序列号依次往下加
*/
runRoad(order){
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){
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); i<road.length; i++){
if(!direction){
road[i].x += (number);
}
else{
road[i].y += (number);
}
}
if(direction){
if(number < 0){
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("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<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;
// console.log("submitTime:",finishi,this.finishiTime);
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);
}
/**
* 用于埋点记录 转变方向名称为埋点所需要格式
* @param data 记录操作的数组
*/
changeStep(data){
var arr = [];
if(data.length > 0){
for(let 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;
}
//洪峰倒计时计时器
updateWaterTime(){
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.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<successList.length; i++){
if(successList[i] == true) success += 1;
}
rate = success/successList.length;
}
rate = Math.floor(rate * 1000)/10;
let 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(() =>{
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<this.map_Array[0].length;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 == "right"){
var arr = [];
for(let i=pos.x; i<this.map_Array.length;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 if(data == "left"){
var arr = [];
for(let i=pos.x; 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<target.length;i++){
if(target[i]){
if( target[0].z == 0){
let n = target[i].x*this.map_Array[0].length+target[i].y;
let node = this.block_Array[n];
node.getChildByName("tipWin").active = false;
node.getChildByName("tipLose").active = false;
}
}
}
}
}
else if(data == "remove"){
for(let j =0; j<this.tip_Array.length; j++){
let target = this.tip_Array[j];
if(target != null){
for(let i=0; i<target.length;i++){
if(target[i]){
let n = target[i].x*this.map_Array[0].length+target[i].y;
let node = this.block_Array[n];
node.getChildByName("tipWin").active = false;
node.getChildByName("tipLose").active = false;
}
}
}
}
this.tip_Array = [];
}
}
}
//获取引导名字
getGuideName(){
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;
}
//引导下一步
guideNext(){
//每次先把所有的
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");
let name = cc.fx.GameConfig.GM_INFO.gameId + "_guide";
cc.fx.StorageMessage.setStorage(name,cc.fx.GameConfig.GM_INFO.guide);
}
if(this.step > 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) {
}
}