1425 lines
56 KiB
TypeScript
1425 lines
56 KiB
TypeScript
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) {
|
||
|
||
|
||
}
|
||
}
|