import LayerPanel, { UrlInfo } from "../../Common/manage/Layer/LayerPanel"; import Tools from "../../Common/Tools"; import EndView from "./EndView"; import Text from "./logic/common/text"; import gameConfig from "./logic/common/config"; import HomeView from "./HomeView"; import CacheMgr from "../../Common/manage/CacheMgr"; import AudioMgr from "../../Common/manage/AudioMgr"; import LoadMgr from "../../Common/manage/LoadMgr"; import Constant from "../../Common/Constant"; import PanelMgr, { Layer } from "../../Common/manage/PanelMgr"; import tween = cc.tween; import ShowConfig from "../../Common/ShowConfig"; import Global from "../../Common/Global"; import QgBanner from "../../Common/manage/Api/QgBanner"; import Emit from "../../Common/manage/Emit/Emit"; import EmitData from "../../Common/manage/Emit/EmitData"; import AESUtil from "../../AESUtil" import ATSDK from "../../AnyThinkAds/ATJSSDK"; import ATRewardedVideoSDK from "../../AnyThinkAds/ATRewardedVideoJSSDK"; import AAJS2 from "../../ATAndroidJS2"; import GlobalManager from '../../GlobalManager'; const { ccclass, property } = cc._decorator; @ccclass export default class GameView extends LayerPanel { public static getUrl(): UrlInfo { return { bundle: "gameView", name: "gameView" } } private _paramData: any = {}; private _button: cc.Node = null; //test private testMakeBottomBlock: cc.Node = null private testReadyMakeBottomBlock: cc.Node = null //logic @property(cc.SpriteFrame) public graySpriteFrame: cc.SpriteFrame = null @property(cc.SpriteFrame) public whiteSpriteFrame: cc.SpriteFrame = null @property(cc.SpriteFrame) public hintBlockSpriteFrame: cc.SpriteFrame = null @property(cc.Prefab) public text_prefab: cc.Prefab = null @property(cc.Prefab) public hammer_prefab: cc.Prefab = null @property(cc.Prefab) public sprite_prefab: cc.Prefab = null @property([cc.SpriteFrame]) public sprite_spriteFrame: cc.SpriteFrame[] = [] @property(cc.SpriteFrame) public hint_1_spriteFrame: cc.SpriteFrame = null @property(cc.SpriteFrame) public hint_2_spriteFrame: cc.SpriteFrame = null @property(cc.Prefab) public start_prefab: cc.Prefab = null @property(cc.Prefab) public hardUp_prefab: cc.Prefab = null @property(cc.Prefab) public nice_prefab: cc.Prefab = null @property(cc.Prefab) public get_prefab: cc.Prefab = null private _startPoint: cc.Node = null private _content: cc.Node = null private _hintUI: cc.Node = null private _whiteHint: cc.Node = null private _textHint: cc.Node = null private _hardLevelLabel: cc.Label = null private _scoreLabel: cc.Label = null private _mouth: cc.Node = null private _mask: cc.Node = null private _hammer: cc.Node = null private _sprite: cc.Node = null private _menu: cc.Node = null private _menuPanel: cc.Node = null private _hint_hammer: cc.Node = null private _hint_sprite: cc.Node = null private _hint_mask: cc.Node = null private _hint_label: cc.Node = null private _hint_hand: cc.Node = null private _price_sprite: cc.Node = null private _sprite_icon: cc.Node = null private _hammer_sprite: cc.Node = null private _hammer_icon: cc.Node = null private _content_cover: cc.Node = null private _lineDatas: lineData[] = [null] private _hintData: lineData = null private blockPool: cc.NodePool = null private nextBlockInfo: nextBlockInfo[] = [] private touchEndFlag: boolean = false private hardLevel: number = 1 private score: number = 0 private continueXiao: number = 0 // 当前连消 private allContinueXiao: number = 0//当前难度总消除 private moveX = -1 private sprite_color: number = 0 //精灵颜色 private hintFlag = true public initUI() { //todo 逻辑 this.testMakeBottomBlock = this.getNode("testUI/makeBottomBlock") this.testReadyMakeBottomBlock = this.getNode("testUI/readymakeBottomBlock") this.onTouch(this.testMakeBottomBlock, () => { this.makeBottomBlock() }) this.onTouch(this.testReadyMakeBottomBlock, () => { this.readyMakeBottomBlock() }) this._startPoint = this.getNode("startPoint") this._content = this.getNode("content") this._content_cover = this.getNode("content_cover") this._hintUI = this.getNode("hintUI") this._whiteHint = this.getNode("white_hint") this._textHint = this.getNode("textHint") this._mouth = this.getNode("content_cover/top/mouth") this._mask = this.getNode("mask") this._hammer_sprite = this.getNode("bottomUI/hammer/price") this._hammer_icon = this.getNode("bottomUI/hammer/vedioIcon") this._hammer_icon.active = false this._price_sprite = this.getNode("bottomUI/sprite/price") this._sprite_icon = this.getNode("bottomUI/sprite/vedioIcon") this._sprite_icon.active = false this._hint_mask = this.getNode("hint_mask") this._hint_mask.active = false this._hint_label = this.getNode("hint_label") this._hint_label.active = false this._hint_hand = this.getNode("hint_hand") this._hint_hand.active = false this._menu = this.getNode("bottomUI/menu") this.onTouch(this._menu, this.handle_menu) this._menuPanel = this.getNode("bottomUI/menuPanel") this._menuPanel.active = false this.onTouch(this._menuPanel.children[0], this.handle_restart) this.onTouch(this._menuPanel.children[1], this.handle_return) this._hammer = this.getNode("bottomUI/hammer") // this._hammer.on(cc.Node.EventType.TOUCH_END, this.handle_hammer, this) this.onTouch(this._hammer, this.handle_hammer) this._sprite = this.getNode("bottomUI/sprite") this.onTouch(this._sprite, this.handle_sprite) this._hint_hammer = this.getNode("hint_hammer") this._hint_hammer.active = false this._hint_sprite = this.getNode("hint_sprite") this._hint_sprite.active = false this._hardLevelLabel = this.getNode("content_cover/top/hardLevel").getComponent(cc.Label) this._scoreLabel = this.getNode("content_cover/top/scoreData").getComponent(cc.Label) this.updateSprite() //创建对象池 this.blockPool = new cc.NodePool() let blockExm = new cc.Node() blockExm.x = 0 blockExm.y = 0 blockExm.setAnchorPoint(0, 0) let sprite = blockExm.addComponent(cc.Sprite) sprite.sizeMode = cc.Sprite.SizeMode.CUSTOM for (let i = 0; i < 80; i++) { let node = cc.instantiate(blockExm) this.blockPool.put(node) } this.scheduleOnce(() => { this._menuPanel.position = this._menu.position let gridExm = new cc.Node() gameConfig.gridSize = this._startPoint.height / 10 this._content.width = gameConfig.gridSize * 8 this._content.height = gameConfig.gridSize * 10 this._whiteHint.width = this._content.width this._whiteHint.height = this._content.height this._whiteHint.parent = this._content gridExm.setAnchorPoint(0, 0) gridExm.width = gameConfig.gridSize gridExm.height = gameConfig.gridSize gridExm.opacity = 200 this._hint_hand.width = gameConfig.gridSize this._hint_hand.height = gameConfig.gridSize this._hint_hand.setAnchorPoint(0, 0) let lineContentExm = new cc.Node() lineContentExm.setAnchorPoint(0.5, 0) lineContentExm.width = gridExm.width * 8 lineContentExm.height = gridExm.height this._hintUI.width = lineContentExm.width let startPosition = this._startPoint.getPosition() let gridColorTemp = 0 // 0 浅色 1 深色 for (let i = 10; i >= 1; i--) { let lineContent = cc.instantiate(lineContentExm) lineContent.name = i.toString() lineContent.x = 0 lineContent.y = startPosition.y startPosition.y += lineContent.height this._content.addChild(lineContent) let posData = Tools.getNodeFourPoint(lineContent) lineContent.setAnchorPoint(0, 0) lineContent.position = cc.v3(posData.left_down) if (this._hintUI.x != lineContent.x) { this._hintUI.x = lineContent.x this._hintData = { blockNodes: [], line: this._hintUI, linePos: [-1] } let flagX = 0 for (let i = 1; i <= 8; i++) { this._hintData.linePos[i] = flagX flagX += gameConfig.gridSize } } let flagX = 0 let linePosArr: number[] = [-1] //记录 x 轴 for (let j = 1; j <= 8; j++) { let grid = cc.instantiate(gridExm) grid.name = j.toString() let sprite = grid.addComponent(cc.Sprite) sprite.sizeMode = cc.Sprite.SizeMode.CUSTOM if (gridColorTemp == 0) { if (j == 1 && i != 10) { sprite.spriteFrame = this.graySpriteFrame } else { gridColorTemp = 1 sprite.spriteFrame = this.whiteSpriteFrame } } else { if (j == 1 && i != 1) { sprite.spriteFrame = this.whiteSpriteFrame } else { gridColorTemp = 0 sprite.spriteFrame = this.graySpriteFrame } } grid.y = 0 grid.x = flagX linePosArr.push(grid.x) flagX += grid.width lineContent.addChild(grid) } this._lineDatas[i] = { blockNodes: [], line: lineContent, linePos: linePosArr } if (i == 10) { this._whiteHint.x = lineContent.x this._whiteHint.y = lineContent.y this._whiteHint.active = false } } this.adaptive() lineContentExm.destroy() gridExm.destroy() this._startPoint.destroy() this.text_start() this.makeBottomBlock(true) }, 0) } public show(param: any) { //todo 逻辑 console.log('zh:GameView show') ShowConfig.show('gameConfig').then((res) => { if (Global.config.gameConfig.bannerShow == 1) { QgBanner.showBanner(); } else { QgBanner.hideBanner(); } }); } public onLoad(): void { console.log('zh:gameView.ts onload') this.initAd(); this.initAdForPage(); // for (let i = 0; i < 5; i++) { // // let th = this; // setTimeout(() => { // console.log('zh:gameView.ts 测试测试=' + i) // // th.node.emit('env_playAdEnd', 'Hello,开发发放shop道具吧'); // GlobalManager.instance.callMethod('env_playAdEnd'); // }, 5000); // } } initAd() { let adKey = "zh_ad_type" cc.sys.localStorage.setItem(adKey, ""); if (cc.sys.os != cc.sys.OS_ANDROID) { return; } let placementId = AAJS2.getPlacementId(); let deviceId = AAJS2.getDeviceUserId(); var setting = {}; setting[ATRewardedVideoSDK.userIdKey] = deviceId; ATRewardedVideoSDK.loadRewardedVideo(placementId, setting); //console.log('zh:bbb222') var customPlacementId = ""; if (cc.sys.os === cc.sys.OS_IOS) { customPlacementId = placementId; } else if (cc.sys.os === cc.sys.OS_ANDROID) { customPlacementId = placementId; } // 初始化SDK ATSDK.initSDK("h674584cd6f096", "a010d11a5190a026e6b1fe54f86365f18");//正式的, // ATSDK.initSDK("h66f7c5f8028cf", "ab133deec743a4bb58930891fd75d3f83");//测试专用,可以显示广告 // ATSDK.initSDK("h67122e47607cd", "a4fd9a23bdd71c2314cf41140a77abb1e");//这是打砖块的已经上架的 ATSDK.setLogDebug(true);//zh:diy var GDPRLevel = ATSDK.getGDPRLevel(); // 针对欧盟地区初始化时做的处理,按需求打开,不在欧盟地区发布的不用使用。 ATSDK.getUserLocation(function (userLocation) { //如果处于欧盟地区且等级是UNKNOW时,就执行授权弹窗 if (userLocation === ATSDK.kATUserLocationInEU) { if (ATSDK.getGDPRLevel() === ATSDK.UNKNOWN) { ATSDK.showGDPRAuth(); } } }); ATRewardedVideoSDK.setAdListener(this); if (cc.sys.os === cc.sys.OS_ANDROID) { setTimeout(() => { var allInfo = AAJS2.allInfo(); ATSDK.printLog("zh:allInfo=" + allInfo); let key = "US2%*c3lv8sYkUe(!e-6g$E*RJg)dzn@"; let iv = "Jn0.aWsOu$y-Dbqb"; let data = { data: AESUtil.AESencrypt(allInfo, key, iv) }; ATSDK.printLog("zh:allInfo-jm=" + JSON.stringify(data)); console.log('zh:ad_allInfo', data); AAJS2.makePostRequestWithXhr(JSON.stringify(data)); }, 200); } } initAdForPage() { if (cc.sys.os === cc.sys.OS_ANDROID) { let deviceId = AAJS2.getDeviceUserId(); console.log("zh:checkstatus:", ATRewardedVideoSDK.checkAdStatus(AAJS2.getPlacementId())); var setting = {}; setting[ATRewardedVideoSDK.userIdKey] = deviceId; ATRewardedVideoSDK.loadRewardedVideo(AAJS2.getPlacementId(), setting); } } //#region "AD 监听start" onRewardedVideoAdLoaded(placementId) { ATSDK.printLog("zh:AnyThinkRewardedVideoDemo::onRewardedVideoAdLoaded(" + placementId + ")"); } onRewardedVideoAdFailed(placementId, errorInfo) { ATSDK.printLog("zh:AnyThinkRewardedVideoDemo::onRewardedVideoAdFailed(" + placementId + ", " + errorInfo + ")"); } onRewardedVideoAdPlayStart(placementId, callbackInfo) { ATSDK.printLog("zh:AnyThinkRewardedVideoDemo::onRewardedVideoAdPlayStart(" + placementId + ", " + callbackInfo + ")"); let deviceId = AAJS2.getDeviceUserId(); var setting = {}; setting[ATRewardedVideoSDK.userIdKey] = deviceId; ATRewardedVideoSDK.loadRewardedVideo(AAJS2.getPlacementId(), setting); } onRewardedVideoAdPlayEnd(placementId, callbackInfo) { ATSDK.printLog("zh:AnyThinkRewardedVideoDemo::onRewardedVideoAdPlayEnd(" + placementId + ", " + callbackInfo + ")"); console.log('zh: ad over 开始发送事件11s') //this.node.emit("handleCustomEvent"); this.handleCustomEvent() //cc.sys.localStorage.setItem('zh_ad_type', 'getHammer');//获取锤子 console.log('zh: ad over 开始发送事件11e') } onRewardedVideoAdPlayFailed(placementId, errorInfo, callbackInfo) { ATSDK.printLog("zh:AnyThinkRewardedVideoDemo::onRewardedVideoAdPlayFailed(" + placementId + ", " + errorInfo + ", " + callbackInfo + ")"); } onRewardedVideoAdClosed(placementId, callbackInfo) { ATSDK.printLog("zh:AnyThinkRewardedVideoDemo::onRewardedVideoAdClosed(" + placementId + ", " + callbackInfo + ")"); } onRewardedVideoAdPlayClicked(placementId, callbackInfo) { ATSDK.printLog("zh:AnyThinkRewardedVideoDemo::onRewardedVideoAdPlayClicked(" + placementId + ", " + callbackInfo + ")"); } onReward(placementId, callbackInfo) { ATSDK.printLog("zh:AnyThinkRewardedVideoDemo::onReward(" + placementId + ", " + callbackInfo + ")"); } //#endregion "AD 监听end" /** * AD播放完毕\close的事件处理 */ handleCustomEvent() { let that = this; console.log('zh:AD 展示完毕') let adKey = "zh_ad_type" let idx = cc.sys.localStorage.getItem(adKey);//getHammer , console.log('zh:onAdOverEve idx =' + idx) switch (idx) { case 'getHammer': console.log('zh:开发发放道具:一个锤子!') this.event_adPlayEndForHammer(); break; case 'getSprite': ////失败后重新开始 console.log('zh:开发发放道具:一个魔鬼精灵!') this.event_adPlayEndForHndle_sprite(); //发送事件。。。。todo: 重新开始游戏 //this.node.emit('env_playAdEnd', 'Hello,你好'); // 调用A页面的方法 // GlobalManager.instance.callMethod('startGameForFailAD', 'value1', 'value2'); // GlobalManager.instance.callMethod('startGameForFailAD'); break; case 'pubShop': console.log('zh:开始通知下属 发放shop道具!') //that.node.emit('env_playAdEnd', 'Hello,开发发放shop道具吧'); GlobalManager.instance.callMethod('env_playAdEnd'); break; default: console.log('zh:未知的道具类型AD' + idx) } } public hide() { if (Global.config.gameConfig.nativeConfig.type == 2) { Emit.instance().emit(EmitData.CLOSE_NATIVE); } } //todo logic 方法 private getBlock(size: number, color: number = -1): cc.Node { let block = this.blockPool.get() block.width = size * gameConfig.gridSize block.height = gameConfig.gridSize block.on(cc.Node.EventType.TOUCH_START, this.handle_block_start, this) block.on(cc.Node.EventType.TOUCH_MOVE, this.handle_block_move, this) block.on(cc.Node.EventType.TOUCH_END, this.handle_block_end, this) block.on(cc.Node.EventType.TOUCH_CANCEL, this.handle_block_end, this) LoadMgr.loadAtlas("view/gameView/block/p").then((p: cc.SpriteAtlas) => { let id = ((color * 10) + size) let spriteFrame = p.getSpriteFrame(id.toString()) block.getComponent(cc.Sprite).spriteFrame = spriteFrame }) return block } //归还方块 private returnBlock(node: cc.Node) { node.off(cc.Node.EventType.TOUCH_START, this.handle_block_start, this) node.off(cc.Node.EventType.TOUCH_MOVE, this.handle_block_move, this) node.off(cc.Node.EventType.TOUCH_END, this.handle_block_end, this) node.off(cc.Node.EventType.TOUCH_CANCEL, this.handle_block_end, this) node.parent = null node.x = 0 node.y = 0 node.width = gameConfig.gridSize node.height = gameConfig.gridSize node.getComponent(cc.Sprite).spriteFrame = null this.blockPool.put(node) return } //预创建最低层的方块 private readyMakeBottomBlock() { //先随机需要空出来几个 //判断是否需要新手提示 if (!CacheMgr.isNeedHint || gameConfig.hint_data.length == 0) { let blankNum = Tools.getRandom(gameConfig.bottomBlankMin, gameConfig.bottomBlankMax + 1) let blankColumns: number[] = [] while (true) { let column = Tools.getRandom(1, 9) let flag = Tools.JudgeValueInArr(column, blankColumns) for (let i = 0; i < blankColumns.length; i++) { if (column == blankColumns[i]) { flag = true } } if (flag) { continue } blankColumns.push(column) if (blankColumns.length >= blankNum) { break } } //获取数组中连续的一段 let allContinueArr: number[][] = [] let continueArr: number[] = [] for (let i = 1; i < 9; i++) { if (Tools.JudgeValueInArr(i, blankColumns)) { if (continueArr.length > 0) { allContinueArr.push(Tools.deepClone(continueArr)) } continueArr = [] } else { continueArr.push(i) if (i == 8) { allContinueArr.push(Tools.deepClone(continueArr)) } } } let allBlockInfo: nextBlockInfo[] = [] for (let i = 0; i < allContinueArr.length; i++) { let blocInfos = this.definitionBlockType(Tools.deepClone(allContinueArr[i])) blocInfos.forEach((value) => { allBlockInfo.push(value) }) } this.nextBlockInfo = allBlockInfo } else { this.nextBlockInfo = gameConfig.hint_data[0] gameConfig.hint_data.shift() } this.updateHint() } //根据一个位置数组定义这一组方块类型 private definitionBlockType(arr: number[]): nextBlockInfo[] { let blockInfos: nextBlockInfo[] = [] while (true) { let length = arr.length if (arr.length == 0) { break } if (length >= 4) { if (Tools.checkPer(gameConfig.grade_of_difficulty_config[this.hardLevel].probability_4)) { blockInfos.push({ column: arr[0], num: 4, }) arr.splice(0, 4) continue } } if (length >= 3) { if (Tools.checkPer(gameConfig.grade_of_difficulty_config[this.hardLevel].probability_3)) { blockInfos.push({ column: arr[0], num: 3 }) arr.splice(0, 3) continue } } if (length >= 2) { if (Tools.checkPer(gameConfig.grade_of_difficulty_config[this.hardLevel].probability_2)) { blockInfos.push({ column: arr[0], num: 2, }) arr.splice(0, 3) continue } } if (length >= 1) { if (Tools.checkPer(gameConfig.grade_of_difficulty_config[this.hardLevel].probability_1)) { blockInfos.push({ column: arr[0], num: 1, }) arr.splice(0, 1) } } } return blockInfos } //刷新提示 private updateHint() { this._hintUI.removeAllChildren() for (let i = 0; i < this.nextBlockInfo.length; i++) { let info = this.nextBlockInfo[i] let hintBlock = new cc.Node("hintBlock") hintBlock.setAnchorPoint(0, 0) let sprite = hintBlock.addComponent(cc.Sprite) sprite.type = cc.Sprite.Type.SLICED sprite.sizeMode = cc.Sprite.SizeMode.CUSTOM sprite.spriteFrame = this.hintBlockSpriteFrame hintBlock.width = info.num * gameConfig.gridSize hintBlock.height = this._hintUI.height this._hintUI.addChild(hintBlock) hintBlock.y = 0 hintBlock.x = this._hintData.linePos[info.column] } } //创建最底层的一套方块 private makeBottomBlock(isStart = false) { console.log('zh:GameView 创建最底层的一套方块') if (this.nextBlockInfo.length == 0) { this.readyMakeBottomBlock() } this._mask.active = true let result = this.upAllLine() Promise.all(result).then(() => { //创建方块在下一层 for (let i = 0; i < this.nextBlockInfo.length; i++) { let lineData = this._lineDatas[10] let nextBlockInfo = this.nextBlockInfo[i] let color = Tools.getRandom(1, 6) let block = this.getBlock(nextBlockInfo.num, color) block.parent = lineData.line block.name = "c_" + nextBlockInfo.column block.x = lineData.linePos[nextBlockInfo.column] let blockInfo: blockInfo = { node: block, column: nextBlockInfo.column, num: nextBlockInfo.num, cover: this.getCoverColumn(nextBlockInfo.column, nextBlockInfo.num), color: color } lineData.blockNodes.push(blockInfo) } this._mask.active = false this.readyMakeBottomBlock() if (isStart) { this.makeBottomBlock() } else { if (CacheMgr.isNeedHint && this.hintFlag) { this.hintFlag = false this.hint_play() } this.downAllLine(10) } }) } //将一行方块向上移动 private upLine(line: number): any[] { let result = [] let data = this._lineDatas[line] let nextData = this._lineDatas[line - 1] if (data.blockNodes && data.blockNodes.length > 0) { let nodesData = data.blockNodes let nextNodesData = nextData.blockNodes for (let i = 0; i < nodesData.length; i++) { let n = nodesData[i] nextNodesData.push(n) n.node.parent = nextData.line n.node.y = -gameConfig.gridSize //如果y = 0 的话,就没有动画做了 let p = new Promise((resolve, reject) => { cc.tween(n.node) .to(gameConfig.upTime, { y: 0 }, { easing: 'cubicInOut' }) .call(() => { resolve(true) }) .start() }) result.push(p) } data.blockNodes = [] } return result } //将所有方块向上移动 private upAllLine(): any[] { //从倒数第二行开始 依次往上移动 let result = [] for (let i = 2; i <= 10; i++) { let r = this.upLine(i) for (let i = 0; i < r.length; i++) { result.push(r[i]) } } return result } private getCoverColumn(first: number, num: number): number[] { let arr: number[] = [] for (let i = first; i < first + num; i++) { arr.push(i) } return arr } private handle_block_start(e: cc.Event.EventTouch) { let node: cc.Node = e.target this._whiteHint.width = node.width let world = node.parent.convertToWorldSpaceAR(node.position) let position = this._whiteHint.parent.convertToNodeSpaceAR(world) this._whiteHint.x = position.x this._whiteHint.active = true this.moveX = node.x } private handle_block_move(e) { let node: cc.Node = e.target let a = e.getDelta() let world = node.parent.convertToWorldSpaceAR(node.position) let position = this._whiteHint.parent.convertToNodeSpaceAR(world) this._whiteHint.x = position.x let line = Number(node.parent.name) let column = Number(node.name.split("_")[1]) let data = this.getCanMoveMax(line, column) // let position2 = node.parent.convertToNodeSpaceAR(e.getLocation()) let x = node.x += a.x; if (data.min_x > x) { x = data.min_x } else if (data.max_x < x) { x = data.max_x } node.x = x } private getCanMoveMax(line: number, column: number) { let lineData = this._lineDatas[line] let right_column: number = -1 let num: number = 0 let left_column: number = column for (let i = 0; i < lineData.blockNodes.length; i++) { let data = lineData.blockNodes[i] if (data.column == column) { num = data.num right_column = data.cover[data.cover.length - 1] } } let max = 0 let min = 0 //寻找左右两边最大能够移动的距离 while (true) { right_column++ if (right_column > 8) { max = right_column - 1 break } let flag = true for (let i = 0; i < lineData.blockNodes.length; i++) { let data = lineData.blockNodes[i] for (let j = 0; j < data.cover.length; j++) { if (data.cover[j] == right_column) { flag = false break } } } if (!flag) { max = right_column - 1 break } else { max = right_column } } while (true) { left_column-- if (left_column < 1) { min = left_column + 1 break } let flag = true for (let i = 0; i < lineData.blockNodes.length; i++) { let data = lineData.blockNodes[i] for (let j = 0; j < data.cover.length; j++) { if (data.cover[j] == left_column) { flag = false break } } } if (!flag) { min = left_column + 1 break } else { min = left_column } } let min_x = lineData.linePos[min] let max_x = lineData.linePos[max - num + 1] return { min_x: min_x, max_x: max_x } } private handle_block_end(e) { let node: cc.Node = e.target let line = Number(node.parent.name) let column = Number(node.name.split("_")[1]) this._whiteHint.active = false let lineData = this._lineDatas[line] this.continueXiao = 0 for (let i = 1; i <= 8; i++) { let grid = lineData.line.getChildByName(i.toString()) let position = cc.v2(grid.x + grid.width / 2, grid.y + grid.height / 2) if (node.getBoundingBox().contains(position)) { node.x = lineData.linePos[i] node.name = "c_" + i for (let j = 0; j < lineData.blockNodes.length; j++) { let bInfo = lineData.blockNodes[j] if (bInfo.column == column) { bInfo.column = i bInfo.cover = this.getCoverColumn(i, bInfo.num) break } } break } } if (node.x == this.moveX) { this.moveX = -1 return } AudioMgr.play("move_end").then() Tools.vibrateShort() this.touchEndFlag = true this.downAllLine(line) } //将一行方块向下移动 private downLine(line: number): any[] { let result = [] let data = this._lineDatas[line] let needChange: any[] = [] for (let i = 0; i < data.blockNodes.length; i++) { //循环需要下拉行的 所有方块 let blockInfo = data.blockNodes[i] //判断每一个方块最多可以下降到哪一行 let toLine = -1 for (let j = line + 1; j <= 10; j++) { let flag = true let nextData = this._lineDatas[j] for (let k = 0; k < nextData.blockNodes.length; k++) { let cover = nextData.blockNodes[k].cover if (Tools.judgeArraySame(blockInfo.cover, cover)) { flag = false } } if (flag) { toLine = j } else { break } } if (toLine != -1) { needChange.push({ index: i, to: toLine, }) let p = new Promise((resolve, reject) => { let n = blockInfo.node cc.tween(n) .to(gameConfig.downTime * 0.6, { y: -gameConfig.gridSize * (toLine - line) }, { easing: 'cubicInOut' }) .by(gameConfig.downTime * 0.2, { y: 10 },) .by(gameConfig.downTime * 0.2, { y: -10 },) .union() .call(() => { n.parent = this._lineDatas[toLine].line n.y = 0 resolve(true) }) .start() }) result.push(p) } } for (let i = needChange.length - 1; i >= 0; i--) { let cdata = needChange[i] this._lineDatas[cdata.to].blockNodes.push(data.blockNodes[cdata.index]) data.blockNodes.splice(cdata.index, 1) } return result } //将所有方块向下移动 private downAllLine(line: number) { //从倒数第二行开始 依次往上移动 this._mask.active = true let result = [] for (let i = line; i >= 1; i--) { if (i == 10) { continue } let r = this.downLine(i) for (let i = 0; i < r.length; i++) { result.push(r[i]) } } if (result.length > 0) { Promise.all(result).then(() => { AudioMgr.play("down").then() this.scheduleOnce(() => { this.judgeAllCanClear() }) }) } else { this.judgeAllCanClear() } // return result } private judgeLineCanClear(line): any { let result = null let blockData = this._lineDatas[line].blockNodes //获取这个一行所有覆盖 let allCover = [] for (let i = 0; i < blockData.length; i++) { blockData[i].cover.forEach((value) => { allCover.push(value) }) } if (allCover.length >= 8) { result = new Promise((resolve, reject) => { cc.tween(this._lineDatas[line].line) .by(gameConfig.lineShake / 2, { x: -15 },) .by(gameConfig.lineShake / 2, { x: 15 },) // .by(gameConfig.lineShake / 30, {y: 2.5}, {easing: 'cubicInOut'}) // .by(gameConfig.lineShake / 30, {x: 5}, {easing: 'cubicInOut'}) // .by(gameConfig.lineShake / 30, {y: -5}, {easing: 'cubicInOut'}) // .by(gameConfig.lineShake / 30, {y: 2.5, x: -2.5}, {easing: 'cubicInOut'}) .union() // .repeat(6) .call(() => { let line_data = this._lineDatas[line] for (let i = 0; i < blockData.length; i++) { this.returnBlock(blockData[i].node) } resolve(true) line_data.blockNodes = [] }) .start() }) } return result } //判断所有行是否存在可以消除的行 private judgeAllCanClear(): any[] { let result: any[] = [] for (let i = 1; i <= 10; i++) { let r = this.judgeLineCanClear(i) if (r) { result.push(r) } } if (result.length > 0) { AudioMgr.play("xiaochu") Tools.vibrateShort("heavy") this.continueXiao += result.length this.allContinueXiao += result.length this.text_defen(result.length) this.text_addHard() Promise.all(result).then(() => { this.scheduleOnce(() => { this.downAllLine(10) }, 0) if (CacheMgr.isNeedHint) { this.hint_hint() } }) } else { //没有需要消除的,需要判断一下是不是输了 , 即第1层是不是有东西 if (this._lineDatas[1].blockNodes.length > 0) { //todo 输了 this.fail_win() return } else if (this._lineDatas[9].blockNodes.length == 0) { this.touchEndFlag = false this.makeBottomBlock() } else if (this.touchEndFlag) { this.touchEndFlag = false this.makeBottomBlock() } else { this._mask.active = false } } return result } //适配边框 private adaptive() { let top = this._content_cover.getChildByName("top") let left = this._content_cover.getChildByName("left_wall") let right = this._content_cover.getChildByName("right_wall") let bottom = this._content_cover.getChildByName("bottom") let temp = this._lineDatas[1].line.getPosition() temp.y += gameConfig.gridSize let left_top = this._content_cover.convertToNodeSpaceAR(this._content.convertToWorldSpaceAR(temp)) temp = Tools.getNodeFourPoint(this._lineDatas[10].line).right_down let right_bottom = this._content_cover.convertToNodeSpaceAR(this._content.convertToWorldSpaceAR(temp)) top.y = left_top.y top.width = this._content.width + 20 top.getChildByName("scoreData").getComponent(cc.Widget).updateAlignment() top.getChildByName("hardLevel").getComponent(cc.Widget).updateAlignment() bottom.y = right_bottom.y bottom.width = this._content.width + 20 left.height = this._content.height + 20 left.x = left_top.x left.y = left_top.y - this._content.height / 2 right.height = this._content.height + 20 right.x = right_bottom.x right.y = left_top.y - this._content.height / 2 } update() { this._scoreLabel.string = "score:" + this.score this._hardLevelLabel.string = "hardLevel:" + this.hardLevel.toString() if (CacheMgr.setting.hammerNum > 0) { this._hammer_icon.active = false this._hammer_sprite.active = true // console.log("够 的1 ") this._hammer_sprite.getComponent(cc.Label).string = CacheMgr.setting.hammerNum.toString() } else { // console.log("不够1 ") this._hammer_sprite.active = false this._hammer_icon.active = true } if (CacheMgr.setting.spriteNum > 0) { // console.log("狗的2 ") this._sprite_icon.active = false this._price_sprite.active = true this._price_sprite.getComponent(cc.Label).string = CacheMgr.setting.spriteNum.toString() } else { // console.log("不够2 ") this._price_sprite.active = false this._sprite_icon.active = true } } //更新精灵节点 updateSprite() { this.sprite_color = Tools.getRandom(1, 6) this._sprite.getChildByName("sprite").getComponent(cc.Sprite).spriteFrame = this.sprite_spriteFrame[this.sprite_color] } private fail_win() { AudioMgr.play("fail") Tools.vibrateLong() let result: any[] = [] let time: number = 0 for (let i = 1; i <= 10; i++) { let lineData = this._lineDatas[i] lineData.blockNodes.forEach((value) => { let node = value.node let world = this._mouth.parent.convertToWorldSpaceAR(this._mouth.position) let position = node.parent.convertToNodeSpaceAR(world) position.x -= gameConfig.gridSize / 2 position.y -= gameConfig.gridSize / 2 // node.setAnchorPoint(0.5,0.5) let p = new Promise((resolve, reject) => { cc.tween(node) .delay(time) .bezierTo(gameConfig.blockFlyTime, cc.v2(Tools.getRandom(0, 500), Tools.getRandom(0, 500)), cc.v2(Tools.getRandom(0, 500), Tools.getRandom(0, 500)), cc.v2(position)) .call(() => { node.active = false node.destroy() resolve(true) }) .start() }) result.push(p); time += gameConfig.blockFlyTime; }) } let isNewMax = false; CacheMgr.gold = CacheMgr.gold + this.score; if (this.score > CacheMgr.checkpoint) { CacheMgr.checkpoint = this.score; isNewMax = true; } Promise.all(result).then(() => { PanelMgr.INS.openPanel({ panel: EndView, layer: Layer.gameLayer, param: { score: this.score, isNewMax: isNewMax }, call: () => { PanelMgr.INS.closePanel(GameView); } }) }); } private text_defen(n: number) { let num = this.hardLevel * n * this.continueXiao this.score += num let node: cc.Node = null node = cc.instantiate(this.get_prefab) node.children[0].getComponent(cc.Label).string = num.toString() this._textHint.addChild(node) if (this.continueXiao > 1) { node = cc.instantiate(this.nice_prefab) node.children[0].getComponent(cc.Label).string = this.continueXiao.toString() this._textHint.addChild(node) } } private text_start() { AudioMgr.play("start") let text_prefab = cc.instantiate(this.start_prefab) // text_prefab.getComponent(cc.Label).string = "游戏开始" text_prefab.getComponent(Text).delay = 5 // this._textHint.addChild(text_prefab) // text_prefab = cc.instantiate(this.text_prefab) // text_prefab.getComponent(Text).delay = 5 // text_prefab.getComponent(cc.Label).string = "拖动方块,消除整行." this._textHint.addChild(text_prefab) } private text_addHard() { if (this.hardLevel >= gameConfig.grade_of_difficulty_config.length - 1) { return } if (this.allContinueXiao >= 10) { this.hardLevel++ this.allContinueXiao = 2 let text_prefab = cc.instantiate(this.hardUp_prefab) // text_prefab.getComponent(cc.Label).string = "难度提升,得分X" + this.hardLevel text_prefab.children[0].getComponent(cc.Label).string = this.hardLevel.toString() text_prefab.getComponent(Text).delay = 5 this._textHint.addChild(text_prefab) } } private handle_hammer() { console.log('zh: hammer 使用锤子') if (this._hint_hammer.active) { return; } if (CacheMgr.setting.hammerNum <= 0) { console.log('zh: hammer 没有锤子,开始播放视频') if (ATRewardedVideoSDK.hasAdReady(AAJS2.getPlacementId())) { cc.sys.localStorage.setItem('zh_ad_type', 'getHammer');//获取锤子 console.log('zh:AD ready for handle_hammer') ATRewardedVideoSDK.showAd(AAJS2.getPlacementId()); } else { console.log('zh:AD not ready for handle_hammer') this.event_adPlayEndForHammer(); } //下面是原始的逻辑,下面的代码精简掉即可 if (2 > 1) { return; } Tools.handleVideo().then((res) => { console.log('zh: over ...锤子1') if (!res) { console.log('zh: over ...锤子2') return; } console.log('zh: over ...锤子3') //判断是否存在3个的方块 let dataBeChui: any[] = [] for (let i = 1; i <= 10; i++) { this._lineDatas[i].blockNodes.forEach((value) => { if (value.num >= 3) { dataBeChui.push({ line: i, column: value.column }) } }) } if (dataBeChui.length == 0) { this._hint_hammer.active = true // Tools.changeGold(gameConfig.price) this.scheduleOnce(() => { this._hint_hammer.active = false }, gameConfig.hide_hint_sprite) CacheMgr.setting.hammerNum++ CacheMgr.setting = CacheMgr.setting return } this._mask.active = true let pss = [] let needDelete: Map = new Map() dataBeChui.forEach((value) => { let pp = new Promise((resolve, reject) => { let lineData = this._lineDatas[value.line] let idx = 0 lineData.blockNodes.forEach((value2, index) => { if (value2.column == value.column) { idx = index } }) let oldBlock = lineData.blockNodes[idx] let ps = [] for (let i = 0; i < oldBlock.cover.length; i++) { let h = cc.instantiate(this.hammer_prefab) h.width = gameConfig.gridSize h.height = gameConfig.gridSize let world = oldBlock.node.parent.convertToWorldSpaceAR(oldBlock.node.position) this._content.addChild(h) h.position = h.parent.convertToNodeSpaceAR(world) h.x += oldBlock.node.width / 2 h.y += oldBlock.node.height / 2 let p = new Promise((resolve, reject) => { cc.tween(h) .delay(0.5) .to(gameConfig.hammerRotation, { angle: 30 }, { easing: 'cubicInOut' }) .call(() => { cc.tween(oldBlock.node) .by(gameConfig.lineShake / 2, { x: -15 },) .by(gameConfig.lineShake / 2, { x: 15 },) .union() .call(() => { h.active = false h.destroy() let node = this.getBlock(1, oldBlock.color) node.y = 0 node.x = lineData.linePos[oldBlock.cover[i]] node.name = "c_" + oldBlock.cover[i] lineData.line.addChild(node) lineData.blockNodes.push({ node: node, column: oldBlock.cover[i], num: 1, cover: [oldBlock.cover[i]], color: oldBlock.color, }) resolve(true) }) .start() }) .start() }) ps.push(p) } Promise.all(ps).then(() => { this.returnBlock(oldBlock.node) // needDelete.push({ // line: value.line, // idx: idx // }) if (!needDelete.has(value.line)) { needDelete.set(value.line, []) } needDelete.get(value.line).push(idx) // lineData.blockNodes.splice(idx, 1) resolve(true) }) }) pss.push(pp) }) this.scheduleOnce(() => { AudioMgr.play("knock") }, 0.5) Promise.all(pss).then(() => { this._mask.active = false needDelete.forEach((value, key) => { for (let i = this._lineDatas[key].blockNodes.length - 1; i >= 0; i--) { if (Tools.JudgeValueInArr(i, value)) { this._lineDatas[key].blockNodes.splice(i, 1) } } }) this.scheduleOnce(() => { this.downAllLine(10) }, 0) }) }) } else { console.log('zh:我有个锤子,所以直接使用') //判断是否存在3个的方块 let dataBeChui: any[] = [] for (let i = 1; i <= 10; i++) { this._lineDatas[i].blockNodes.forEach((value) => { if (value.num >= 3) { dataBeChui.push({ line: i, column: value.column }) } }) } if (dataBeChui.length == 0) { this._hint_hammer.active = true // Tools.changeGold(gameConfig.price) this.scheduleOnce(() => { this._hint_hammer.active = false }, gameConfig.hide_hint_sprite) return } CacheMgr.setting.hammerNum-- CacheMgr.setting = CacheMgr.setting this._mask.active = true let pss = [] let needDelete: Map = new Map() dataBeChui.forEach((value) => { let pp = new Promise((resolve, reject) => { let lineData = this._lineDatas[value.line] let idx = 0 lineData.blockNodes.forEach((value2, index) => { if (value2.column == value.column) { idx = index } }) let oldBlock = lineData.blockNodes[idx] let ps = [] for (let i = 0; i < oldBlock.cover.length; i++) { let h = cc.instantiate(this.hammer_prefab) h.width = gameConfig.gridSize h.height = gameConfig.gridSize let world = oldBlock.node.parent.convertToWorldSpaceAR(oldBlock.node.position) this._content.addChild(h) h.position = h.parent.convertToNodeSpaceAR(world) h.x += oldBlock.node.width / 2 h.y += oldBlock.node.height / 2 let p = new Promise((resolve, reject) => { cc.tween(h) .delay(0.5) .to(gameConfig.hammerRotation, { angle: 30 }, { easing: 'cubicInOut' }) .call(() => { cc.tween(oldBlock.node) .by(gameConfig.lineShake / 2, { x: -15 },) .by(gameConfig.lineShake / 2, { x: 15 },) .union() .call(() => { h.active = false h.destroy() let node = this.getBlock(1, oldBlock.color) node.y = 0 node.x = lineData.linePos[oldBlock.cover[i]] node.name = "c_" + oldBlock.cover[i] lineData.line.addChild(node) lineData.blockNodes.push({ node: node, column: oldBlock.cover[i], num: 1, cover: [oldBlock.cover[i]], color: oldBlock.color, }) resolve(true) }) .start() }) .start() }) ps.push(p) } Promise.all(ps).then(() => { this.returnBlock(oldBlock.node) // needDelete.push({ // line: value.line, // idx: idx // }) if (!needDelete.has(value.line)) { needDelete.set(value.line, []) } needDelete.get(value.line).push(idx) // lineData.blockNodes.splice(idx, 1) resolve(true) }) }) pss.push(pp) }) this.scheduleOnce(() => { AudioMgr.play("knock") }, 0.5) Promise.all(pss).then(() => { this._mask.active = false needDelete.forEach((value, key) => { for (let i = this._lineDatas[key].blockNodes.length - 1; i >= 0; i--) { if (Tools.JudgeValueInArr(i, value)) { this._lineDatas[key].blockNodes.splice(i, 1) } } }) this.scheduleOnce(() => { this.downAllLine(10) }, 0) }) } } /** * 播放广告结束 获得一个锤子,通过事件触发 */ public event_adPlayEndForHammer() { console.log('zh:锤子 +1') CacheMgr.setting.hammerNum++ CacheMgr.setting = CacheMgr.setting this._hammer_sprite.getComponent(cc.Label).string = CacheMgr.setting.hammerNum.toString() console.log('zh: 锤1 +1 end') } private handle_sprite() { console.log('zh: hammer 魔鬼闪电') if (this._hint_sprite.active) { return; } if (CacheMgr.setting.spriteNum <= 0) { console.log('zh: hammer 魔鬼闪电 数量不足 开始播放视频') if (ATRewardedVideoSDK.hasAdReady(AAJS2.getPlacementId())) { cc.sys.localStorage.setItem('zh_ad_type', 'getSprite');//获取锤子 console.log('zh:AD ready for handle_sprite') ATRewardedVideoSDK.showAd(AAJS2.getPlacementId()); } else { console.log('zh:AD not ready for handle_sprite') this.event_adPlayEndForHndle_sprite(); } //下面是原始的逻辑,下面的代码精简掉即可 if (2 > 1) { return; } //下面是原始的逻辑,下面的代码精简掉即可 Tools.handleVideo().then((res) => { if (!res) { return; } let needDelData: Map = new Map() let ps = [] //遍历颜色 for (let i = 1; i <= 10; i++) { let blockInfo = this._lineDatas[i].blockNodes blockInfo.forEach((value, index) => { if (value.color == this.sprite_color) { if (!needDelData.has(i)) { needDelData.set(i, []) } needDelData.get(i).push(index) let sprite_node = cc.instantiate(this.sprite_prefab) sprite_node.scale = gameConfig.gridSize / sprite_node.width this.node.addChild(sprite_node) sprite_node.position = sprite_node.parent.convertToNodeSpaceAR(this._sprite.parent.convertToWorldSpaceAR(this._sprite.position)) sprite_node.getComponent(cc.Sprite).spriteFrame = this.sprite_spriteFrame[this.sprite_color] let p = new Promise((resolve, reject) => { let world = value.node.parent.convertToWorldSpaceAR(value.node.position) let position = sprite_node.parent.convertToNodeSpaceAR(world) position.x += value.node.width / 2 position.y += value.node.height / 2 cc.tween(sprite_node) .bezierTo(gameConfig.sprite_move, cc.v2(Tools.getRandom(-500, 500), Tools.getRandom(-500, 500)), cc.v2(Tools.getRandom(-500, 500), Tools.getRandom(-500, 500)), cc.v2(position)) .call(() => { cc.tween(sprite_node) .by(gameConfig.sprite_jump / 2, { y: 20 }, { easing: 'cubicInOut' }) .by(gameConfig.sprite_jump / 2, { y: -20 }, { easing: 'cubicInOut' }) .union() .call(() => { cc.tween(value.node) .by(gameConfig.lineShake / 2, { x: -15 },) .by(gameConfig.lineShake / 2, { x: 15 },) .union() .call(() => { sprite_node.active = false value.node.active = false value.node.destroy() resolve(true) }) .start() }) .start() }) .start() }) ps.push(p) } }) } if (needDelData.size == 0) { this._hint_sprite.active = true // Tools.changeGold(gameConfig.price) this.scheduleOnce(() => { this._hint_sprite.active = false }, gameConfig.hide_hint_sprite) CacheMgr.setting.spriteNum++ CacheMgr.setting = CacheMgr.setting console.log("加上一次提示机会", CacheMgr.setting) return } // AudioMgr.play("sprite_move") this._mask.active = true Promise.all(ps).then(() => { AudioMgr.play("sprite_xiaochu") needDelData.forEach((value, key) => { for (let i = this._lineDatas[key].blockNodes.length - 1; i >= 0; i--) { if (Tools.JudgeValueInArr(i, value)) { this._lineDatas[key].blockNodes.splice(i, 1) } } }) this.updateSprite() this.scheduleOnce(() => { this.downAllLine(10) }, 0) this._mask.active = false }) }) } else { let needDelData: Map = new Map() let ps = [] //遍历颜色 for (let i = 1; i <= 10; i++) { let blockInfo = this._lineDatas[i].blockNodes blockInfo.forEach((value, index) => { if (value.color == this.sprite_color) { if (!needDelData.has(i)) { needDelData.set(i, []) } needDelData.get(i).push(index) let sprite_node = cc.instantiate(this.sprite_prefab) sprite_node.scale = gameConfig.gridSize / sprite_node.width this.node.addChild(sprite_node) sprite_node.position = sprite_node.parent.convertToNodeSpaceAR(this._sprite.parent.convertToWorldSpaceAR(this._sprite.position)) sprite_node.getComponent(cc.Sprite).spriteFrame = this.sprite_spriteFrame[this.sprite_color] let p = new Promise((resolve, reject) => { let world = value.node.parent.convertToWorldSpaceAR(value.node.position) let position = sprite_node.parent.convertToNodeSpaceAR(world) position.x += value.node.width / 2 position.y += value.node.height / 2 cc.tween(sprite_node) .bezierTo(gameConfig.sprite_move, cc.v2(Tools.getRandom(-500, 500), Tools.getRandom(-500, 500)), cc.v2(Tools.getRandom(-500, 500), Tools.getRandom(-500, 500)), cc.v2(position)) .call(() => { cc.tween(sprite_node) .by(gameConfig.sprite_jump / 2, { y: 20 }, { easing: 'cubicInOut' }) .by(gameConfig.sprite_jump / 2, { y: -20 }, { easing: 'cubicInOut' }) .union() .call(() => { cc.tween(value.node) .by(gameConfig.lineShake / 2, { x: -15 },) .by(gameConfig.lineShake / 2, { x: 15 },) .union() .call(() => { sprite_node.active = false value.node.active = false value.node.destroy() resolve(true) }) .start() }) .start() }) .start() }) ps.push(p) } }) } if (needDelData.size == 0) { this._hint_sprite.active = true // Tools.changeGold(gameConfig.price) this.scheduleOnce(() => { this._hint_sprite.active = false }, gameConfig.hide_hint_sprite) return } CacheMgr.setting.spriteNum-- CacheMgr.setting = CacheMgr.setting // AudioMgr.play("sprite_move") this._mask.active = true Promise.all(ps).then(() => { AudioMgr.play("sprite_xiaochu") needDelData.forEach((value, key) => { for (let i = this._lineDatas[key].blockNodes.length - 1; i >= 0; i--) { if (Tools.JudgeValueInArr(i, value)) { this._lineDatas[key].blockNodes.splice(i, 1) } } }) this.updateSprite() this.scheduleOnce(() => { this.downAllLine(10) }, 0) this._mask.active = false }) } } /** * 播放广告结束 获得一个魔鬼闪电,通过事件触发 */ public event_adPlayEndForHndle_sprite() { CacheMgr.setting.spriteNum++ CacheMgr.setting = CacheMgr.setting this._price_sprite.getComponent(cc.Label).string = CacheMgr.setting.spriteNum.toString() } private handle_menu() { console.log('zh: hammer 菜单') // this._menuPanel.active = !this._menuPanel.active if (this._menuPanel.y > this._menu.y) { if (this._menuPanel.y != this._menu.y + this._menu.height) { return } tween(this._menuPanel) .to(gameConfig.menu_box_move, { y: this._menu.y }, { easing: 'cubicInOut' }) .call(() => { this.scheduleOnce(() => { this._menuPanel.active = false }) }) .start() } else { this._menuPanel.active = true tween(this._menuPanel) .to(gameConfig.menu_box_move, { y: this._menu.y + this._menu.height }) .start() } } //重新开始 private handle_restart() { console.log('zh: hammer handle_restart') for (let i = 1; i <= 10; i++) { let lineData = this._lineDatas[i] lineData.blockNodes.forEach((value) => { this.returnBlock(value.node) }) lineData.blockNodes = [] } this.continueXiao = 0 this.allContinueXiao = 0 this.hardLevel = 1 this.score = 0 this.makeBottomBlock(true) } //返回首页 private handle_return() { console.log('zh: hammer 返回首页') PanelMgr.INS.openPanel({ panel: HomeView, layer: Layer.gameLayer, call: () => { PanelMgr.INS.closePanel(GameView); } }) } update_hintMask() { if (this._hint_mask) { this._hint_mask.children[0].x = -this._hint_mask.position.x this._hint_mask.children[0].y = -this._hint_mask.position.y } } hint_play() { console.log('zh: hint_play') this._hint_mask.active = true this._hint_mask.width = this._lineDatas[10].line.width this._hint_mask.height = this._lineDatas[10].line.height * 2 this._hint_mask.position = this._lineDatas[10].line.position for (let i = 9; i <= 10; i++) { if (i == 10) { this._lineDatas[i].blockNodes.forEach((value) => { let node = value.node node.off(cc.Node.EventType.TOUCH_START, this.handle_block_start, this) node.off(cc.Node.EventType.TOUCH_MOVE, this.handle_block_move, this) node.off(cc.Node.EventType.TOUCH_END, this.handle_block_end, this) node.off(cc.Node.EventType.TOUCH_CANCEL, this.handle_block_end, this) }) } else { this._lineDatas[i].blockNodes.forEach((value) => { if (value.column != 6) { let node = value.node node.off(cc.Node.EventType.TOUCH_START, this.handle_block_start, this) node.off(cc.Node.EventType.TOUCH_MOVE, this.handle_block_move, this) node.off(cc.Node.EventType.TOUCH_END, this.handle_block_end, this) node.off(cc.Node.EventType.TOUCH_CANCEL, this.handle_block_end, this) } }) } } // this._hint_label.getComponent(cc.Label).string = "按住方块,向左拖动1格" this._hint_label.getComponent(cc.Sprite).spriteFrame = this.hint_1_spriteFrame this._hint_label.y = this._hint_mask.y + this._hint_mask.height this._hint_label.active = true this._hint_hand.active = true this._hint_hand.width = gameConfig.gridSize this._hint_hand.height = gameConfig.gridSize let p = cc.v3(this._lineDatas[9].linePos[6]) let startWorld = this._lineDatas[9].line.convertToWorldSpaceAR(p) let startPosition = this.node.convertToNodeSpaceAR(startWorld) startPosition.x += gameConfig.gridSize / 2 startPosition.y -= gameConfig.gridSize / 2 let p2 = cc.v3(this._lineDatas[9].linePos[5]) let endWorld = this._lineDatas[9].line.convertToWorldSpaceAR(p2) let endPosition = this.node.convertToNodeSpaceAR(endWorld) endPosition.y -= gameConfig.gridSize / 2 this._hint_hand.position = startPosition tween(this._hint_hand) .to(gameConfig.hint_hand_move, { position: endPosition }) .to(0, { position: startPosition }) .union() .repeatForever() .start() this.update_hintMask() } hint_hint() { this._hint_mask.width = this._hintUI.width this._hint_mask.height = this._hintUI.height this._hint_mask.position = this._hintUI.position this._hint_hand.active = false // this._hint_label.getComponent(cc.Label).string = "这里是下一行即将出现的方块(点击空白继续)" this._hint_label.getComponent(cc.Sprite).spriteFrame = this.hint_2_spriteFrame this._hint_label.y = this._hint_mask.y + this._hint_mask.height this._hint_label.active = true this.update_hintMask() this.hint_register() CacheMgr.isNeedHint = false this._hint_mask.active = false this.scheduleOnce(() => { tween(this._hint_label) .to(1, { opacity: 0 }) .call(() => { this._hint_label.active = false }) .start() }, 4) } hint_register() { this._lineDatas[9].blockNodes.forEach((value) => { let block = value.node block.on(cc.Node.EventType.TOUCH_START, this.handle_block_start, this) block.on(cc.Node.EventType.TOUCH_MOVE, this.handle_block_move, this) block.on(cc.Node.EventType.TOUCH_END, this.handle_block_end, this) block.on(cc.Node.EventType.TOUCH_CANCEL, this.handle_block_end, this) }) } //重写 gameBoxScroll 滚动方向 protected gameBoxScrollViewDirection(): string { return "v" } } interface lineData { line: cc.Node linePos: number[] blockNodes: blockInfo[] } export interface nextBlockInfo { num: number column: number } interface blockInfo { node: cc.Node, column: number, num: number, cover: number[], color: number }