import SKUIUtil from "../ts/gear_2.3.4/util/SKUIUtil"; import GameModel from "../ts/core/GameModel"; import MsgAlert from "../ts/game/msg/MsgAlert"; import AudioUtil from "../ts/core/AudioUtil"; cc.Class({ extends: cc.Component, properties: { mainLayer: cc.Node, aboveLayer: cc.Node, aboveMapNode: cc.Node, aboveCloseNode: cc.Node, mapBtnNode: [cc.Node], moveNode: cc.Node, endNode: cc.Node, roleNode: cc.Node, }, onLoad() { this.aboveMapNode.on(cc.Node.EventType.TOUCH_START, this.touchBegan.bind(this)); this.aboveMapNode.on(cc.Node.EventType.TOUCH_MOVE, this.touchMoved.bind(this)); this.aboveMapNode.on(cc.Node.EventType.TOUCH_END, this.touchEnded.bind(this)); this.aboveMapNode.on(cc.Node.EventType.TOUCH_CANCEL, this.touchCanceled.bind(this)); // this.aboveMapNode.on(cc.Node.EventType.TOUCH_START, this.aboveTouchBegan.bind(this)); this.moveNodes = []; this.gameLogic = this.node.parent.getComponent('GameLogic'); this.roleNode.zIndex = 2; }, init() { this.mainLayer.active = true; this.aboveLayer.active = false; }, start() { cc.log('mainmap start'); }, onDisable() { if (this.mapId) { // cc.loader.releaseRes(`Map/map/${this.mapId}`); cc.loader.releaseRes(`Map/map/${this.mapId}`, cc.Texture2D); cc.loader.releaseRes(`Map/map/${this.mapId}`, cc.SpriteFrame); } }, onMapBtnClicked(e, d) { this.showAboveNode(d); }, showAboveNode(mapid) { this.aboveMapNode.destroyAllChildren(); this.mapId = mapid; let pPos = this.getPlayerPos(); this.roleNode.setPosition(pPos); this.roleNode.active = false; this.unschedule(this.checkPlayerMove); for (let j = 0; j < this.moveNodes.length; j++) { this.moveNodes[j].active = false; } this.endNode.active = false; if (this.mapId == GameModel.player.mapid) { this.roleNode.active = true; this.unschedule(this.checkPlayerMove); for (let j = 0; j < this.moveNodes.length; j++) { this.moveNodes[j].active = true; } if (this.moveNodes.length > 0) { this.endNode.active = true; } this.schedule(this.checkPlayerMove, 0.02, cc.macro.REPEAT_FOREVER); } let self = this; let mapres = GameModel.conf_map[this.mapId].mapid; cc.loader.loadRes(`Map/map/${mapres}`, cc.SpriteFrame, function (err, frame) { if (!err) { frame.ensureLoadTexture(); self.aboveMapNode.getComponent(cc.Sprite).spriteFrame = frame; self.aboveLayer.active = true; self.scheduleOnce(() => { self.aboveCloseNode.x = self.aboveMapNode.width / 2; // self.aboveLayer.getChildByName('mapbg').width = self.aboveMapNode.width + 110;,, // self.aboveLayer.getChildByName('titleline').width = self.aboveMapNode.width + 120; self.aboveLayer.getChildByName('mapbg').width = frame.getTexture().width + 110; self.aboveLayer.getChildByName('titleline').width = frame.getTexture().width + 120; self.aboveLayer.getChildByName('pos').getComponent(cc.Label).string = GameModel.conf_map[mapid].map_name; self.addMapNode(); }, 0); } else { self.node.active = false; } }); }, addMapNode() { for (const key in GameModel.conf_npc) { if (key == 'datatype') { continue; } let npc = GameModel.conf_npc[key]; let vecTmp = npc.auto_create.split(';'); if (vecTmp.length < 3 || vecTmp[0] != this.mapId) { continue; } let npcNode = cc.instantiate(this.aboveLayer.getChildByName('npc')); npcNode.active = true; npcNode.parent = this.aboveMapNode; npcNode.getComponent(cc.Label).string = npc.name; npcNode.setPosition(this.getMapPosByGrid({ l: vecTmp[1], r: vecTmp[2] })); } for (const key in GameModel.conf_transfer) { if (key == 'datatype') { continue; } let trans = GameModel.conf_transfer[key]; if (trans.mapid != this.mapId) { continue; } let transferNode = cc.instantiate(this.aboveLayer.getChildByName('transfer')); transferNode.active = true; transferNode.parent = this.aboveMapNode; transferNode.getComponent(cc.Label).string = '至' + GameModel.conf_map[trans.tomap].map_name; transferNode.setPosition(this.getMapPosByGrid({ l: trans.mapx, r: trans.mapy })); } }, onCloseBtnClicked(e, d) { AudioUtil.playCloseAudio(); this.node.active = false; }, onSearchBtnClicked(e, d) { }, onBackBtnClicked(e, d) { this.mainLayer.active = false; if (GameModel.conf_map[GameModel.player.mapid].bmap == 0) { this.node.active = false; return; } this.showAboveNode(GameModel.player.mapid); }, onHomeBtnClicked(e, d) { if (GameModel.player.mapid == 1201) { MsgAlert.addMsg("本場景禁止傳送,請與天牢守衛對話離開。"); return; } else if (GameModel.player.mapid == 4004) { MsgAlert.addMsg(`本場景禁止傳送,請與逐鹿對話離開。`); return; } else if (GameModel.player.mapid == 3001) { MsgAlert.addMsg(`本場景禁止傳送,請與幫戰傳送人對話離開。`); return; } else if (GameModel.player.mapid == 1213) { MsgAlert.addMsg(`本場景禁止傳送,請與魏徵對話離開。`); return; } this.gameLogic.mapLogic.changeMap(4001); this.node.active = false; }, onAboveCloseBtnClicked(e, d) { AudioUtil.playCloseAudio(); this.aboveLayer.active = false; if (this.mainLayer.active == false) { this.node.active = false; } }, getPlayerPos() { let pPos = this.gameLogic.mapLogic.roleNode.getPosition(); return this.getMapPos(pPos); }, checkPlayerMove() { if (this.moveNodes.length == 0 && this.endNode.active == false) { this.unschedule(this.checkPlayerMove); this.gameLogic.autoNode.active = false; } let realpos = this.gameLogic.mapLogic.myRole.netInfo; this.aboveLayer.getChildByName('pos').getComponent(cc.Label).string = GameModel.conf_map[this.mapId].map_name + `(${realpos.x},${realpos.y})`; let pPos = this.getPlayerPos(); this.roleNode.setPosition(pPos); let curIndex = -1; for (let i = 0; i < this.moveNodes.length; i++) { const n = this.moveNodes[i]; if (SKUIUtil.distanceByVec2(pPos, n.getPosition()) < 20) { curIndex = i; } } if (SKUIUtil.distanceByVec2(pPos, this.endNode.getPosition()) < 20) { this.endNode.active = false; curIndex = this.moveNodes.length - 1; } if (curIndex != -1) { for (let j = 0; j <= curIndex; j++) { this.moveNodes[j].destroy(); } this.moveNodes.splice(0, curIndex + 1); } }, removePathNodes() { this.unschedule(this.checkPlayerMove); for (let j = 0; j < this.moveNodes.length; j++) { this.moveNodes[j].destroy(); } this.moveNodes = []; this.endNode.active = false; }, showMovePoints(result) { for (const n of this.moveNodes) { n.destroy(); } this.moveNodes = []; // cc.v2g() this.endNode.active = true; let showPoints = []; let MAP_RES_WIDTH = GameModel.conf_map[this.mapId].width; let dotdistance = MAP_RES_WIDTH / this.aboveMapNode.width * 1.5; let prepoint = result[0]; for (let index = 0; index < result.length - 5; index++) { if (SKUIUtil.distanceByVec2(cc.v2(prepoint.l, prepoint.r), cc.v2(result[index].l, result[index].r)) > dotdistance) { prepoint = result[index]; showPoints.push(result[index]); } } // for (let index = dotdistance; index < result.length - dotdistance; index += dotdistance) { // showPoints.push(result[index]); // } for (let index = 0; index < showPoints.length; index++) { let move = cc.instantiate(this.moveNode); move.active = true; move.setPosition(this.getMapPosByGrid(showPoints[index])); move.parent = this.aboveLayer; this.moveNodes.push(move); } this.endNode.setPosition(this.getMapPosByGrid(result[result.length - 1])); this.roleNode.active = true; this.schedule(this.checkPlayerMove, 0, cc.macro.REPEAT_FOREVER); }, getMapPosByGrid(info) { let mapres = GameModel.conf_map[this.mapId].mapid; let mapData = GameModel.conf_map_list[mapres]; let gridwidth = mapData.baseInfo.grid_width; let gridheight = mapData.baseInfo.grid_height; let realPos = cc.v2(gridwidth * (0.5 + Number(info.l)), gridheight * (0.5 + Number(info.r))); return this.getMapPos(realPos); }, getMapPos(realPos) { let MAP_RES_WIDTH = GameModel.conf_map[this.mapId].width; let MAP_RES_HEIGHT = GameModel.conf_map[this.mapId].height; let mapPosX = realPos.x * (this.aboveMapNode.width / MAP_RES_WIDTH) - this.aboveMapNode.width / 2; let mapPosY = realPos.y * (this.aboveMapNode.height / MAP_RES_HEIGHT) - this.aboveMapNode.height / 2; return cc.v2(mapPosX, mapPosY); }, mapNodeClicked(e, d) { this.touchPos(SKUIUtil.add(e.target.getPosition(), cc.v2(this.aboveMapNode.width / 2, this.aboveMapNode.height / 2))); this.gameLogic.autoNode.active = true; }, touchPos(mapPos) { if (GameModel.player.teamid > 0 && (!GameModel.player.isleader && !GameModel.player.tempLeave)) { return; } if (this.mapId != GameModel.player.mapid) { if (GameModel.player.mapid == 1201) { if (GameModel.player.shane > 0) { MsgAlert.addMsg("天牢不是你想來就來想走就能走的。"); } else { MsgAlert.addMsg("本場景禁止傳送,請與天牢守衛對話離開。"); } return; } else if (GameModel.player.mapid == 4004) { MsgAlert.addMsg(`本場景禁止傳送,請與逐鹿對話離開。`); return; } else if (GameModel.player.mapid == 3001) { MsgAlert.addMsg(`本場景禁止傳送,請與幫戰傳送人對話離開。`); return; } else if (GameModel.player.mapid == 1213) { MsgAlert.addMsg(`本場景禁止傳送,請與魏徵對話離開。`); return; } this.gameLogic.mapLogic.changeMap(this.mapId); } let realPosX = mapPos.x / this.aboveMapNode.width * this.gameLogic.mapLogic.MAP_RES_WIDTH; let realPosY = mapPos.y / this.aboveMapNode.height * this.gameLogic.mapLogic.MAP_RES_HEIGHT; let result = this.gameLogic.mapLogic.touchPos(cc.v2(realPosX, realPosY)); if (result.length > 0) { this.showMovePoints(result); this.mainLayer.active = false; } }, touchBegan(event) { if (this.node.active == false) { return; } if (this.aboveLayer.active == true) { let touchLoc = event.getLocation(); if (!this.aboveLayer.active || !this.aboveMapNode.getBoundingBoxToWorld().contains(touchLoc)) { return; } let mapPos = this.aboveMapNode.convertToNodeSpace(touchLoc); this.touchPos(mapPos); return; } // for (const btn of this.mapBtnNode) { // btn.getComponent('CustomButton').touchBegan(event); // } }, touchMoved(event) { if (this.node.active == false || this.aboveLayer.active == true) { return; } // for (const btn of this.mapBtnNode) { // btn.getComponent('CustomButton').touchMoved(event); // } }, touchEnded(event) { if (this.node.active == false || this.aboveLayer.active == true) { return; } // for (const btn of this.mapBtnNode) { // btn.getComponent('CustomButton').touchEnded(event); // } }, touchCanceled(evene) { if (this.node.active == false || this.aboveLayer.active == true) { return; } // for (const btn of this.mapBtnNode) { // btn.getComponent('CustomButton').touchCanceled(event); // } } });