let Config = require('config'); let Promise = require('ZPromise'); cc.Class({ extends: cc.Component, properties: { effectPanel: cc.Node, starEffectPreb: cc.Prefab, boxEffectPreb: cc.Prefab, circleEffectPreb: cc.Prefab, lineEffectPreb: cc.Prefab, recordEffectPreb: cc.Prefab, fireworkPreb: cc.Prefab, fingerPreb: cc.Prefab, alertPanel: cc.Node, scoreEffectPreb: cc.Prefab, cookieEffectPreb: cc.Prefab, }, // LIFE-CYCLE CALLBACKS: onLoad () { cc.EffectMgr = this; this.starPool = new cc.NodePool(); let initCount = 5; // for (let i = 0; i < initCount; ++i) { // let star = cc.instantiate(this.starEffectPreb); // this.starPool.put(star); // } this.scorePool = []; for (let i = 0; i < initCount; ++i) { let scoreNd = cc.instantiate(this.scoreEffectPreb); scoreNd.active = false; this.effectPanel.addChild(scoreNd); this.scorePool.push(scoreNd); } this.cookiePool = new cc.NodePool(); // for (let i = 0; i < initCount; ++i) { // let star = cc.instantiate(this.cookieEffectPreb); // this.cookiePool.put(star); // } this.linePool = new cc.NodePool(); for (let i = 0; i < initCount; ++i) { this.linePool.put(cc.instantiate(this.lineEffectPreb)); } }, init(owner) { this.owner = owner; }, start () { cc.loader.loadRes() }, // 行消除额外的粒子动画 showLineEffect(nd) { let size = nd.getContentSize(); let position = nd.position; position.x = position.x + (0.5 - nd.anchorX) * size.width; position.y = position.y + (0.5 - nd.anchorY) * size.height; let posW = nd.parent.convertToWorldSpaceAR(position); let pos = this.effectPanel.convertToNodeSpaceAR(posW); let effect = null; if (this.linePool.size() > 0) { effect = this.linePool.get(); } else { effect = cc.instantiate(this.lineEffectPreb); } this.effectPanel.addChild(effect); effect.position = pos; let self = this; this.scheduleOnce(function () { effect.parent = null; self.linePool.put(effect); }, 1) }, // 局内道具收集动画 showStarCollect(worldPos, targetNode) { return new Promise((resolve, reject) => { this.effectPanel.zIndex = 150; let star = this.createStar(this.effectPanel); let sourcePos = this.effectPanel.convertToNodeSpaceAR(worldPos); // let targetPos = cc.v2(-263, 425); let targetPosW = targetNode.parent.convertToWorldSpaceAR(targetNode.position); let targetPos = this.effectPanel.convertToNodeSpaceAR(targetPosW); let centerPos = cc.v2(targetPos.x + (sourcePos.x - targetPos.x) / 2, targetPos.y + (sourcePos.y - targetPos.y) / 2); if (sourcePos.x < 0) { centerPos.x = targetPos.x + (centerPos.x - targetPos.x) / 2; centerPos.y = centerPos.y - (targetPos.y - centerPos.y) / 2; } else { centerPos.x = centerPos.x + (centerPos.x - targetPos.x) / 2; centerPos.y = centerPos.y + (targetPos.y - centerPos.y) / 2; } let linePos = [sourcePos, centerPos, targetPos]; console.log(linePos); star.position = sourcePos; star.getComponent(cc.ParticleSystem).resetSystem(); star.active = true; let actionTime = Config.star_collect_fly_time; // 道具飞行到目标后的回调 let startCollected = function(obj, pos) { console.log('star collected'); obj.parent = null; this.starPool.put(obj); resolve(); }; let action = cc.sequence(cc.bezierTo(actionTime, linePos), cc.callFunc(startCollected, this, targetPos)); star.runAction(action).easing(cc.easeElasticOut(actionTime)); }) }, // 获取一个道具飞行动画的实例 createStar: function (parentNode) { let star = null; if (this.starPool.size() > 0) { star = this.starPool.get(); } else { star = cc.instantiate(this.starEffectPreb); } parentNode.addChild(star); // star.parent = parentNode; return star; }, // 局内道具收集箱子闪光动画 createBoxEffect: function (pos) { if (!this.boxEffect) { this.boxEffect = cc.instantiate(this.boxEffectPreb); this.effectPanel.addChild(this.boxEffect); this.boxEffect.position = pos; } this.boxEffect.getComponent(cc.ParticleSystem).resetSystem(); this.boxEffect.active = true; }, // 圆圈提示动画 createCircleEffect: function (node) { let wpos = node.parent.convertToWorldSpaceAR(node.position); let myPos = this.effectPanel.convertToNodeSpaceAR(wpos); if (!this.circleEffect) { this.circleEffect = cc.instantiate(this.circleEffectPreb); this.effectPanel.addChild(this.circleEffect); } this.circleEffect.getComponent(cc.ParticleSystem).resetSystem(); this.circleEffect.position = myPos; }, // 隐藏圆圈提示动画 hideCircleEffect: function() { (this.circleEffect) && (this.circleEffect.active = false); }, // 显示新记录的效果 createNewRecordEffect: function (node) { let wpos = node.parent.convertToWorldSpaceAR(node.position); let myPos = this.effectPanel.convertToNodeSpaceAR(wpos); if (!this.recordEffect) { this.recordEffect = cc.instantiate(this.recordEffectPreb); this.effectPanel.addChild(this.recordEffect); } let self = this; this.recordEffect.getChildByName('effectNode1').getComponent(cc.ParticleSystem).resetSystem(); this.scheduleOnce(function () { self.recordEffect.getChildByName('effectNode2').active = true; self.recordEffect.getChildByName('effectNode2').getComponent(cc.ParticleSystem).resetSystem(); }, 0.5); this.scheduleOnce(function () { self.recordEffect.getChildByName('effectNode3').active = true; self.recordEffect.getChildByName('effectNode3').getComponent(cc.ParticleSystem).resetSystem(); }, 1); this.recordEffect.position = myPos; this.scheduleOnce(function () { self.recordEffect.active = false; }, 2); }, // 显示烟花效果 showFireworkEffect(node) { let wpos = node.parent.convertToWorldSpaceAR(node.position); let myPos = this.effectPanel.convertToNodeSpaceAR(wpos); if (!this.fireEffect) { this.fireEffect = cc.instantiate(this.fireworkPreb); this.effectPanel.addChild(this.fireEffect); } let self = this; self.fireEffect.active = true; this.fireEffect.getChildByName('effectNode1').getComponent(cc.ParticleSystem).resetSystem(); this.scheduleOnce(function () { self.fireEffect.getChildByName('effectNode2').active = true; self.fireEffect.getChildByName('effectNode2').getComponent(cc.ParticleSystem).resetSystem(); }, 1); this.fireEffect.position = myPos; this.effectPanel.zIndex = 201; this.scheduleOnce(function () { self.fireEffect.active = false; }, 2); }, // 显示手指点击效果 showFingerClick(node) { let wpos = node.parent.convertToWorldSpaceAR(node.position); let myPos = this.effectPanel.convertToNodeSpaceAR(wpos); if (!this.fingerEffect) { this.fingerEffect = cc.instantiate(this.fingerPreb); this.effectPanel.addChild(this.fingerEffect); } this.fingerEffect.active = true; this.fingerEffect.position = myPos; }, // 隐藏手指点击效果 hideFingerEffect() { (this.fingerEffect) && (this.fingerEffect.active = false); }, // 显示红色警戒蒙板 showAlertPanel() { this.alertPanel.active = true; }, // 隐藏红色警戒蒙板 hideAlertPanel() { this.alertPanel.active = false; }, // 显示积分收集动画 showScoreCollectEffect(worldPos, targetPosW, score) { let star = this.createScoreStar(); star.getComponent('scoreEffect').init(this.owner, score); let sourcePos = this.effectPanel.convertToNodeSpaceAR(worldPos); let targetPos = this.effectPanel.convertToNodeSpaceAR(targetPosW); let centerPos = cc.v2(targetPos.x + (sourcePos.x - targetPos.x) / 2, targetPos.y + (sourcePos.y - targetPos.y) / 2); if (sourcePos.x < 0) { centerPos.x = targetPos.x + (centerPos.x - targetPos.x) / 2; centerPos.y = centerPos.y - (targetPos.y - centerPos.y) / 2; } else { centerPos.x = centerPos.x + (centerPos.x - targetPos.x) / 2; centerPos.y = centerPos.y + (targetPos.y - centerPos.y) / 2; } let linePos = [sourcePos, centerPos, targetPos]; star.position = sourcePos; star.getComponent(cc.ParticleSystem).resetSystem(); star.active = true; let actionTime = Config.score_collect_fly_time; let action = cc.sequence(cc.bezierTo(actionTime, linePos), cc.callFunc(this.scoreCollected, this, targetPos)); star.runAction(action).easing(cc.easeElasticOut(actionTime)); }, // 显示材料收集动画 showCookieCollectEffect(sourceNd, targetNode, itemId) { let worldPos = sourceNd.parent.convertToWorldSpaceAR(sourceNd.position); let star = this.createCookieStar(this.effectPanel); star.getComponent('scoreEffect').showCookie(itemId); let sourcePos = this.effectPanel.convertToNodeSpaceAR(worldPos); let targetPosW = targetNode.parent.convertToWorldSpaceAR(targetNode.position); let targetPos = this.effectPanel.convertToNodeSpaceAR(targetPosW); let centerPos = cc.v2(targetPos.x + (sourcePos.x - targetPos.x) / 2, targetPos.y + (sourcePos.y - targetPos.y) / 2); if (sourcePos.x < 0) { centerPos.x = targetPos.x + (centerPos.x - targetPos.x) / 2; centerPos.y = centerPos.y - (targetPos.y - centerPos.y) / 2; } else { centerPos.x = centerPos.x + (centerPos.x - targetPos.x) / 2; centerPos.y = centerPos.y + (targetPos.y - centerPos.y) / 2; } let linePos = [sourcePos, centerPos, targetPos]; console.log(linePos); star.position = sourcePos; star.getComponent(cc.ParticleSystem).resetSystem(); star.active = true; let actionTime = Config.score_collect_fly_time; let action = cc.sequence(cc.bezierTo(actionTime, linePos), cc.callFunc(this.cookieCollected, this, targetPos)); star.runAction(action).easing(cc.easeElasticOut(actionTime)); }, // 获取一个积分飞行动画的实例 createScoreStar: function () { let star = null; if (this.scorePool.length > 0) { star = this.scorePool.shift(); star.active = true; } else { star = cc.instantiate(this.scoreEffectPreb); this.effectPanel.addChild(star); } return star; }, // 获取一个cookie飞行动画的实例 createCookieStar: function (parentNode) { let star = null; if (this.cookiePool.size() > 0) { star = this.cookiePool.get(); } else { star = cc.instantiate(this.cookieEffectPreb); } parentNode.addChild(star); return star; }, // 道具飞行到目标后的回调 scoreCollected(obj, pos) { console.log('score collected'); // obj.parent = null; obj.active = false; this.scorePool.push(obj); }, cookieCollected(obj, pos) { obj.parent = null; this.cookiePool.put(obj); } });