123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- /**
- * @author uu
- * @file 单个方块控制
- */
- cc.Class({
- extends: cc.Component,
- properties: {
- _status: 0, //1为可触发点击 2为已经消失
- _itemType: 0, //新增道具功能 1为双倍倍数 2为炸弹
- warningSprite: cc.Sprite,
- lightSprite: cc.Sprite,
- },
- init(g, data, width, itemType, pos) {
- this._game = g
- this._status = 1
- if (pos) {
- //cc.log('生成的方块', pos)
- }
- pos = pos || {
- x: data.x,
- y: data.y
- }
- this._itemType = itemType || 0
- this.warningType = 0
- this.isPush = false
- this.bindEvent()
- this.color = data.color || Math.ceil(Math.random() * 4)
- this.colorSprite = this.node.getChildByName('color').getComponent(cc.Sprite)
- this.colorSprite.spriteFrame = itemType ? g.propSpriteFrame[(itemType - 1) * 4 + this.color - 1] : this._game.blockSprite[this.color - 1]
- this.warningSprite.spriteFrame = ''
- this._width = width
- this._controller = g._controller
- // 计算宽
- this.lightSprite.node.active = false
- // this.lightSprite.spriteFrame = this._game.blockSprite[this.color - 1]
- this.node.width = this.node.height = width
- this.startTime = data.startTime
- this.iid = data.y
- this.jid = data.x
- // console.log('生成方块位置', data.y, data.x)
- this.node.x = -(730 / 2 - g.gap - width / 2) + pos.x * (width + g.gap)
- this.node.y = (730 / 2 - g.gap - width / 2) - pos.y * (width + g.gap)
- this.node.rotation = 0
- this.playStartAction()
- },
- changeItemType(type){
- this._itemType=type
- this.colorSprite.spriteFrame = type ? this._game.propSpriteFrame[(type - 1) * 4 + this.color - 1] : this._game.blockSprite[this.color - 1]
- },
- onWarning(type) {
- this.warningSprite.spriteFrame = this._game.warningSpriteFrame[type - 1] || ''
- this.warningType = type
- // this.lightSprite.node.active = true
- let action1 = cc.blink(1, 10)
- // this.lightSprite.node.runAction(action1)
- },
- warningInit() {
- this.warningSprite.spriteFrame = ''
- // this.lightSprite.node.active = false
- this.isPush = false
- },
- growInit() {
- this.growType = 0
- this.colorSprite.node.height = this.colorSprite.node.width = this._width
- this.colorSprite.node.y = this.colorSprite.node.x = 0
- },
- grow(type) { //1234 上下左右
- switch (type) {
- case 1:
- if (this.growType != 2) {
- this.colorSprite.node.height += this._game.gap * 2
- this.colorSprite.node.y += this._game.gap
- this.growType = 1
- }
- break
- case 2:
- if (this.growType != 2) {
- this.colorSprite.node.height += this._game.gap * 2
- this.colorSprite.node.y -= this._game.gap
- this.growType = 1
- }
- break
- case 3:
- if (this.growType != 1) {
- this.colorSprite.node.width += this._game.gap * 2
- this.colorSprite.node.x -= this._game.gap
- this.growType = 2
- }
- break
- case 4:
- if (this.growType != 1) {
- this.colorSprite.node.width += this._game.gap * 2
- this.colorSprite.node.x += this._game.gap
- this.growType = 2
- }
- break
- }
- },
- bindEvent() {
- this.node.on(cc.Node.EventType.TOUCH_START, this.onTouched, this)
- },
- // 用户点击 或者被其他方块触发
- onTouched(color, isChain, isBomb, time) { //道具新增参数 isChain是否连锁 isBomb是否强制消除
- if (time) {
- setTimeout(() => {
- this.onTouched(color, false, isBomb)
- }, time)
- return
- }
- isChain = JSON.stringify(isChain) == 'null' ? true : isChain
- isBomb = isBomb ? isBomb : false
- color=color||this.color
- let self = this
- // 爆炸触发
- if (this._status == 1 && isBomb == true) {
- this._status = 2
- this.playDieAction().then(() => {
- this.onBlockPop(color, isChain, isBomb)
- })
- return
- }
- if (color.type) {
- // 一定是用户主动触发 保存这个坐标给game
- if (this.isSingle && this._itemType <= 1) {
- this.node.scale = 1
- this._game._score.tipBox.init(this._game._score, 3)
- let action1 = cc.scaleTo(0.1, 1.1, 0.9)
- let action2 = cc.scaleTo(0.3, 1).easing(cc.easeBackOut(2.0))
- let action = cc.sequence(action1, action2)
- this.node.runAction(action)
- return
- }
- // console.log('方块位置', this.iid, this.jid, this._itemType)
- color = this.color
- if (this._status == 1 && this._game._status == 1 && this.color == color) {
- this._game.onUserTouched(this.iid, this.jid, this._itemType, this.color, this.warningType, {
- x: this.node.x,
- y: this.node.y
- })
- this._game._score.onStep(-1).then((res) => {
- if (res) {
- this.playDieAction().then(() => {
- this.onBlockPop(color, null, null)
- })
- }
- })
- }
- } else {
- // 由其他方块触发
- if (this._status == 1 && this._game._status == 5 && this.color == color) {
- this.playDieAction().then(() => {
- this.onBlockPop(color, null, null)
- })
- }
- }
- },
- onBlockPop(color, isChain, isBomb) {
- let self = this
- isChain = JSON.stringify(isChain) == 'null' ? true : isChain
- isBomb = isBomb ? isBomb : false
- self._game.checkNeedFall()
- self._game._status = 5
- self._controller.musicMgr.onPlayAudio(0
- //self._game._score.chain - 1
- )
- if (this._itemType != 0) {
- // console.log("触发了道具", this._itemType)
- self._game.onItem(this._itemType, this.color, {
- x: this.node.x,
- y: this.node.y
- })
- }
- self._game._score.addScore(cc.v2(this.node.x, this.node.y - this.node.width + this._game.gap), this._itemType == 3 ? this._game._controller.config.json.propConfig[2].score : null)
- // 连锁状态
- if (isChain) {
- if ((self.iid - 1) >= 0) {
- self._game.map[self.iid - 1][self.jid].getComponent('cell').onTouched(color)
- }
- if ((self.iid + 1) < this._game.rowNum) {
- self._game.map[self.iid + 1][self.jid].getComponent('cell').onTouched(color)
- }
- if ((self.jid - 1) >= 0) {
- self._game.map[self.iid][self.jid - 1].getComponent('cell').onTouched(color)
- }
- if ((self.jid + 1) < this._game.rowNum) {
- self._game.map[self.iid][self.jid + 1].getComponent('cell').onTouched(color)
- }
- }
- },
- playFallAction(y, data) { //下降了几个格子
- this._status = 0
- if (data) {
- this.iid = data.y
- this.jid = data.x
- }
- let action = cc.moveBy(0.25, 0, -y * (this._game.gap + this._game.blockWidth)).easing(cc.easeBounceOut(5 / y)) //1 * y / this._game.animationSpeed
- let seq = cc.sequence(action, cc.callFunc(() => {
- this._status = 1
- // this._game.checkNeedGenerator()
- }, this))
- this.node.runAction(seq)
- },
- playStartAction() {
- this.node.scaleX = 0
- this.node.scaleY = 0
- let action = cc.scaleTo(0.8 / this._game.animationSpeed, 1, 1).easing(cc.easeBackOut())
- let seq = cc.sequence(action, cc.callFunc(() => {
- this._status = 1
- }, this))
- // 如果有延迟时间就用延迟时间
- if (this.startTime) {
- setTimeout(() => {
- this.node.runAction(seq)
- }, this.startTime / 1
- // (cc.game.getFrameRate() / 60)
- )
- } else {
- this.node.runAction(seq)
- }
- },
- playDieAction() {
- let self = this
- clearTimeout(this.surfaceTimer)
- this.node.stopAllActions()
- this._status = 2
- this.node.scaleX = 1
- this.node.scaleY = 1
- return new Promise((resolve, reject) => {
- let action
- if (this.warningSprite.spriteFrame) { //有道具预警
- let action1 = cc.scaleTo(0.2 / self._game.animationSpeed, 1.1)
- let action2 = cc.moveTo(0.2 / self._game.animationSpeed, this._game.target.x, this._game.target.y)
- let action3 = cc.scaleTo(0.2, 0)
- var seq = cc.sequence(action1, cc.callFunc(() => {
- resolve('')
- }, this), cc.spawn(action2, action3))
- } else {
- action = cc.scaleTo(0.2 / self._game.animationSpeed, 0, 0)
- var seq = cc.sequence(action, cc.callFunc(() => {
- resolve('')
- }, this))
- }
- self.node.runAction(seq)
- });
- },
- surfaceAction(dela) {
- this.surfaceTimer = setTimeout(() => {
- let action = cc.scaleTo(0.4 / this._game.animationSpeed, 0.8, 0.8)
- let action1 = cc.scaleTo(0.4 / this._game.animationSpeed, 1, 1)
- this.node.runAction(cc.sequence(action, action1))
- }, dela)
- },
- generatePropAction() {
- },
- generateItem(type) {
- this._itemType = type
- },
- });
|