123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- const Spawn = require('Spawn');
- cc.Class({
- extends: cc.Component,
- properties: {
- tipsFrames: [cc.SpriteFrame],
- bingoFrames: [cc.SpriteFrame],
- hitWrap: cc.Node,
- hitLabel: cc.Label,
- hitTips: cc.Node,
- hitDisX: 800,
- hitDisY: 280,
- hitInterval : 0.15,
- bottleHitMng: cc.Node, //对象池[Bottle]
- timer: cc.Label
- },
- init (game) {
- this.game = game;
- this.inGameUI = game.inGameUI;
- this.waveMng = game.waveMng;
- this.bottleHitMng = this.bottleHitMng.getComponent('BottleHitMng');
- this.bottleHitMng.init(this);
- this.touchInterval = 0;
- this.status = 0; //{0: 默认状态; 1: 开启必中瓶状态; 2: 必中瓶模式结束后2秒静止状态}
- },
-
- /**
- * 开始必中瓶模式
- */
- startHit (bottleType) {
- this.hitTips.active = true;
- this.hitLabel.node.active = true;
- this.hitLabel.getComponent(cc.Animation).play();
- this.hitList = [];
- this.frameId = 0;
- this.status = 1;
- this.hitTime = 30; //必中模式倒计时,持续3秒
- this.hitWrap.on(cc.Node.EventType.TOUCH_START, this.hitEvent, this)
- //设置必中瓶模式瓶身类型
- this.hitSprite = this.bingoFrames[bottleType];
- this.schedule(this.showHitTips, 0.2)
- this.scheduleOnce(() => {
- this.hitLabel.node.active = false;
- }, 1)
- //倒计时执行
- this.timer.node.active = true;
- this.timer.string = (this.hitTime / 10).toFixed(1) + 'S';
- this.timeCtrl = () => {
- if(this.hitTime == 0) {
- this.timer.node.active = false;
- this.endHit();
- this.unschedule(this.timeCtrl)
- } else {
- this.timer.string = (this.hitTime / 10).toFixed(1) + 'S';
- this.hitTime--;
- }
- }
- this.schedule(this.timeCtrl, 0.1)
- },
- showHitTips () {
- this.hitTips.getComponent(cc.Sprite).spriteFrame = this.tipsFrames[this.frameId]
- this.frameId = this.frameId == 0 ? 1 : 0;
- },
- hitEvent () {
- // 限制点击间隔
- if(this.touchInterval <= this.hitInterval) {
- return;
- } else {
- this.touchInterval = 0;
- let sp = new Spawn()
- sp.init({
- bottleType: 0,
- total: 1
- })
- let hb = sp.spawn(this.bottleHitMng)
- //显示对应瓶身尺寸的皮肤
- hb.children[1].getComponent(cc.Sprite).spriteFrame = this.hitSprite;
- if(this.hitList.length == 0) {
- this.hitList.unshift(hb)
- this.hitWrap.addChild(hb);
- hb.setPosition(-this.hitDisX, -this.hitDisY)
- let action = cc.moveTo(0.1, cc.p(0, -this.hitDisY))
- hb.runAction(action)
- this.scheduleOnce(() => {
- hb.getComponent(cc.Animation).play()
- }, 0.1)
- } else {
- this.hitList.unshift(hb)
- this.hitWrap.addChild(hb);
- hb.setPosition(-this.hitDisX, -this.hitDisY)
- let action1 = cc.moveTo(0.1, cc.p(0, -this.hitDisY))
- hb.runAction(action1)
- this.scheduleOnce(() => {
- hb.getComponent(cc.Animation).play()
- }, 0.1)
-
- let action2 = cc.moveTo(0.1, cc.p(this.hitDisX, -this.hitDisY))
- this.hitList[this.hitList.length - 1].runAction(action2)
- this.scheduleOnce(() => {
- let p = this.hitList.pop();
- p && this.bottleHitMng.returnBottle(0, p);
- }, 0.1)
- }
-
- this.inGameUI.addScore();
- }
- },
- /**
- * 结束必中瓶模式
- */
- endHit () {
- this.status = 2;
- //恢复游戏模式为华彩模式bingo
- this.game.gameMode = 'bingo';
-
- //重新生成新的波段内容
- this.waveMng.repeatWave();
-
- this.scheduleOnce(() => {
- //取消必中瓶模式事件监听
- this.hitWrap.off(cc.Node.EventType.TOUCH_START, this.hitEvent, this)
-
- //清除必中瓶模式的资源
- this.hitList.forEach(n => {
- let action = cc.moveTo(0.1, cc.p(this.hitDisX, -this.hitDisY))
- n.runAction(action)
- this.scheduleOnce(() => {
- this.bottleHitMng.returnBottle(0, n)
- }, 0.12)
- })
-
- //清除必中瓶UI提示
- this.unschedule(this.showHitTips);
- this.hitTips.active = false;
-
- //必中瓶模式结束后1.5秒内暂停发射箭矢
- this.scheduleOnce(() => {
- this.status = 0;
- }, 1.5)
- }, 0.1)
- },
- update (dt) {
- if(this.status == 1) {
- this.touchInterval += dt;
- }
- },
- });
|