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