sweet/assets/scriptes/gameCookie.js
zhl c0c3122c9f 1. 增加锤子敲不碎的多语言支持;
2. 移除商店实物列表无法获取数据的提示;
3. 修正android平台失败界面没有播放视频的问题
2020-08-07 11:51:56 +08:00

726 lines
22 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

let Config = require('config');
let Global = require('global');
let Res = require('res');
let Util = require('util');
cc.Class({
extends: cc.Component,
properties: {
aniFace: cc.Animation,
aniWeep: cc.Animation,
aniBubble: cc.Animation,
aniExplode: cc.Animation,
aniItem: cc.Animation,
prefabScore: [cc.Prefab],
prefabSpecialScore: cc.Prefab,
redPack: cc.Node,
cubeNd: cc.Node,
},
onLoad() {
},
onDestroy() {
},
setPosX(x) {
this.node.x = x;
if (this.shader) {
this.shader.x = x;
}
},
onTouchStart(event) {
if (!this.panel.isCanTouch || this.panel.gameScene.isSeeOther) {
return;
}
if (this.panel.crazyMode) {
return;
}
// if (this.typeNum === 2) {
// console.log('flash brick clicked');
// this.panel.removeOneRow(this);
// } else {
if (this.panel.onMove) {
this.canMoveing = false;
return;
} else {
this.canMoveing = true;
}
// this.panel.unschedule(this.panel.set_face_wait)
// this.panel.scheduleOnce(this.panel.set_face_wait,Config.blank_wait_time);
if (this.panel.useItemIndex !== -1) {
return;
}
this.panel.onMove = true;
this.copyObj();
this.showShader();
// }
},
onTouchMove(event) {
if (!this.panel.isCanTouch) {
return;
}
if (this.panel.gameScene.isSeeOther) {
return;
}
if (this.panel.useItemIndex !== -1) {
return;
}
if (this.panel.crazyMode || this.isActing) {
return;
}
if (!this.canMoveing) {
return;
}
let touch = event.touch;
let startPoint = touch.getStartLocation();
let curPoint = touch.getLocation();
this.setPosX(this.oldX + (curPoint.x - startPoint.x));
let myLeft = this.node.x - Config.singleSize * this.gridNum / 2;
let myRight = this.node.x + Config.singleSize * this.gridNum / 2;
let leftCookie = null;
let rightCookie = null;
let container = this.panel.container;
let curColumns = container[container.length - this.row - 1];
if (curColumns && curColumns.length > 0) {
curColumns.sort(function (a, b) {
return a.column - b.column;
})
}
for (let i = 0; i < curColumns.length; i++) {
if (curColumns[i].column === this.column) {
if (i - 1 >= 0) {
leftCookie = curColumns[i - 1];
}
if (i + 1 < curColumns.length) {
rightCookie = curColumns[i + 1];
}
break;
}
}
let leftBorder = 0;
let rightBorder = this.parentWidth;
if (leftCookie) {
leftBorder = leftCookie.node.x + Config.singleSize * leftCookie.gridNum / 2;
}
if (rightCookie) {
rightBorder = rightCookie.node.x - Config.singleSize * rightCookie.gridNum / 2
}
//超出边界不动
if (myLeft < leftBorder) {
this.setPosX(leftBorder + Config.singleSize * this.gridNum / 2);
return;
} else if (myRight > rightBorder) {
this.setPosX(rightBorder - Config.singleSize * this.gridNum / 2);
return;
}
if (myLeft % Config.singleSize <= Config.singleSize * Config.absort_rate) {
//贴左边
this.setPosX(Math.floor(myLeft / Config.singleSize) * Config.singleSize + Config.singleSize * this.gridNum / 2);
} else if (myRight % Config.singleSize >= Config.singleSize * (1 - Config.absort_rate)) {
//贴右边
this.setPosX(Math.ceil(myLeft / Config.singleSize) * Config.singleSize + Config.singleSize * this.gridNum / 2);
}
},
onTouchEnd(event) {
if (!this.panel.isCanTouch) {
return;
}
if (this.panel.gameScene.isSeeOther) {
return;
}
if (this.panel.crazyMode) {
//this.isActing || this.crazyHit();
return;
}
if (this.panel.useItemIndex !== -1) {
this.useItem(this.panel.useItemIndex);
return;
}
if (!this.canMoveing) {
return;
}
this.panel.onMove = false;
let self = this;
this.destroyCopy();
let oldColumn = this.column;
this.setPosX(Math.round((this.node.x - Config.singleSize * this.gridNum / 2) / Config.singleSize) * Config.singleSize + Config.singleSize * this.gridNum / 2);
this.updateColumn();
this.hideShader();
if (this.column !== oldColumn) {
this.panel.isCanTouch = false;
this.panel.step(function () {
if (self && self.panel) {
if (!Global.getHelpStatus(6)) {
self.panel.showCakeHelp();
}
self.panel.operationCallback();
if (!self.node.active) {
self.node.destroy();
}
self.panel.checkLevelUp();
}
});
}
},
onTouchCancel(event) {
this.onTouchEnd(event);
},
updateColumn() {
this.column = Math.floor((this.node.x - Config.singleSize * this.gridNum / 2) / Config.singleSize);
this.oldX = this.column * Config.singleSize + Config.singleSize * this.gridNum / 2;
},
// start () {
// },
initUI() {
this.typeNum = 0;//是否是巧克力
this.hasRedPack = false; // 是否含有红包
this.gridNum = 1;//占格子数
this.colorType = 1;//颜色1-4
this.spr = this.getComponent(cc.Sprite);
this.column = 0;//从左往右0开始的格子位置
this.row = 0;//从下往上数的行数
this.oldX = 0;
this.parentWidth = this.node.parent.width;
this.panel = this.node.parent.parent.getComponent('gamePanel');
this.copy = null;
this.shader = null;
this.aniFace.node.active = false;
this.aniItem.node.active = false;
this.aniWeep.node.active = false;
this.aniBubble.node.active = false;
this.aniExplode.node.active = false;
},
/**
* gridNum 方块占的格自数量
* column: 方块所在的列
* typeNum: 特殊方块标记位:
* 0: 普通方块
* 1: 巧克力方块
* 2: 删除一行的方块
* 100+: 食材方块
* hasRedPack: 是否含有红包
* hasCube: 是否有宝箱
* eventData: 一些额外的参数
* y: 方块所在行数
* color: 方块的颜色
*
* */
initData({gridNum, column, eventData, hasRedPack, typeNum, hasCube}) {
this.typeNum = typeNum || 0;
this.hasRedPack = hasRedPack || false;
this.hasCube = hasCube || false;
this.gridNum = (this.typeNum >= 1) ? 1 : gridNum;
this.redPack.active = this.hasRedPack;
this.cubeNd.active = this.hasCube;
if (eventData && eventData.color !== undefined) {
this.colorType = eventData.color || 1;
} else {
this.colorType = Util.getRandom(Config.color_num + 1, 1);
if (isNaN(this.colorType)) this.colorType = 1;
}
this.column = column;
this.score = 1;
let url = '';
if (this.typeNum === 1) { // 巧克力方块
url = '' + this.gridNum + '_bomb';
this.spr.spriteFrame = Res.getSpriteFrame(url, true);
Res.initSpecialBubbleAniWithGridNum(this.aniBubble, this.gridNum);
Res.initSpecialBubbleAniWithGridNum(this.aniExplode, this.gridNum);
Res.initSpecialFaceAniWithGridNum(this.aniFace, this.gridNum);
Res.initSpecialFaceAniWithGridNum(this.aniWeep, this.gridNum);
} else {
if (this.typeNum === 2) { // 消除一行的道具
url = `1_flash`;
} else if (this.typeNum >= 100) {
for (let cookie of Config.cookies) {
if (cookie.id === this.typeNum) {
url = cookie.icon;
break;
}
}
}else { // 普通方块
url = `${this.gridNum}_${this.colorType}`
}
url = url || `${this.gridNum}_${this.colorType}`;
this.spr.spriteFrame = Res.getSpriteFrame(url, true);
Res.initBubbleAniWithGridNum(this.aniBubble, this.gridNum);
Res.initBubbleAniWithGridNum(this.aniExplode, this.gridNum);
Res.initFaceAniWithGridNum(this.aniFace, this.gridNum);
Res.initFaceAniWithGridNum(this.aniWeep, this.gridNum);
}
Res.initExtraAni(this.aniBubble);
Res.initExtraAni(this.aniExplode);
Res.initItemAni(this.aniItem);
this.node.setContentSize(Config.singleSize * this.gridNum, Config.singleSize);
this.aniItem.node.setContentSize(Config.singleSize * 0.6, Config.singleSize * 0.6);
this.aniFace.node.setContentSize(Config.singleSize * this.gridNum * 0.6, Config.singleSize * 0.6);
this.aniWeep.node.setContentSize(Config.singleSize * this.gridNum * 0.6, Config.singleSize * 0.6);
this.aniBubble.node.setContentSize(Config.singleSize * this.gridNum, Config.singleSize);
this.aniExplode.node.setContentSize(Config.singleSize * this.gridNum, Config.singleSize);
this.node.x = this.column * Config.singleSize + Config.singleSize * this.gridNum / 2;
this.oldX = this.node.x;
if (eventData && eventData.y !== undefined) {
this.row = eventData.y;
this.node.y = Config.singleSize * this.row + Config.singleSize / 2;
} else {
this.node.y = Config.singleSize / 2;
}
this.aniFace.on('stop', this.onStop, this);
this.aniWeep.on('stop', this.onWeepStop, this);
this.aniBubble.on('stop', this.onBubbleStop, this);
this.aniExplode.on('stop', this.onExplodeStop, this);
this.aniItem.on('stop', this.onItemAniStop, this);
this.isMyPanel = this.panel.isMyPanel;
this.node.on(cc.Node.EventType.TOUCH_START, this.onTouchStart, this);
this.node.on(cc.Node.EventType.TOUCH_MOVE, this.onTouchMove, this);
this.node.on(cc.Node.EventType.TOUCH_END, this.onTouchEnd, this);
this.node.on(cc.Node.EventType.TOUCH_CANCEL, this.onTouchCancel, this);
},
playAct(act) {
let state = this.aniWeep.getAnimationState('blank');
if (state && state.isPlaying) {
//nothing
} else {
if (act === 'blank') {
this.aniWeep.node.active = true;
this.aniWeep.play(act);
} else {
this.aniFace.node.active = true;
this.aniFace.play(act);
}
}
},
playBubble(act) {
if (act === 'explode') {
this.aniExplode.node.active = true;
this.aniExplode.play(act);
} else {
this.aniBubble.node.active = true;
this.aniBubble.play(act);
}
},
playItemAni(act) {
this.aniItem.node.active = true;
this.aniItem.play(act);
},
// 播放动画结束,并消除该方块
onWeepStop(eventType, state) {
if (!this.aniWeep || (this.aniWeep && !this.aniWeep.isValid)) {
return;
}
this.aniWeep.node.active = false;
this.shake();
},
onItemAniStop(eventType, state) {
// this.aniItem.node.active = false;
},
onStop(eventType, state) {
if (!this.aniFace || (this.aniFace && !this.aniFace.isValid)) {
return;
}
this.aniFace.node.active = false;
},
onExplodeStop(eventType, state) {
if (!this.aniExplode || (this.aniExplode && !this.aniExplode.isValid)) {
return;
}
if (state.name === 'explode') {
this.aniExplode.node.active = false;
if (this.typeNum === 1 || this.chocolate) {
this.node.active = false;
this.node.parent = null;
}
}
},
onBubbleStop(eventType, state) {
if (!this.aniBubble || (this.aniBubble && !this.aniBubble.isValid)) {
return;
}
this.playBubble('explode');
},
//下落N格
descend() {
let oldRow = this.row;
for (let i = 0; i < this.panel.container.length; i++) {
let rows = this.panel.container[i];
for (let j = 0; j < rows.length; j++) {
if (rows[j] === this) {
this.row = this.panel.container.length - i - 1;
this.node.runAction(cc.moveBy(Config.descend_time, cc.v2(0, -Config.singleSize * (oldRow - this.row))).easing(cc.easeCircleActionIn()));
return;
}
}
}
},
//上升一格
upper() {
this.row++;
this.node.runAction(cc.moveBy(Config.rise_time, cc.v2(0, Config.singleSize)).easing(cc.easeCircleActionOut()));
},
//抖动
shake() {
let self = this;
let moveTime = Config.remove_time / (3 * 3);
let offsetX = Config.singleSize / 4;
let x = this.node.x;
let y = this.node.y;
let act = cc.repeat(cc.sequence([cc.moveTo(moveTime, cc.v2(x - offsetX, y)), cc.moveTo(moveTime, cc.v2(x + offsetX, y)), cc.moveTo(moveTime, cc.v2(x, y))]), 3);
if (this.typeNum === 1 || this.chocolate) {
this.node.runAction(act);
} else {
this.node.runAction(cc.sequence(act, cc.callFunc(function () {
self.node.active = false;
self.node.parent = null;
})));
}
},
addScore() {
let self = this;
let nodeScore = null;
let lblScore = null;
if (this.typeNum === 1) {
nodeScore = cc.instantiate(this.prefabSpecialScore);
lblScore = nodeScore.getComponent(cc.Label);
} else {
//黄色字体的font错的所以暂时去掉
let fontColor = 0;
fontColor = Util.getRandom(2, 1);
nodeScore = cc.instantiate(this.prefabScore[fontColor]);
lblScore = nodeScore.getComponent(cc.Label);
}
this.panel.content.addChild(nodeScore);
nodeScore.x = this.node.x;
nodeScore.y = this.node.y;
lblScore.string = '' + this.score;
lblScore.node.runAction(cc.sequence(cc.moveBy(Config.square_score_time, cc.v2(0, Config.singleSize)), cc.callFunc(function () {
nodeScore.destroy();
// 20190710 播放完后销毁当前node已解决偶尔出现的砖块无法消除的bug和可能引起内存溢出的问题
// if (self.node) {
// self.node.active = false;
// }
})));
if (this.isMyPanel) {
this.panel.gameScene.addScore(this.score);
} else {
this.panel.addScore(this.score);
}
},
//copy一份放原地
copyObj() {
let brick = cc.instantiate(this.node);
this.panel.content.addChild(brick);
this.copy = brick.getComponent('gameCookie');
this.copy.initUI();
brick.opacity = 255 * Config.copy_alpha;
brick.targetOff(this.copy);
},
destroyCopy() {
if (this.copy) {
this.copy.node.destroy();
this.copy = null;
}
},
showShader() {
this.shader = this.panel.nodeShader;
this.shader.active = true;
this.shader.x = this.node.x;
this.shader.y = this.node.y;
this.shader.width = this.node.width;
this.shader.height = this.panel.node.height * 2;
},
hideShader() {
if (this.shader) {
this.shader.active = false;
this.shader = null;
}
},
useItem(index, isEvent) {
if (index === 0) {
this.useItemEat(isEvent);
} else if (index === 1) {
this.useItemHammer(isEvent);
} else if (index === 2) {
this.useItemSauce(isEvent);
}
},
eatItem() {
let self = this;
let score_rate = this.panel.get_score_rate(1);
let score;
let remaining_count = 1;
let check_finish = function () {
if (--remaining_count === 0) {
self.panel.settle();
self.panel.isCanEvent = true;
self.panel.useItemIndex = -1;
self.panel.checkLevelUp();
}
};
if (this.typeNum === 1) {//巧克力方块
let curIndex = 0;
let curRow = this.panel.container.length - this.row - 1;
for (let i = 0; i < this.panel.container[curRow].length; i++) {
if (this.panel.container[curRow][i] === this) {
curIndex = i;
break;
}
}
this.panel.container[curRow].splice(curIndex, 1);
let exploded_objs = [];
let is_exploded = [];
for (let i = 0; i < this.panel.container.length; ++i) {
is_exploded.push({});
}
score = this.panel.count_exploded([], exploded_objs, is_exploded, this, curRow);
this.score = this.gridNum * score_rate * 2;
this.panel.exploded_eliminate(exploded_objs, () => {
self.panel.score_process(exploded_objs, score, () => {
check_finish();
});
});
} else {//材料
let objRemove = [];
for (let i = 0; i < this.panel.container.length; i++) {
let subRemain = [];
let bricks = this.panel.container[i];
for (let j = bricks.length - 1; j >= 0; j--) {
if ((bricks[j].typeNum === this.typeNum && bricks[j].typeNum > 1 && this.typeNum > 1)
|| (bricks[j].colorType === this.colorType && bricks[j].typeNum === 0 && this.typeNum === 0)
) {
bricks[j].score = bricks[j].gridNum * score_rate
objRemove.push(this.panel.container[i][j]);
bricks.splice(j, 1);
}
}
}
this.score = this.gridNum * score_rate;
score = this.score;
this.panel.normal_eliminate(objRemove, [], score, check_finish);
}
} ,
//道具吃方块
useItemEat(isEvent) {
// if (!Global.getHelpStatus(6)) {
// Global.updateHelpStatus(6);
// cc.EffectMgr.hideFingerEffect();
// }
this.panel.gameScene.nodeUserItem.active = false;
if (!isEvent) {
cc.jc.gamelog.logUseItem(1, 1, '', '');
if (this.panel.gameScene.levelItems[0] > 0) {
this.panel.gameScene.levelItems[0] = 0;
} else {
Global.item[0]--;
Global.saveItem();
}
this.panel.gameScene.updateItemBtnState();
if (this.isMyPanel) {
cc.SoundMgr.playSound(cc.SoundMgr['item_eat']);
}
}
this.panel.isCanTouch = false;
if (this.typeNum === 1) {
this.playItemAni('eat');
} else if (this.typeNum > 1) {
for (let i = 0; i < this.panel.container.length; i++) {
for (let j = 0; j < this.panel.container[i].length; j++) {
if (this.panel.container[i][j].typeNum === this.typeNum) {
this.panel.container[i][j].playItemAni('eat');
}
}
}
} else {
for (let i = 0; i < this.panel.container.length; i++) {
for (let j = 0; j < this.panel.container[i].length; j++) {
if (this.panel.container[i][j].colorType === this.colorType && this.panel.container[i][j].typeNum === 0) {
this.panel.container[i][j].playItemAni('eat');
}
}
}
}
let self = this;
this.scheduleOnce(function () {
self.eatItem();
}, 1);
},
//道具巧克力酱
useItemSauce(isEvent) {
if (this.typeNum === 1) {
return;
}
this.panel.gameScene.nodeUserItem.active = false;
if (!isEvent) {
cc.jc.gamelog.logUseItem(3, 1, '', '');
Global.item[2]--;
Global.saveItem();
this.panel.gameScene.updateItemBtnState();
if (this.isMyPanel) {
cc.SoundMgr.playSound(cc.SoundMgr['item_chocolate']);
}
} else {
this.panel.isCanEvent = true;
}
this.panel.useItemIndex = -1;
this.typeNum = 1;
let url = '' + this.gridNum + '_bomb';
this.spr.spriteFrame = Res.getSpriteFrame(url, true);
Res.initSpecialBubbleAniWithGridNum(this.aniBubble, this.gridNum);
Res.initSpecialBubbleAniWithGridNum(this.aniExplode, this.gridNum);
let clips = this.aniFace.getClips();
for (let i = 0; i < clips.length; i++) {
this.aniFace.removeClip(clips[i], true);
}
clips = this.aniWeep.getClips();
for (let i = 0; i < clips.length; i++) {
this.aniWeep.removeClip(clips[i], true);
}
Res.initSpecialFaceAniWithGridNum(this.aniFace, this.gridNum);
Res.initSpecialFaceAniWithGridNum(this.aniWeep, this.gridNum);
},
//道具敲方块
useItemHammer(isEvent) {
if (this.gridNum === 1) {
Util.showTips(this.panel.gameScene.node, cc.i18n.t('tips.no_beat'));
return;
}
// if (!Global.getHelpStatus(5)) {
// Global.updateHelpStatus(5);
// cc.EffectMgr.hideFingerEffect();
// }
this.panel.gameScene.nodeUserItem.active = false;
if (!isEvent) {
cc.jc.gamelog.logUseItem(2, 1, '', '');
if (this.panel.gameScene.levelItems[1] > 0) {
this.panel.gameScene.levelItems[1] = 0;
} else {
Global.item[1]--;
Global.saveItem();
}
this.panel.gameScene.updateItemBtnState();
if (this.isMyPanel) {
cc.SoundMgr.playSound(cc.SoundMgr['item_hammer']);
}
}
this.panel.breakAllBrick();
},
// 疯狂模式敲方块
crazyHit() {
this.isActing = true;
this.playItemAni('hammer');
this.scheduleOnce(this.removeSelf, 1);
},
removeSelf() {
let self = this;
cc.jc.gameVibrateLong();
let score_rate = this.panel.get_score_rate(1);
if (this.typeNum === 1) {
let curIndex = 0;
let curRow = this.panel.container.length - this.row - 1;
for (let i = 0; i < this.panel.container[curRow].length; i++) {
if (this.panel.container[curRow][i] === this) {
curIndex = i;
break;
}
}
this.panel.container[curRow].splice(curIndex, 1);
let exploded_objs = [];
let is_exploded = [];
for (let i = 0; i < this.panel.container.length; ++i) {
is_exploded.push({});
}
let score = this.panel.count_exploded([], exploded_objs, is_exploded, this, curRow);
this.score = this.gridNum * score_rate * 2;
for (let obj of exploded_objs) {
obj.isActing = true;
}
this.panel.exploded_eliminate(exploded_objs, () => {
self.panel.score_process(exploded_objs, this.score, () => {
if (!self.panel.crazyMode) {
self.panel.settle(function(){
self.panel.checkLevelUp();
});
}
});
});
} else {
let curIndex = 0;
let curRow = this.panel.container.length - this.row - 1;
for (let i = 0; i < this.panel.container[curRow].length; i++) {
if (this.panel.container[curRow][i] === this) {
curIndex = i;
break;
}
}
this.panel.container[curRow].splice(curIndex, 1);
this.score = this.gridNum * score_rate * 2;
this.panel.normal_eliminate([this], [], this.score, function(){
if (!self.panel.crazyMode) {
self.panel.settle(function(){
self.panel.checkLevelUp();
});
}
});
}
},
EventMoveTo(toX) {
let self = this;
this.column = toX;
this.node.x = this.column * Config.singleSize + Config.singleSize * this.gridNum / 2;
this.panel.step(function () {
if (self && self.panel) {
if (self && self.panel) {
self.panel.isCanEvent = true;
self.panel.operationCallback();
if (!self.node.active) {
self.node.destroy();
}
}
}
});
},
EventUseItem(index) {
this.useItem(index, true);
}
// update (dt) {},
});