123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563 |
- /**
- * @author uu
- * @file 游戏控制
- */
- var AC = require('action')
- const ADSdk = require('ADSdk');
- cc.Class({
- extends: cc.Component,
- properties: {
- _status: 0, //0 未开始 1 游戏开始 2 游戏暂停 3 游戏结束 4 下落状态 5无法触摸状态
- blockPrefab: cc.Prefab,
- blockSprite: [cc.SpriteFrame], //todo: 换成动态生成 暂不处理
- warningSpriteFrame: [cc.SpriteFrame],
- propSpriteFrame: [cc.SpriteFrame],
- checkMgr: require("check"),
- revivePage: cc.Node,
- tutorialNode: cc.Node,
- shareBtn: cc.Node,
- shareSuccessDialog: cc.Node,
- redBtnSprite: cc.Sprite,
- redBtnSpriteFrame: [cc.SpriteFrame],
- moneyLabel:cc.Label,
- redBagIcon:cc.Prefab,
- signInBtn:cc.Node,
- // bombAddLabel:cc.Label,
- // btnLabel:cc.Label,
- },
- start() {
- this.showRedBtn();
- this.showSignInBtn();
- this.bindNode()
- this.generatePool()
- this.loadRes()
- // this.btnLabel.string = "确定";
- // this.bombAddLabel.string = "炸弹+1";
-
- },
- showRedBtn() {
- if (Utils.hadRedPacket()) {
- this.redBtnSprite.spriteFrame = this.redBtnSpriteFrame[1];
- this.moneyLabel.node.active = false
- } else {
- this.redBtnSprite.spriteFrame = this.redBtnSpriteFrame[0];
- this.moneyLabel.node.active = true;
- let moneyNum = Utils.getRedPacketNum();
- if (moneyNum == 0) moneyNum = "0.00";
- this.moneyLabel.string = moneyNum + "元";
- }
- },
- showSignInBtn() {
- if (Utils.isSecondDay()) {
- Utils.clearSignIn();
- }
- if(Utils.hadSignIn()){
- this.signInBtn.active = false;
- }else{
- this.signInBtn.active = true;
- }
- },
- closeRedUIAni() {
- let btn = this.redBtnSprite.node;
- let position = btn.convertToWorldSpaceAR(cc.v2(0, 0));// btn转世界坐标
- position = this.node.convertToNodeSpaceAR(position);// 世界坐标转game节点下坐标
-
- let node = cc.instantiate(this.redBagIcon);
- node.parent = this.node;
- node.runAction(
- cc.sequence(
- cc.moveTo(0.5, position),
- cc.scaleTo(0.3, 1, 1),
- cc.callFunc(() => { node.destroy(); })
- ));
- },
- loadRes() {
- },
- init(c) {
- this._controller = c
- this._score = c.scoreMgr
- this.rowNum = c.config.json.rowNum
- this.gap = c.config.json.gap
- this.animationSpeed = c.config.json.gap
- this.blockWidth = (730 - (this.rowNum + 1) * this.gap) / this.rowNum
- this.reviveTimer = null
- this.tutorialNode.active = false
- // this.isWeChat = this._controller.social.node.active
- this.shareSuccessDialog.active = false
- //console.log(this.gap)
- //console.log(this.blockWidth)
- },
- showBanner() {
- },
- // 动态获取需要动态控制的组件
- bindNode() {
- this.blocksContainer = this.node.getChildByName('map')
- },
- //---------------- 游戏控制 ---------------------
- // 游戏开始
- gameStart() {
- this.recoveryAllBlocks().then()
- this.shareBtn.active = true
- // if (this.isWeChat) {
- // this._controller.social.hasShared = false
- // }
- this._score.init(this)
- let data = [
- [1, 1, 1, 1, 1, 1, 1, 1],
- [1, 1, 1, 1, 1, 1, 1, 1],
- [4, 2, 3, 4, 2, 2, 3, 4]
- ]
- if (this.isFirstTime()) {
- this.mapSet(this.rowNum, data).then((result) => {
- this.showTutorial(this.map[1][4], '点击连续的区域生成炸弹鸭')
- this.tutorialProgress = 1
- this._status = 1
- })
- } else {
- this.mapSet(this.rowNum).then((result) => {
- this._status = 1
- })
- }
- },
- showTutorial(target, label) {
- this.tutorialNode.active = true
- this.tutorialNode.getChildByName('targetBtn').getChildByName('sqr').runAction(cc.repeatForever(cc.sequence(cc.scaleTo(0.3, 0.8), cc.scaleTo(0.3, 1.2))))
- this.tutorialNode.getChildByName('target').x = target.x
- this.tutorialNode.getChildByName('target').y = target.y
- this.tutorialNode.getChildByName('targetBtn').x = target.x
- this.tutorialNode.getChildByName('targetBtn').y = target.y
- this.tutorialNode.getChildByName('label').getChildByName('label').getComponent(cc.Label).string = label
- },
- closeTutorial() {
- this.tutorialNode.getChildByName('targetBtn').getChildByName('sqr').stopAllActions()
- // console.log('close Tutorial ')
- this.tutorialNode.active = false
- this._status = 1
- this.map[1][4].getComponent('cell').onTouched({
- type: 1
- }, false, false)
- if (this.tutorialProgress == 1) {
- setTimeout(() => {
- this.showTutorial(this.map[1][4], '点击炸弹消除所有同色方块哦')
- this.tutorialProgress = 2
- }, 1000)
- }
- },
- isFirstTime() {
- let isFirst = false
- if (this.isWeChat && !wx.getStorageSync('isFirst')) {
- wx.setStorageSync('isFirst', "1")
- isFirst = true
- } else if (!cc.sys.localStorage.getItem('isFirst')) {
- cc.sys.localStorage.setItem('isFirst', "1")
- isFirst = true
- }
- return isFirst
- },
- onItemShare() {
- // if (this.isWeChat) {
- // this._controller.social.onItemShareButton()
- // } else {
- this.fakeShareSuccess()
- // }
- },
- onItemAdv() {
- // TODO 广告 视频炸弹
- if (AppConst.SHOWADUI) {
- if (AppConst.CHANNEL == AppConst.channel.ANDROID) {
- ADSdk.pay(1, this);
- } else {
- ADSdk.showVideo(null, (result) => {
- if (result == 1) {
- this.fakeShareSuccess()
- }
- });
- }
- } else {
- this.fakeShareSuccess()
- }
- // this.fakeShareSuccess()
- // self._controller.scoreMgr.onLevelUpButton()
- },
- fakeShareSuccess() {
- this.shareBtn.active = false
- this.shareSuccessDialog.active = true
- // 2分钟后再次弹出 炸弹按钮
- this.scheduleOnce(() => {
- this.shareBtn.active = true;
- }, 120);
- },
- onCreateBomb() {
- let x = Math.floor(Math.random() * 8)
- let y = Math.floor(Math.random() * 8)
- this.shareSuccessDialog.active = false
- if(this.map[x][y].getComponent('cell')._itemType==0){
- this.map[x][y].getComponent('cell').changeItemType(2)
- }else{
- this.onCreateBomb()
- return
- }
- },
- /**
- * 初始化地图
- * @param {*} num
- * @param {*} data 传入颜色数组
- */
- mapSet(num, data) {
- this.map = new Array()
- let self = this
- // 生成两个随机的对象数组
- let a = Math.floor(Math.random() * num)
- let b = Math.floor(Math.random() * num)
- let c = Math.floor(1 + Math.random() * (num - 1)) - 1
- a == c ? c++ : ''
- let d = Math.floor(Math.random() * num)
- this.tutorialPos = [c, d]
- return new Promise((resolve, reject) => {
- for (let i = 0; i < num; i++) { //行
- this.map[i] = new Array()
- for (let j = 0; j < num; j++) { //列
- let itemType = (i == a && j == b) ? 1 : (i == c && j == d) ? (data ? 1 : 2) : 0
- self.map[i][j] = self.instantiateBlock(self, {
- x: j,
- y: i,
- color: (data && data[i]) ? data[i][j] : null,
- width: self.blockWidth,
- startTime: (i + j + 1) * self._controller.config.json.startAnimationTime / num * 2
- }, self.blocksContainer, itemType)
- }
- }
- this.checkMgr.init(this)
- setTimeout(() => {
- resolve('200 OK');
- this.checkMgr.check(this)
- }, self._controller.config.json.startAnimationTime * num / 2 / 1
- // (cc.game.getFrameRate() / 60)
- )
- })
- },
- //防抖动 判断是否需要检测下落
- checkNeedFall() {
- if (this.checkNeedFallTimer) {
- clearTimeout(this.checkNeedFallTimer)
- }
- this.checkNeedFallTimer = setTimeout(() => {
- if (this._status == 5) {
- this._status = 4
- this.onFall()
- }
- }, 300 / 1
- // (cc.game.getFrameRate() / 60)
- )
- },
- //方块下落
- onFall() {
- this.checkGenerateProp(this._score.chain).then(() => {
- let self = this
- let canFall = 0
- //从每一列的最下面一个开始往上判断
- //如果有空 就判断有几个空 然后让最上方的方块掉落下来
- for (let j = this.rowNum - 1; j >= 0; j--) {
- canFall = 0
- for (let i = this.rowNum - 1; i >= 0; i--) {
- if (this.map[i][j].getComponent('cell')._status == 2) {
- this.blockPool.put(this.map[i][j])
- this.map[i][j] = null
- canFall++
- } else {
- if (canFall != 0) {
- this.map[i + canFall][j] = this.map[i][j]
- this.map[i][j] = null
- this.map[i + canFall][j].getComponent('cell').playFallAction(canFall, {
- x: j,
- y: i + canFall,
- })
- }
- }
- }
- for (var k = 0; k < canFall; k++) {
- this.map[k][j] = this.instantiateBlock(this, {
- x: j,
- y: k,
- width: this.blockWidth,
- startTime: null
- }, this.blocksContainer, '', {
- x: j,
- y: -canFall + k
- })
- this.map[k][j].getComponent('cell').playFallAction(canFall, null)
- }
- }
- setTimeout(() => {
- this.checkMgr.init(this)
- this.checkMgr.check(this)
- this._status = 1
- }, 250)
- })
- },
- gameOver() {
- this._status = 3
- this._controller.pageMgr.addPage(2)
- this._controller.pageMgr.addPage(4)
- // 游戏结束 banner或者广告
- // if (this._controller.social.node.active) {
- // this._controller.social.closeBannerAdv()
- // }
- },
- // todo 复活
- askRevive() {
- this._controller.pageMgr.addPage(2)
- this._controller.pageMgr.addPage(5)
- this.revivePage.active = true
- this.revivePage.getChildByName('askRevive').active = true
- this.revivePage.getChildByName('successRevive').active = false
- this.rangeSprite = this.revivePage.getChildByName('askRevive').getChildByName('numBg').getChildByName('sprite').getComponent(cc.Sprite)
- this.rangeSprite.fillRange = 1
- this.isRangeAction = true
- let numLabel = this.revivePage.getChildByName('askRevive').getChildByName('numBg').getChildByName('num').getComponent(cc.Label)
- numLabel.string = 9
- if (this.reviveTimer) {
- clearInterval(this.reviveTimer)
- }
- this.reviveTimer = setInterval(() => {
- if (+numLabel.string > 0) {
- numLabel.string--
- this.rangeSprite.fillRange = 1
- } else {
- this.onSkipRevive()
- }
- }, 1000)
- },
- onReviveButton() {
- clearInterval(this.reviveTimer)
- this.isRangeAction = false
- // TODO 广告 视频复活
- if (AppConst.SHOWADUI) {
- if (AppConst.CHANNEL == AppConst.channel.ANDROID) {
- ADSdk.pay(2, this);
- } else {
- ADSdk.showVideo(null, (result) => {
- if (result == 1) {
- this.showReviveSuccess()
- }
- });
- }
- } else {
- this.showReviveSuccess()
- }
- // this.showReviveSuccess()
- // self._controller.game.onSkipRevive()
- },
- showReviveSuccess() {
- //console.log('打开复活成功页面')
- this.revivePage.getChildByName('askRevive').active = false
- this.revivePage.getChildByName('successRevive').active = true
- },
- onReviveCertainBtn() {
- this._controller.pageMgr.removePage(2)
- this.revivePage.active = false
- this._status = 1
- this._score.onRevive()
- },
- update() {
- if (this.isRangeAction) {
- this.rangeSprite.fillRange -= 1 / 60
- }
- },
- onSkipRevive() {
- clearInterval(this.reviveTimer)
- this._controller.pageMgr.pages[5].active = false
- this._score.onGameOver(true)
- this.isRangeAction = false
- },
- restart() {
- this._controller.pageMgr.onOpenPage(1)
- this.recoveryAllBlocks().then(() => {
- this.gameStart()
- })
- },
- // -----------------道具相关---------------
- // 储存用户点击时的方块 用于生成道具
- onUserTouched(iid, jid, itemType, color, warning, pos) {
- this.target = {
- i: iid,
- j: jid,
- color: color,
- itemType: itemType,
- x: pos.x,
- y: pos.y,
- warning: warning
- }
- },
- // 生成道具 type 1为双倍倍数 2为炸弹 3为加五百
- generatePropItem(type) {
- return new Promise((resolve, reject) => {
- // 是否做道具生成动画
- this.map[this.target.i][this.target.j] = this.instantiateBlock(this, {
- x: this.target.j,
- y: this.target.i,
- color: this.target.color,
- width: this.blockWidth,
- startTime: null
- }, this.blocksContainer, type)
- setTimeout(() => {
- resolve()
- }, 300)
- })
- },
- checkGenerateProp(chain) {
- return new Promise((resolve, reject) => {
- if (this.target && this.target.warning) {
- this.generatePropItem(this.target.warning).then(() => {
- resolve()
- return
- })
- }
- resolve()
- })
- },
- onItem(type, color, pos) {
- switch (type) {
- case 1:
- // 分数翻倍 最高八倍
- this._score.tipBox.init(this._score, 1)
- this._score.addMult(color, pos)
- this._controller.musicMgr.onDouble()
- for (let i = 0; i < this.rowNum; i++) { //行
- for (let j = 0; j < this.rowNum; j++) { //列
- if (this.map[i][j] && this.map[i][j].getComponent('cell')._status == 1) {
- let distance = Math.sqrt(Math.pow(pos.x - this.map[i][j].x, 2) + Math.pow(pos.y - this.map[i][j].y, 2))
- if (distance != 0) {
- this.map[i][j].getComponent('cell').surfaceAction(distance)
- }
- }
- }
- }
- break
- case 2:
- // 炸弹 消除同种颜色的
- this._score.tipBox.init(this._score, 2)
- this.node.runAction(AC.shackAction(0.1, 10))
- // 震动
- // if (this._controller.social.node.active) {
- // this._controller.social.onShakePhone()
- // }
- this.isPropChain = true
- this._controller.musicMgr.onBoom()
- for (let i = 0; i < this.rowNum; i++) { //行
- for (let j = 0; j < this.rowNum; j++) { //列
- if (this.map[i][j] && this.map[i][j].getComponent('cell').color == color && this.map[i][j] && this.map[i][j].getComponent('cell')._status != 2) {
- this.map[i][j].getComponent('cell').onTouched(color, false, true)
- } else {
- this.map[i][j].runAction(AC.rockAction(0.2, 10))
- }
- }
- }
- break
- case 3: //: 加步数
- this._score.tipBox.init(this._score, 4)
- this._controller.musicMgr.onDouble()
- for (let i = 0; i < this.rowNum; i++) { //行
- for (let j = 0; j < this.rowNum; j++) { //列
- if (this.map[i][j] && this.map[i][j].getComponent('cell')._status == 1) {
- let distance = Math.sqrt(Math.pow(pos.x - this.map[i][j].x, 2) + Math.pow(pos.y - this.map[i][j].y, 2))
- if (distance != 0) {
- this.map[i][j].getComponent('cell').surfaceAction(distance)
- }
- }
- }
- }
- this._score.onStep(3).then()
- break;
- case 4: // : 消除全部单身的方块
- this._score.tipBox.init(this._score, 5)
- this.isPropChain = true
- this._controller.musicMgr.onMagic()
- for (let i = 0; i < this.rowNum; i++) { //行
- for (let j = 0; j < this.rowNum; j++) { //列
- if (this.map[i][j] && this.map[i][j].getComponent('cell').isSingle && this.map[i][j] && this.map[i][j].getComponent('cell')._status != 2) {
- let distance = Math.sqrt(Math.pow(pos.x - this.map[i][j].x, 2) + Math.pow(pos.y - this.map[i][j].y, 2))
- this.map[i][j].getComponent('cell').onTouched(color, false, true, distance)
- // console.log("魔法棒触发的点", i, j, this.map[i][j].getComponent('cell').color, this.map[i][j].getComponent('cell').isSingle)
- }
- }
- }
- break;
- }
- },
- //--------------------- 预制体实例化---------------------
- // 生成对象池
- generatePool() {
- this.blockPool = new cc.NodePool()
- for (let i = 0; i < Math.pow(this.rowNum, 2); i++) {
- let block = cc.instantiate(this.blockPrefab)
- this.blockPool.put(block)
- }
- },
- // 实例化单个方块
- instantiateBlock(self, data, parent, itemType, pos) {
- itemType = itemType ? itemType : 0
- if (itemType != 0) {
- // console.log("道具节点数据", data, itemType)
- }
- let block = null
- if (self.blockPool && self.blockPool.size() > 0) {
- block = self.blockPool.get()
- } else {
- block = cc.instantiate(self.blockPrefab)
- }
- block.parent = parent
- block.scale = 1
- block.x = 0
- block.y = 0
- block.getComponent('cell').init(self, data, this.blockWidth, itemType, pos)
- return block
- },
- // 回收所有节点
- recoveryAllBlocks() {
- return new Promise((resolve, reject) => {
- let children = this.blocksContainer.children
- if (children.length != 0) {
- let length = children.length
- // console.log(length)
- for (let i = 0; i < length; i++) {
- this.blockPool.put(children[0])
- }
- for (let i = 0; i < this.rowNum; i++) {
- for (let j = 0; j < this.rowNum; j++) {
- this.map[i][j] = null
- }
- }
- }
- resolve('')
- })
- },
- });
|