From e4048d2015d41aabc34ab0ff5a6f96c65e7611d5 Mon Sep 17 00:00:00 2001 From: fanxuehan <fanxuehan@qq.com> Date: Tue, 16 Mar 2021 14:18:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9EonHomeworkFinish()?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- play/assets/tmpGame/script/Scene.js | 10 -- play/assets/tmpGame/script/util.js | 219 ++++++++++++++++++++++++++++ 2 files changed, 219 insertions(+), 10 deletions(-) diff --git a/play/assets/tmpGame/script/Scene.js b/play/assets/tmpGame/script/Scene.js index 139fb8e..4dbf500 100644 --- a/play/assets/tmpGame/script/Scene.js +++ b/play/assets/tmpGame/script/Scene.js @@ -1,12 +1,3 @@ -// Learn cc.Class: -// - https://docs.cocos.com/creator/manual/en/scripting/class.html -// Learn Attribute: -// - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html -// Learn life-cycle callbacks: -// - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html - - - cc.Class({ extends: cc.Component, @@ -35,7 +26,6 @@ cc.Class({ _mapScaleMax: null, // 场景ä¸å¸¸ç”¨ç¼©æ”¾ï¼ˆå–å°å€¼ï¼‰ _cocosScale: null, // cocos 自缩放 (较少用到) initSize() { - // 注æ„cc.winSizeåªæœ‰åœ¨é€‚é…åŽ(修改fitHeight/fitWidthåŽ)æ‰èƒ½èŽ·å–到æ£ç¡®çš„值,å› æ¤ä½¿ç”¨cc.getFrameSize()æ¥èŽ·å–åˆå§‹çš„å±å¹•å¤§å° let screen_size = cc.view.getFrameSize().width / cc.view.getFrameSize().height let design_size = cc.Canvas.instance.designResolution.width / cc.Canvas.instance.designResolution.height diff --git a/play/assets/tmpGame/script/util.js b/play/assets/tmpGame/script/util.js index 94af9b9..b3e77e6 100644 --- a/play/assets/tmpGame/script/util.js +++ b/play/assets/tmpGame/script/util.js @@ -131,4 +131,223 @@ export function btnClickAnima(btn, time=0.15, rate=1.05) { .to(time / 2, {scale: btn.tmpScale}) .start() }) +} + + +export function getSpriteFrimeByUrl(url, cb) { + cc.loader.load({ url }, (err, img) => { + const spriteFrame = new cc.SpriteFrame(img) + if (cb) { + cb(spriteFrame); + } + }) +} + +export function getSprNode(resName) { + const sf = cc.find('Canvas/res/img/' + resName).getComponent(cc.Sprite).spriteFrame; + const node = new cc.Node(); + node.addComponent(cc.Sprite).spriteFrame = sf; + return node; +} + +export function getSprNodeByUrl(url, cb) { + const node = new cc.Node(); + const spr = node.addComponent(cc.Sprite); + getSpriteFrimeByUrl(url, (sf) => { + spr.spriteFrame = sf; + if (cb) { + cb(spr); + } + }) +} + + + +export function playAudio(audioClip, cb = null) { + if (audioClip) { + const audioId = cc.audioEngine.playEffect(audioClip, false, 0.8); + if (cb) { + cc.audioEngine.setFinishCallback(audioId, () => { + cb(); + }); + } + } +} + +export async function asyncDelay(time) { + return new Promise((resolve, reject) => { + try { + setTimeout(() => { + resolve(); + }, time * 1000); + } catch (e) { + reject(e); + } + }) +} + +export class FireworkSettings { + baseNode; // 父节点 + nodeList; // ç«èŠ±èŠ‚ç‚¹çš„array + pos; // å‘射点 + side; // å‘å°„æ–¹å‘ + range; // 扩散范围 + number; // å‘å°„æ•°é‡ + scalseRange; // 缩放范围 + constructor(baseNode, nodeList, + pos = cc.v2(0, 0), + side = cc.v2(0, 100), + range = 50, + number = 100, + scalseRange = 0 + ) { + this.baseNode = baseNode; + this.nodeList = nodeList; + this.pos = pos; + this.side = side; + this.range = range; + this.number = number; + this.scalseRange = scalseRange; + } + + static copy(firework) { + return new FireworkSettings( + firework.baseNode, + firework.nodeList, + firework.pos, + firework.side, + firework.range, + firework.number, + ); + } +} + +export async function showFireworks(fireworkSettings) { + const { baseNode, nodeList, pos, side, range, number, scalseRange } = fireworkSettings; + new Array(number).fill(' ').forEach(async (_, i) => { + + let rabbonNode = new cc.Node(); + rabbonNode.parent = baseNode; + rabbonNode.x = pos.x; + rabbonNode.y = pos.y; + rabbonNode.angle = 60 * Math.random() - 30; + + let node = cc.instantiate(nodeList[RandomInt(nodeList.length)]); + node.parent = rabbonNode; + node.active = true; + node.x = 0; + node.y = 0; + node.angle = 0; + node.scale = (Math.random() - 0.5) * scalseRange + 1; + + const rate = Math.random(); + const angle = Math.PI * (Math.random() * 2 - 1); + + await asyncTweenBy(rabbonNode, 0.3, { + x: side.x * rate + Math.cos(angle) * range * rate, + y: side.y * rate + Math.sin(angle) * range * rate + }, { + easing: 'quadIn' + }); + + cc.tween(rabbonNode) + .by(8, { y: -2000 }) + .start(); + + cc.tween(rabbonNode) + .to(5, { scale: (Math.random() - 0.5) * scalseRange + 1 }) + .start(); + + rabbonFall(rabbonNode); + + await asyncDelay(Math.random()); + cc.tween(node) + .by(0.15, { x: -10, angle: -10 }) + .by(0.3, { x: 20, angle: 20 }) + .by(0.15, { x: -10, angle: -10 }) + .union() + .repeatForever() + .start(); + + cc.tween(rabbonNode) + .delay(5) + .to(0.3, { opacity: 0 }) + .call(() => { + node.stopAllActions(); + node.active = false; + node.parent = null; + node = null; + }) + .start(); + }); +} + +async function rabbonFall(node) { + const time = 1 + Math.random(); + const offsetX = RandomInt(-200, 200) * time; + await asyncTweenBy(node, time, { x: offsetX, angle: offsetX * 60 / 200 }); + rabbonFall(node); +} + + +export async function asyncTweenTo(node, duration, obj, ease = undefined) { + return new Promise((resolve, reject) => { + try { + cc.tween(node) + .to(duration, obj, ease) + .call(() => { + resolve(); + }) + .start(); + } catch (e) { + reject(e); + } + }); +} + +export async function asyncTweenBy(node, duration, obj, ease = undefined) { + return new Promise((resolve, reject) => { + try { + cc.tween(node) + .by(duration, obj, ease) + .call(() => { + resolve(); + }) + .start(); + } catch (e) { + reject(e); + } + }); +} + +export function showTrebleFirework(baseNode, rabbonList) { + const middle = new FireworkSettings(baseNode, rabbonList); + middle.pos = cc.v2(0, -400); + middle.side = cc.v2(0, 1000); + middle.range = 200; + middle.number = 100; + middle.scalseRange = 0.4; + + const left = FireworkSettings.copy(middle); + left.pos = cc.v2(-600, -400); + left.side = cc.v2(200, 1000); + + const right = FireworkSettings.copy(middle); + right.pos = cc.v2(600, -400); + right.side = cc.v2(-200, 1000); + + showFireworks(middle); + showFireworks(left); + showFireworks(right); +} + +export function onHomeworkFinish() { + const middleLayer = cc.find('middleLayer'); + if (middleLayer) { + const middleLayerComponent = middleLayer.getComponent('middleLayer'); + if (middleLayerComponent.role == 'student') { + middleLayerComponent.onHomeworkFinish(() => { }); + } + return; + } } \ No newline at end of file -- 2.21.0