diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..935baed65ff7de0e8daca0e78bfcb10243eb0fe2
Binary files /dev/null and b/.DS_Store differ
diff --git a/form/src/app/form/form.component.html b/form/src/app/form/form.component.html
index 3836ff944244c9fac11d53e1301227e43db81b31..c07239d45cf36658f22d7be4473cd52667687489 100644
--- a/form/src/app/form/form.component.html
+++ b/form/src/app/form/form.component.html
@@ -1,36 +1,36 @@
 <div class="model-content">
-  <!-- <div class="border" style=" width: 520px; height: 120px;">
-    <span style="height: 30px; font-size: 18px;">单词音频:</span>
-    <br>
-    <app-audio-recorder [audioUrl]=" item.audio" (audioUploaded)="onAudioUploadSuccess($event)">
-    </app-audio-recorder>
-  </div>
-  <div class="border" style="width: 520px;">
-    <span style="height: 30px; font-size: 18px;">正确字母:</span>
-    <div>
-      <div *ngFor="let rightWord of item.rightWordList; let i = index">
-        <div style="padding: 2px;">
-          <input style="width: 150px;float: left;" type="text" nz-input [(ngModel)]="rightWord.word" (blur)="save()">
-          <app-audio-recorder style="float: left;" [audioUrl]="rightWord.audio"
-            (audioUploaded)="onRightAudioUploadSuccess($event, i)">
-          </app-audio-recorder>
-          <button style="float: right; margin-left: 10px; height: 32px; color: red;" nz-button nzType="dashed"
-            class="add-btn" (click)="removeRightWord(i)">
-            <i nz-icon nzType="minus-circle" nzTheme="outline"></i>
-            删除字母
-          </button>
-        </div>
-        <br> <br>
-      </div>
+ 
+  <div style="padding: 10px;">
+    
+    <div style="width: 300px;" align='center'>
+      <span>图1: </span>
+      <app-upload-image-with-preview
+        [picUrl]="item.pic_url"
+        (imageUploaded)="onImageUploadSuccess($event, 'pic_url')">
+      </app-upload-image-with-preview>
+    </div>
+   
+    <div style="width: 300px; margin-top: 5px;" align='center'>
+      <span>图2: </span>
+      <app-upload-image-with-preview
+        [picUrl]="item.pic_url_2"
+        (imageUploaded)="onImageUploadSuccess($event, 'pic_url_2')">
+      </app-upload-image-with-preview>
+    </div>
+
+    <div style="width: 300px; margin-top: 15px;">
+      <span>文本: </span>
+      <input type="text" nz-input [(ngModel)]="item.text" (blur)="save()">
     </div>
-    <div *ngIf="(item.rightWordList.length +item.wrongWordList.length < 5)">
-      <button style="margin-left: 2px; margin-top: 2px; height: 32px;" nz-button nzType="dashed" class="add-btn"
-        (click)="addRightWord()">
-        <i nz-icon nzType="plus-circle" nzTheme="outline"></i>
-        添加<span style="color: #44bb44;">正确</span>的字母
-      </button>
+
+    <div style="margin-top: 5px">
+      <span>音频: </span>
+      <app-audio-recorder
+        [audioUrl]="item.audio_url"
+        (audioUploaded)="onAudioUploadSuccess($event, 'audio_url')"
+      ></app-audio-recorder>
     </div>
+
   </div>
- -->
 
 </div>
diff --git a/form/src/app/form/form.component.ts b/form/src/app/form/form.component.ts
index 082e3ececafbaecfd34e33722fae3e1549440a28..82a6e9121ba195cd3bf69b7c9744570ff9f97458 100644
--- a/form/src/app/form/form.component.ts
+++ b/form/src/app/form/form.component.ts
@@ -35,9 +35,7 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy {
 
   ngOnInit() {
 
-    this.item = {
-      wordList: []
-    };
+    this.item = {};
 
     // 获取存储的数据
     (<any>window).courseware.getData((data) => {
@@ -79,8 +77,8 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy {
    * 储存音频数据
    * @param e
    */
-  onAudioUploadSuccess(e) {
-    this.item.audio = e.url;
+  onAudioUploadSuccess(e, key) {
+    this.item[key] = e.url;
     this.save();
   }
 
@@ -99,6 +97,7 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy {
    */
   save() {
     (<any>window).courseware.setData(this.item, null, this.saveKey);
+
     this.refresh();
     console.log('this.item = ' + JSON.stringify(this.item));
   }
diff --git a/play/assets/tmpGame/audios/btn.mp3 b/play/assets/tmpGame/audios/btn.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..57cac0ff985fa12770efb011d56d0054e5797930
Binary files /dev/null and b/play/assets/tmpGame/audios/btn.mp3 differ
diff --git a/play/assets/tmpGame/audios/btn.mp3.meta b/play/assets/tmpGame/audios/btn.mp3.meta
new file mode 100644
index 0000000000000000000000000000000000000000..4255f217d13c5f8788bff619f2345a38b5365a4e
--- /dev/null
+++ b/play/assets/tmpGame/audios/btn.mp3.meta
@@ -0,0 +1,7 @@
+{
+  "ver": "2.0.1",
+  "uuid": "f0680ae0-c079-45ef-abd7-9e63d90b982b",
+  "downloadMode": 0,
+  "duration": 0.130612,
+  "subMetas": {}
+}
\ No newline at end of file
diff --git a/play/assets/tmpGame/fonts/BRLNSDB.TTF b/play/assets/tmpGame/fonts/BRLNSDB.TTF
new file mode 100644
index 0000000000000000000000000000000000000000..e5f34b2f342ffcd820a8a0956af3ab36bb1f9e1f
Binary files /dev/null and b/play/assets/tmpGame/fonts/BRLNSDB.TTF differ
diff --git a/play/assets/tmpGame/fonts/BRLNSDB.TTF.meta b/play/assets/tmpGame/fonts/BRLNSDB.TTF.meta
new file mode 100644
index 0000000000000000000000000000000000000000..4e0884f08320b065f1d4b477b5ee7693239bf8f4
--- /dev/null
+++ b/play/assets/tmpGame/fonts/BRLNSDB.TTF.meta
@@ -0,0 +1,5 @@
+{
+  "ver": "1.1.0",
+  "uuid": "c551970e-b095-45f3-9f1d-25cde8b8deb1",
+  "subMetas": {}
+}
\ No newline at end of file
diff --git a/play/assets/tmpGame/prefabs/TmpPreFab.js b/play/assets/tmpGame/prefabs/TmpPreFab.js
deleted file mode 100644
index 40eedea1b6e4ef8a4c2fc21e8eb60d03c4b87be6..0000000000000000000000000000000000000000
--- a/play/assets/tmpGame/prefabs/TmpPreFab.js
+++ /dev/null
@@ -1,38 +0,0 @@
-// 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,
-
-    properties: {
-        // foo: {
-        //     // ATTRIBUTES:
-        //     default: null,        // The default value will be used only when the component attaching
-        //                           // to a node for the first time
-        //     type: cc.SpriteFrame, // optional, default is typeof default
-        //     serializable: true,   // optional, default is true
-        // },
-        // bar: {
-        //     get () {
-        //         return this._bar;
-        //     },
-        //     set (value) {
-        //         this._bar = value;
-        //     }
-        // },
-    },
-
-    // LIFE-CYCLE CALLBACKS:
-
-    // onLoad () {},
-
-    start () {
-
-    },
-
-    // update (dt) {},
-});
diff --git a/play/assets/tmpGame/prefabs/TmpPreFab.prefab b/play/assets/tmpGame/prefabs/TmpPreFab.prefab
deleted file mode 100644
index d8ba7cc0af9ca7cc2da926d7a357e623d791b2d5..0000000000000000000000000000000000000000
--- a/play/assets/tmpGame/prefabs/TmpPreFab.prefab
+++ /dev/null
@@ -1,97 +0,0 @@
-[
-  {
-    "__type__": "cc.Prefab",
-    "_name": "",
-    "_objFlags": 0,
-    "_native": "",
-    "data": {
-      "__id__": 1
-    },
-    "optimizationPolicy": 0,
-    "asyncLoadAssets": false,
-    "readonly": false
-  },
-  {
-    "__type__": "cc.Node",
-    "_name": "TmpPreFab",
-    "_objFlags": 0,
-    "_parent": null,
-    "_children": [],
-    "_active": true,
-    "_components": [
-      {
-        "__id__": 2
-      }
-    ],
-    "_prefab": {
-      "__id__": 3
-    },
-    "_opacity": 255,
-    "_color": {
-      "__type__": "cc.Color",
-      "r": 255,
-      "g": 255,
-      "b": 255,
-      "a": 255
-    },
-    "_contentSize": {
-      "__type__": "cc.Size",
-      "width": 0,
-      "height": 0
-    },
-    "_anchorPoint": {
-      "__type__": "cc.Vec2",
-      "x": 0.5,
-      "y": 0.5
-    },
-    "_trs": {
-      "__type__": "TypedArray",
-      "ctor": "Float64Array",
-      "array": [
-        0,
-        0,
-        0,
-        0,
-        0,
-        0,
-        1,
-        1,
-        1,
-        1
-      ]
-    },
-    "_eulerAngles": {
-      "__type__": "cc.Vec3",
-      "x": 0,
-      "y": 0,
-      "z": 0
-    },
-    "_skewX": 0,
-    "_skewY": 0,
-    "_is3DNode": false,
-    "_groupIndex": 0,
-    "groupIndex": 0,
-    "_id": ""
-  },
-  {
-    "__type__": "94a7bm5aTlEp4XPFTNpUrmX",
-    "_name": "",
-    "_objFlags": 0,
-    "node": {
-      "__id__": 1
-    },
-    "_enabled": true,
-    "_id": ""
-  },
-  {
-    "__type__": "cc.PrefabInfo",
-    "root": {
-      "__id__": 1
-    },
-    "asset": {
-      "__uuid__": "ec03214c-4419-4127-8e8f-39df8d2c3146"
-    },
-    "fileId": "17t3fETWZIALDkDA1OlUg9",
-    "sync": false
-  }
-]
\ No newline at end of file
diff --git a/play/assets/tmpGame/prefabs/TmpPreFab.prefab.meta b/play/assets/tmpGame/prefabs/TmpPreFab.prefab.meta
deleted file mode 100644
index 5e5300b0b8fb7e3152c3e4c99c179e0f043d2c01..0000000000000000000000000000000000000000
--- a/play/assets/tmpGame/prefabs/TmpPreFab.prefab.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "ver": "1.2.7",
-  "uuid": "ec03214c-4419-4127-8e8f-39df8d2c3146",
-  "optimizationPolicy": "AUTO",
-  "asyncLoadAssets": false,
-  "readonly": false,
-  "subMetas": {}
-}
\ No newline at end of file
diff --git a/play/assets/tmpGame/scene/Scene.fire b/play/assets/tmpGame/scene/Scene.fire
new file mode 100644
index 0000000000000000000000000000000000000000..3e7c9dc3d80d5a7f2861f81f99ab3c66cfa30439
--- /dev/null
+++ b/play/assets/tmpGame/scene/Scene.fire
@@ -0,0 +1,1303 @@
+[
+  {
+    "__type__": "cc.SceneAsset",
+    "_name": "",
+    "_objFlags": 0,
+    "_native": "",
+    "scene": {
+      "__id__": 1
+    }
+  },
+  {
+    "__type__": "cc.Scene",
+    "_objFlags": 0,
+    "_parent": null,
+    "_children": [
+      {
+        "__id__": 2
+      }
+    ],
+    "_active": false,
+    "_components": [],
+    "_prefab": null,
+    "_opacity": 255,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 0,
+      "height": 0
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_trs": {
+      "__type__": "TypedArray",
+      "ctor": "Float64Array",
+      "array": [
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        1,
+        1,
+        1,
+        1
+      ]
+    },
+    "_is3DNode": true,
+    "_groupIndex": 0,
+    "groupIndex": 0,
+    "autoReleaseAssets": true,
+    "_id": "57ea7c61-9b8b-498a-b024-c98ee9124beb"
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "Canvas",
+    "_objFlags": 0,
+    "_parent": {
+      "__id__": 1
+    },
+    "_children": [
+      {
+        "__id__": 3
+      },
+      {
+        "__id__": 5
+      },
+      {
+        "__id__": 7
+      },
+      {
+        "__id__": 14
+      }
+    ],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 24
+      },
+      {
+        "__id__": 25
+      },
+      {
+        "__id__": 26
+      }
+    ],
+    "_prefab": null,
+    "_opacity": 255,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 1280,
+      "height": 720
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_trs": {
+      "__type__": "TypedArray",
+      "ctor": "Float64Array",
+      "array": [
+        640,
+        360,
+        0,
+        0,
+        0,
+        0,
+        1,
+        1,
+        1,
+        1
+      ]
+    },
+    "_eulerAngles": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_skewX": 0,
+    "_skewY": 0,
+    "_is3DNode": false,
+    "_groupIndex": 0,
+    "groupIndex": 0,
+    "_id": "a5esZu+45LA5mBpvttspPD"
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "Main Camera",
+    "_objFlags": 0,
+    "_parent": {
+      "__id__": 2
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 4
+      }
+    ],
+    "_prefab": null,
+    "_opacity": 255,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 1280,
+      "height": 720
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_trs": {
+      "__type__": "TypedArray",
+      "ctor": "Float64Array",
+      "array": [
+        0,
+        0,
+        362.85545494732423,
+        0,
+        0,
+        0,
+        1,
+        1,
+        1,
+        1
+      ]
+    },
+    "_eulerAngles": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_skewX": 0,
+    "_skewY": 0,
+    "_is3DNode": false,
+    "_groupIndex": 0,
+    "groupIndex": 0,
+    "_id": "e1WoFrQ79G7r4ZuQE3HlNb"
+  },
+  {
+    "__type__": "cc.Camera",
+    "_name": "",
+    "_objFlags": 0,
+    "node": {
+      "__id__": 3
+    },
+    "_enabled": true,
+    "_cullingMask": 4294967295,
+    "_clearFlags": 7,
+    "_backgroundColor": {
+      "__type__": "cc.Color",
+      "r": 0,
+      "g": 0,
+      "b": 0,
+      "a": 255
+    },
+    "_depth": -1,
+    "_zoomRatio": 1,
+    "_targetTexture": null,
+    "_fov": 60,
+    "_orthoSize": 10,
+    "_nearClip": 1,
+    "_farClip": 4096,
+    "_ortho": true,
+    "_rect": {
+      "__type__": "cc.Rect",
+      "x": 0,
+      "y": 0,
+      "width": 1,
+      "height": 1
+    },
+    "_renderStages": 1,
+    "_alignWithScreen": true,
+    "_id": "81GN3uXINKVLeW4+iKSlim"
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "bg",
+    "_objFlags": 0,
+    "_parent": {
+      "__id__": 2
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 6
+      }
+    ],
+    "_prefab": null,
+    "_opacity": 255,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 1280,
+      "height": 720
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_trs": {
+      "__type__": "TypedArray",
+      "ctor": "Float64Array",
+      "array": [
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        1,
+        1,
+        1,
+        1
+      ]
+    },
+    "_eulerAngles": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_skewX": 0,
+    "_skewY": 0,
+    "_is3DNode": false,
+    "_groupIndex": 0,
+    "groupIndex": 0,
+    "_id": "32MJMZ2HRGF4BOf533Avyi"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "node": {
+      "__id__": 5
+    },
+    "_enabled": true,
+    "_materials": [
+      {
+        "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432"
+      }
+    ],
+    "_srcBlendFactor": 770,
+    "_dstBlendFactor": 771,
+    "_spriteFrame": {
+      "__uuid__": "8288e3d4-4c75-4b27-8f01-f7014417f4dd"
+    },
+    "_type": 0,
+    "_sizeMode": 1,
+    "_fillType": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_atlas": null,
+    "_id": "97/S6HDq9MeqgmV1Zwnhbb"
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "bottomPart",
+    "_objFlags": 0,
+    "_parent": {
+      "__id__": 2
+    },
+    "_children": [
+      {
+        "__id__": 8
+      },
+      {
+        "__id__": 11
+      }
+    ],
+    "_active": true,
+    "_components": [],
+    "_prefab": null,
+    "_opacity": 255,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 0,
+      "height": 0
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_trs": {
+      "__type__": "TypedArray",
+      "ctor": "Float64Array",
+      "array": [
+        635.132,
+        -356.326,
+        0,
+        0,
+        0,
+        0,
+        1,
+        1,
+        1,
+        1
+      ]
+    },
+    "_eulerAngles": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_skewX": 0,
+    "_skewY": 0,
+    "_is3DNode": false,
+    "_groupIndex": 0,
+    "groupIndex": 0,
+    "_id": "8c7k8ep/ZFNpO263+1QHz9"
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "btn_left",
+    "_objFlags": 0,
+    "_parent": {
+      "__id__": 7
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 9
+      },
+      {
+        "__id__": 10
+      }
+    ],
+    "_prefab": null,
+    "_opacity": 255,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 61,
+      "height": 67
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_trs": {
+      "__type__": "TypedArray",
+      "ctor": "Float64Array",
+      "array": [
+        -148.464,
+        34,
+        0,
+        0,
+        0,
+        0,
+        1,
+        1,
+        1,
+        1
+      ]
+    },
+    "_eulerAngles": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_skewX": 0,
+    "_skewY": 0,
+    "_is3DNode": false,
+    "_groupIndex": 0,
+    "groupIndex": 0,
+    "_id": "5ad2wLQLxIN5Eg7OHecSH6"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "node": {
+      "__id__": 8
+    },
+    "_enabled": true,
+    "_materials": [
+      {
+        "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432"
+      }
+    ],
+    "_srcBlendFactor": 770,
+    "_dstBlendFactor": 771,
+    "_spriteFrame": {
+      "__uuid__": "ce19457d-e8f3-4c38-ae3e-d4b99208ddb5"
+    },
+    "_type": 0,
+    "_sizeMode": 1,
+    "_fillType": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_atlas": null,
+    "_id": "84mqOgJ3JNqZrYVTEU8CjE"
+  },
+  {
+    "__type__": "cc.Button",
+    "_name": "",
+    "_objFlags": 0,
+    "node": {
+      "__id__": 8
+    },
+    "_enabled": true,
+    "_normalMaterial": null,
+    "_grayMaterial": null,
+    "duration": 0.1,
+    "zoomScale": 1.2,
+    "clickEvents": [],
+    "_N$interactable": true,
+    "_N$enableAutoGrayEffect": false,
+    "_N$transition": 0,
+    "transition": 0,
+    "_N$normalColor": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_N$pressedColor": {
+      "__type__": "cc.Color",
+      "r": 211,
+      "g": 211,
+      "b": 211,
+      "a": 255
+    },
+    "pressedColor": {
+      "__type__": "cc.Color",
+      "r": 211,
+      "g": 211,
+      "b": 211,
+      "a": 255
+    },
+    "_N$hoverColor": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "hoverColor": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_N$disabledColor": {
+      "__type__": "cc.Color",
+      "r": 124,
+      "g": 124,
+      "b": 124,
+      "a": 255
+    },
+    "_N$normalSprite": null,
+    "_N$pressedSprite": null,
+    "pressedSprite": null,
+    "_N$hoverSprite": null,
+    "hoverSprite": null,
+    "_N$disabledSprite": null,
+    "_N$target": null,
+    "_id": "bcYN/4EKBJhbIAfovo9Ah1"
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "btn_right",
+    "_objFlags": 0,
+    "_parent": {
+      "__id__": 7
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 12
+      },
+      {
+        "__id__": 13
+      }
+    ],
+    "_prefab": null,
+    "_opacity": 255,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 60,
+      "height": 66
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_trs": {
+      "__type__": "TypedArray",
+      "ctor": "Float64Array",
+      "array": [
+        -47.164,
+        34,
+        0,
+        0,
+        0,
+        0,
+        1,
+        1,
+        1,
+        1
+      ]
+    },
+    "_eulerAngles": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_skewX": 0,
+    "_skewY": 0,
+    "_is3DNode": false,
+    "_groupIndex": 0,
+    "groupIndex": 0,
+    "_id": "46i3stdzpHX6zQHTGnRsNE"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "node": {
+      "__id__": 11
+    },
+    "_enabled": true,
+    "_materials": [
+      {
+        "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432"
+      }
+    ],
+    "_srcBlendFactor": 770,
+    "_dstBlendFactor": 771,
+    "_spriteFrame": {
+      "__uuid__": "e5a2dbaa-a677-4a32-90d7-a1b057d7fb59"
+    },
+    "_type": 0,
+    "_sizeMode": 1,
+    "_fillType": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_atlas": null,
+    "_id": "42Sh8QS/BHn4WiGyPQPKPt"
+  },
+  {
+    "__type__": "cc.Button",
+    "_name": "",
+    "_objFlags": 0,
+    "node": {
+      "__id__": 11
+    },
+    "_enabled": true,
+    "_normalMaterial": null,
+    "_grayMaterial": null,
+    "duration": 0.1,
+    "zoomScale": 1.2,
+    "clickEvents": [],
+    "_N$interactable": true,
+    "_N$enableAutoGrayEffect": false,
+    "_N$transition": 0,
+    "transition": 0,
+    "_N$normalColor": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_N$pressedColor": {
+      "__type__": "cc.Color",
+      "r": 211,
+      "g": 211,
+      "b": 211,
+      "a": 255
+    },
+    "pressedColor": {
+      "__type__": "cc.Color",
+      "r": 211,
+      "g": 211,
+      "b": 211,
+      "a": 255
+    },
+    "_N$hoverColor": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "hoverColor": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_N$disabledColor": {
+      "__type__": "cc.Color",
+      "r": 124,
+      "g": 124,
+      "b": 124,
+      "a": 255
+    },
+    "_N$normalSprite": null,
+    "_N$pressedSprite": null,
+    "pressedSprite": null,
+    "_N$hoverSprite": null,
+    "hoverSprite": null,
+    "_N$disabledSprite": null,
+    "_N$target": null,
+    "_id": "1aj32fYY1IxLesa77E70Qu"
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "res",
+    "_objFlags": 0,
+    "_parent": {
+      "__id__": 2
+    },
+    "_children": [
+      {
+        "__id__": 15
+      },
+      {
+        "__id__": 18
+      },
+      {
+        "__id__": 21
+      }
+    ],
+    "_active": false,
+    "_components": [],
+    "_prefab": null,
+    "_opacity": 255,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 0,
+      "height": 0
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_trs": {
+      "__type__": "TypedArray",
+      "ctor": "Float64Array",
+      "array": [
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        1,
+        1,
+        1,
+        1
+      ]
+    },
+    "_eulerAngles": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_skewX": 0,
+    "_skewY": 0,
+    "_is3DNode": false,
+    "_groupIndex": 0,
+    "groupIndex": 0,
+    "_id": "0aAzbH6R1E+6AmGRrkKa5O"
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "font",
+    "_objFlags": 0,
+    "_parent": {
+      "__id__": 14
+    },
+    "_children": [
+      {
+        "__id__": 16
+      }
+    ],
+    "_active": true,
+    "_components": [],
+    "_prefab": null,
+    "_opacity": 255,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 0,
+      "height": 0
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_trs": {
+      "__type__": "TypedArray",
+      "ctor": "Float64Array",
+      "array": [
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        1,
+        1,
+        1,
+        1
+      ]
+    },
+    "_eulerAngles": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_skewX": 0,
+    "_skewY": 0,
+    "_is3DNode": false,
+    "_groupIndex": 0,
+    "groupIndex": 0,
+    "_id": "9bLfcYeeNKrr524vzWchiM"
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "BRLNSDB",
+    "_objFlags": 0,
+    "_parent": {
+      "__id__": 15
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 17
+      }
+    ],
+    "_prefab": null,
+    "_opacity": 255,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 0,
+      "height": 0
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_trs": {
+      "__type__": "TypedArray",
+      "ctor": "Float64Array",
+      "array": [
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        1,
+        1,
+        1,
+        1
+      ]
+    },
+    "_eulerAngles": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_skewX": 0,
+    "_skewY": 0,
+    "_is3DNode": false,
+    "_groupIndex": 0,
+    "groupIndex": 0,
+    "_id": "cfMLGsq0BMhJARv+ySMAxS"
+  },
+  {
+    "__type__": "cc.Label",
+    "_name": "",
+    "_objFlags": 0,
+    "node": {
+      "__id__": 16
+    },
+    "_enabled": true,
+    "_materials": [],
+    "_srcBlendFactor": 770,
+    "_dstBlendFactor": 771,
+    "_useOriginalSize": true,
+    "_string": "",
+    "_N$string": "",
+    "_fontSize": 40,
+    "_lineHeight": 40,
+    "_enableWrapText": true,
+    "_N$file": {
+      "__uuid__": "c551970e-b095-45f3-9f1d-25cde8b8deb1"
+    },
+    "_isSystemFontUsed": false,
+    "_spacingX": 0,
+    "_batchAsBitmap": false,
+    "_styleFlags": 0,
+    "_underlineHeight": 0,
+    "_N$horizontalAlign": 0,
+    "_N$verticalAlign": 0,
+    "_N$fontFamily": "Arial",
+    "_N$overflow": 0,
+    "_N$cacheMode": 0,
+    "_id": "9bNHNPu5lC7rQYyr8ai/sY"
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "img",
+    "_objFlags": 0,
+    "_parent": {
+      "__id__": 14
+    },
+    "_children": [
+      {
+        "__id__": 19
+      }
+    ],
+    "_active": true,
+    "_components": [],
+    "_prefab": null,
+    "_opacity": 255,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 0,
+      "height": 0
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_trs": {
+      "__type__": "TypedArray",
+      "ctor": "Float64Array",
+      "array": [
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        1,
+        1,
+        1,
+        1
+      ]
+    },
+    "_eulerAngles": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_skewX": 0,
+    "_skewY": 0,
+    "_is3DNode": false,
+    "_groupIndex": 0,
+    "groupIndex": 0,
+    "_id": "53LUHHG2pEr79fyrvazXJs"
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "icon",
+    "_objFlags": 0,
+    "_parent": {
+      "__id__": 18
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 20
+      }
+    ],
+    "_prefab": null,
+    "_opacity": 255,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 138,
+      "height": 141
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_trs": {
+      "__type__": "TypedArray",
+      "ctor": "Float64Array",
+      "array": [
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        1,
+        1,
+        1,
+        1
+      ]
+    },
+    "_eulerAngles": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_skewX": 0,
+    "_skewY": 0,
+    "_is3DNode": false,
+    "_groupIndex": 0,
+    "groupIndex": 0,
+    "_id": "1blU2OArJIfoC9XfupGxJG"
+  },
+  {
+    "__type__": "cc.Sprite",
+    "_name": "",
+    "_objFlags": 0,
+    "node": {
+      "__id__": 19
+    },
+    "_enabled": true,
+    "_materials": [],
+    "_srcBlendFactor": 770,
+    "_dstBlendFactor": 771,
+    "_spriteFrame": {
+      "__uuid__": "6fbc30a8-3c49-44ae-8ba4-7f56f385b78a"
+    },
+    "_type": 0,
+    "_sizeMode": 1,
+    "_fillType": 0,
+    "_fillCenter": {
+      "__type__": "cc.Vec2",
+      "x": 0,
+      "y": 0
+    },
+    "_fillStart": 0,
+    "_fillRange": 0,
+    "_isTrimmedMode": true,
+    "_atlas": null,
+    "_id": "03GEWUEZJGyKormWgIWCtM"
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "audio",
+    "_objFlags": 0,
+    "_parent": {
+      "__id__": 14
+    },
+    "_children": [
+      {
+        "__id__": 22
+      }
+    ],
+    "_active": true,
+    "_components": [],
+    "_prefab": null,
+    "_opacity": 255,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 0,
+      "height": 0
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_trs": {
+      "__type__": "TypedArray",
+      "ctor": "Float64Array",
+      "array": [
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        1,
+        1,
+        1,
+        1
+      ]
+    },
+    "_eulerAngles": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_skewX": 0,
+    "_skewY": 0,
+    "_is3DNode": false,
+    "_groupIndex": 0,
+    "groupIndex": 0,
+    "_id": "b823DIVC9L+Ihc3T9Bt7m3"
+  },
+  {
+    "__type__": "cc.Node",
+    "_name": "btn",
+    "_objFlags": 0,
+    "_parent": {
+      "__id__": 21
+    },
+    "_children": [],
+    "_active": true,
+    "_components": [
+      {
+        "__id__": 23
+      }
+    ],
+    "_prefab": null,
+    "_opacity": 255,
+    "_color": {
+      "__type__": "cc.Color",
+      "r": 255,
+      "g": 255,
+      "b": 255,
+      "a": 255
+    },
+    "_contentSize": {
+      "__type__": "cc.Size",
+      "width": 0,
+      "height": 0
+    },
+    "_anchorPoint": {
+      "__type__": "cc.Vec2",
+      "x": 0.5,
+      "y": 0.5
+    },
+    "_trs": {
+      "__type__": "TypedArray",
+      "ctor": "Float64Array",
+      "array": [
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        1,
+        1,
+        1,
+        1
+      ]
+    },
+    "_eulerAngles": {
+      "__type__": "cc.Vec3",
+      "x": 0,
+      "y": 0,
+      "z": 0
+    },
+    "_skewX": 0,
+    "_skewY": 0,
+    "_is3DNode": false,
+    "_groupIndex": 0,
+    "groupIndex": 0,
+    "_id": "3d0p0/uJZJIoRva5Br2iqv"
+  },
+  {
+    "__type__": "cc.AudioSource",
+    "_name": "",
+    "_objFlags": 0,
+    "node": {
+      "__id__": 22
+    },
+    "_enabled": true,
+    "_clip": {
+      "__uuid__": "f0680ae0-c079-45ef-abd7-9e63d90b982b"
+    },
+    "_volume": 1,
+    "_mute": false,
+    "_loop": false,
+    "playOnLoad": false,
+    "preload": false,
+    "_id": "0adN50f61DlbmppsPkOnjX"
+  },
+  {
+    "__type__": "cc.Canvas",
+    "_name": "",
+    "_objFlags": 0,
+    "node": {
+      "__id__": 2
+    },
+    "_enabled": true,
+    "_designResolution": {
+      "__type__": "cc.Size",
+      "width": 1280,
+      "height": 720
+    },
+    "_fitWidth": false,
+    "_fitHeight": false,
+    "_id": "59Cd0ovbdF4byw5sbjJDx7"
+  },
+  {
+    "__type__": "cc.Widget",
+    "_name": "",
+    "_objFlags": 0,
+    "node": {
+      "__id__": 2
+    },
+    "_enabled": true,
+    "alignMode": 1,
+    "_target": null,
+    "_alignFlags": 45,
+    "_left": 0,
+    "_right": 0,
+    "_top": 0,
+    "_bottom": 0,
+    "_verticalCenter": 0,
+    "_horizontalCenter": 0,
+    "_isAbsLeft": true,
+    "_isAbsRight": true,
+    "_isAbsTop": true,
+    "_isAbsBottom": true,
+    "_isAbsHorizontalCenter": true,
+    "_isAbsVerticalCenter": true,
+    "_originalWidth": 0,
+    "_originalHeight": 0,
+    "_id": "29zXboiXFBKoIV4PQ2liTe"
+  },
+  {
+    "__type__": "f4edeRi+NdAabqAkVYRwFjK",
+    "_name": "",
+    "_objFlags": 0,
+    "node": {
+      "__id__": 2
+    },
+    "_enabled": true,
+    "_id": "e687yyoRBIzZAOVRL8Sseh"
+  }
+]
\ No newline at end of file
diff --git a/play/assets/tmpGame/scene/tmpScene.fire.meta b/play/assets/tmpGame/scene/Scene.fire.meta
similarity index 100%
rename from play/assets/tmpGame/scene/tmpScene.fire.meta
rename to play/assets/tmpGame/scene/Scene.fire.meta
diff --git a/play/assets/tmpGame/scene/tmpScene.fire b/play/assets/tmpGame/scene/tmpScene.fire
deleted file mode 100644
index d80b14f3ca5e8e64f90ac04107a90cb58f3b870b..0000000000000000000000000000000000000000
--- a/play/assets/tmpGame/scene/tmpScene.fire
+++ /dev/null
@@ -1,370 +0,0 @@
-[
-  {
-    "__type__": "cc.SceneAsset",
-    "_name": "",
-    "_objFlags": 0,
-    "_native": "",
-    "scene": {
-      "__id__": 1
-    }
-  },
-  {
-    "__type__": "cc.Scene",
-    "_objFlags": 0,
-    "_parent": null,
-    "_children": [
-      {
-        "__id__": 2
-      }
-    ],
-    "_active": false,
-    "_components": [],
-    "_prefab": null,
-    "_opacity": 255,
-    "_color": {
-      "__type__": "cc.Color",
-      "r": 255,
-      "g": 255,
-      "b": 255,
-      "a": 255
-    },
-    "_contentSize": {
-      "__type__": "cc.Size",
-      "width": 0,
-      "height": 0
-    },
-    "_anchorPoint": {
-      "__type__": "cc.Vec2",
-      "x": 0,
-      "y": 0
-    },
-    "_trs": {
-      "__type__": "TypedArray",
-      "ctor": "Float64Array",
-      "array": [
-        0,
-        0,
-        0,
-        0,
-        0,
-        0,
-        1,
-        1,
-        1,
-        1
-      ]
-    },
-    "_is3DNode": true,
-    "_groupIndex": 0,
-    "groupIndex": 0,
-    "autoReleaseAssets": true,
-    "_id": "57ea7c61-9b8b-498a-b024-c98ee9124beb"
-  },
-  {
-    "__type__": "cc.Node",
-    "_name": "Canvas",
-    "_objFlags": 0,
-    "_parent": {
-      "__id__": 1
-    },
-    "_children": [
-      {
-        "__id__": 3
-      },
-      {
-        "__id__": 5
-      }
-    ],
-    "_active": true,
-    "_components": [
-      {
-        "__id__": 7
-      },
-      {
-        "__id__": 8
-      },
-      {
-        "__id__": 9
-      }
-    ],
-    "_prefab": null,
-    "_opacity": 255,
-    "_color": {
-      "__type__": "cc.Color",
-      "r": 255,
-      "g": 255,
-      "b": 255,
-      "a": 255
-    },
-    "_contentSize": {
-      "__type__": "cc.Size",
-      "width": 960,
-      "height": 640
-    },
-    "_anchorPoint": {
-      "__type__": "cc.Vec2",
-      "x": 0.5,
-      "y": 0.5
-    },
-    "_trs": {
-      "__type__": "TypedArray",
-      "ctor": "Float64Array",
-      "array": [
-        480,
-        320,
-        0,
-        0,
-        0,
-        0,
-        1,
-        1,
-        1,
-        1
-      ]
-    },
-    "_eulerAngles": {
-      "__type__": "cc.Vec3",
-      "x": 0,
-      "y": 0,
-      "z": 0
-    },
-    "_skewX": 0,
-    "_skewY": 0,
-    "_is3DNode": false,
-    "_groupIndex": 0,
-    "groupIndex": 0,
-    "_id": "a5esZu+45LA5mBpvttspPD"
-  },
-  {
-    "__type__": "cc.Node",
-    "_name": "Main Camera",
-    "_objFlags": 0,
-    "_parent": {
-      "__id__": 2
-    },
-    "_children": [],
-    "_active": true,
-    "_components": [
-      {
-        "__id__": 4
-      }
-    ],
-    "_prefab": null,
-    "_opacity": 255,
-    "_color": {
-      "__type__": "cc.Color",
-      "r": 255,
-      "g": 255,
-      "b": 255,
-      "a": 255
-    },
-    "_contentSize": {
-      "__type__": "cc.Size",
-      "width": 960,
-      "height": 640
-    },
-    "_anchorPoint": {
-      "__type__": "cc.Vec2",
-      "x": 0.5,
-      "y": 0.5
-    },
-    "_trs": {
-      "__type__": "TypedArray",
-      "ctor": "Float64Array",
-      "array": [
-        0,
-        0,
-        511.82101363660325,
-        0,
-        0,
-        0,
-        1,
-        1,
-        1,
-        1
-      ]
-    },
-    "_eulerAngles": {
-      "__type__": "cc.Vec3",
-      "x": 0,
-      "y": 0,
-      "z": 0
-    },
-    "_skewX": 0,
-    "_skewY": 0,
-    "_is3DNode": false,
-    "_groupIndex": 0,
-    "groupIndex": 0,
-    "_id": "e1WoFrQ79G7r4ZuQE3HlNb"
-  },
-  {
-    "__type__": "cc.Camera",
-    "_name": "",
-    "_objFlags": 0,
-    "node": {
-      "__id__": 3
-    },
-    "_enabled": true,
-    "_cullingMask": 4294967295,
-    "_clearFlags": 7,
-    "_backgroundColor": {
-      "__type__": "cc.Color",
-      "r": 0,
-      "g": 0,
-      "b": 0,
-      "a": 255
-    },
-    "_depth": -1,
-    "_zoomRatio": 1,
-    "_targetTexture": null,
-    "_fov": 60,
-    "_orthoSize": 10,
-    "_nearClip": 1,
-    "_farClip": 4096,
-    "_ortho": true,
-    "_rect": {
-      "__type__": "cc.Rect",
-      "x": 0,
-      "y": 0,
-      "width": 1,
-      "height": 1
-    },
-    "_renderStages": 1,
-    "_alignWithScreen": true,
-    "_id": "81GN3uXINKVLeW4+iKSlim"
-  },
-  {
-    "__type__": "cc.Node",
-    "_name": "MusicNode",
-    "_objFlags": 0,
-    "_parent": {
-      "__id__": 2
-    },
-    "_children": [],
-    "_active": true,
-    "_components": [
-      {
-        "__id__": 6
-      }
-    ],
-    "_prefab": null,
-    "_opacity": 255,
-    "_color": {
-      "__type__": "cc.Color",
-      "r": 255,
-      "g": 255,
-      "b": 255,
-      "a": 255
-    },
-    "_contentSize": {
-      "__type__": "cc.Size",
-      "width": 0,
-      "height": 0
-    },
-    "_anchorPoint": {
-      "__type__": "cc.Vec2",
-      "x": 0.5,
-      "y": 0.5
-    },
-    "_trs": {
-      "__type__": "TypedArray",
-      "ctor": "Float64Array",
-      "array": [
-        0,
-        0,
-        0,
-        0,
-        0,
-        0,
-        1,
-        1,
-        1,
-        1
-      ]
-    },
-    "_eulerAngles": {
-      "__type__": "cc.Vec3",
-      "x": 0,
-      "y": 0,
-      "z": 0
-    },
-    "_skewX": 0,
-    "_skewY": 0,
-    "_is3DNode": false,
-    "_groupIndex": 0,
-    "groupIndex": 0,
-    "_id": "7dvmSP3MpJ9JVrZdBKlFPg"
-  },
-  {
-    "__type__": "193f7Pj1dtKzIc1hLupu+6E",
-    "_name": "",
-    "_objFlags": 0,
-    "node": {
-      "__id__": 5
-    },
-    "_enabled": true,
-    "bgm": null,
-    "星星": null,
-    "爆炸": null,
-    "眩晕": null,
-    "ç ¸": null,
-    "移动": null,
-    "结束": null,
-    "点击": null,
-    "_id": "12RCIBo/VE/qimm3KlDYPO"
-  },
-  {
-    "__type__": "cc.Canvas",
-    "_name": "",
-    "_objFlags": 0,
-    "node": {
-      "__id__": 2
-    },
-    "_enabled": true,
-    "_designResolution": {
-      "__type__": "cc.Size",
-      "width": 960,
-      "height": 640
-    },
-    "_fitWidth": false,
-    "_fitHeight": true,
-    "_id": "59Cd0ovbdF4byw5sbjJDx7"
-  },
-  {
-    "__type__": "cc.Widget",
-    "_name": "",
-    "_objFlags": 0,
-    "node": {
-      "__id__": 2
-    },
-    "_enabled": true,
-    "alignMode": 1,
-    "_target": null,
-    "_alignFlags": 45,
-    "_left": 0,
-    "_right": 0,
-    "_top": 0,
-    "_bottom": 0,
-    "_verticalCenter": 0,
-    "_horizontalCenter": 0,
-    "_isAbsLeft": true,
-    "_isAbsRight": true,
-    "_isAbsTop": true,
-    "_isAbsBottom": true,
-    "_isAbsHorizontalCenter": true,
-    "_isAbsVerticalCenter": true,
-    "_originalWidth": 0,
-    "_originalHeight": 0,
-    "_id": "29zXboiXFBKoIV4PQ2liTe"
-  },
-  {
-    "__type__": "b94c9j3n9FOLpOrY/uISJik",
-    "_name": "",
-    "_objFlags": 0,
-    "node": {
-      "__id__": 2
-    },
-    "_enabled": true,
-    "_id": "267A85TkVOKKVTUUoX8JjJ"
-  }
-]
\ No newline at end of file
diff --git a/play/assets/tmpGame/scene/tmpScene.js b/play/assets/tmpGame/scene/tmpScene.js
deleted file mode 100644
index 40eedea1b6e4ef8a4c2fc21e8eb60d03c4b87be6..0000000000000000000000000000000000000000
--- a/play/assets/tmpGame/scene/tmpScene.js
+++ /dev/null
@@ -1,38 +0,0 @@
-// 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,
-
-    properties: {
-        // foo: {
-        //     // ATTRIBUTES:
-        //     default: null,        // The default value will be used only when the component attaching
-        //                           // to a node for the first time
-        //     type: cc.SpriteFrame, // optional, default is typeof default
-        //     serializable: true,   // optional, default is true
-        // },
-        // bar: {
-        //     get () {
-        //         return this._bar;
-        //     },
-        //     set (value) {
-        //         this._bar = value;
-        //     }
-        // },
-    },
-
-    // LIFE-CYCLE CALLBACKS:
-
-    // onLoad () {},
-
-    start () {
-
-    },
-
-    // update (dt) {},
-});
diff --git a/play/assets/tmpGame/scene/tmpScene.js.meta b/play/assets/tmpGame/scene/tmpScene.js.meta
deleted file mode 100644
index aee2d74f96f136d1412abb3163192c72b31ead68..0000000000000000000000000000000000000000
--- a/play/assets/tmpGame/scene/tmpScene.js.meta
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "ver": "1.0.8",
-  "uuid": "b94c98f7-9fd1-4e2e-93ab-63fb884898a4",
-  "isPlugin": false,
-  "loadPluginInWeb": true,
-  "loadPluginInNative": true,
-  "loadPluginInEditor": false,
-  "subMetas": {}
-}
\ No newline at end of file
diff --git a/play/assets/tmpGame/script/MusicNode.js b/play/assets/tmpGame/script/MusicNode.js
deleted file mode 100644
index 331600848d9c881fe805a7ff8b3542cc088f505a..0000000000000000000000000000000000000000
--- a/play/assets/tmpGame/script/MusicNode.js
+++ /dev/null
@@ -1,73 +0,0 @@
-// 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,
-
-    properties: {
-        // foo: {
-        //     // ATTRIBUTES:
-        //     default: null,        // The default value will be used only when the component attaching
-        //                           // to a node for the first time
-        //     type: cc.SpriteFrame, // optional, default is typeof default
-        //     serializable: true,   // optional, default is true
-        // },
-        // bar: {
-        //     get () {
-        //         return this._bar;
-        //     },
-        //     set (value) {
-        //         this._bar = value;
-        //     }
-        // },
-        bgm: {
-            default: null,
-            type: cc.AudioClip
-        },
-        星星: {
-            default: null,
-            type: cc.AudioClip
-        },
-        爆炸: {
-            default: null,
-            type: cc.AudioClip
-        },
-        眩晕: {
-            default: null,
-            type: cc.AudioClip
-        },
-        ç ¸: {
-            default: null,
-            type: cc.AudioClip
-        },
-        移动: {
-            default: null,
-            type: cc.AudioClip
-        },
-        结束: {
-            default: null,
-            type: cc.AudioClip
-        },
-        点击: {
-            default: null,
-            type: cc.AudioClip
-        },
-    },
-
-    // LIFE-CYCLE CALLBACKS:
-
-    // onLoad () {},
-
-    start() {
-
-    },
-
-    playEffect(name, loop = false, volume = 1) {
-        cc.audioEngine.play(this[name], loop, volume);
-    }
-    // update (dt) {},
-});
diff --git a/play/assets/tmpGame/script/Scene.js b/play/assets/tmpGame/script/Scene.js
new file mode 100644
index 0000000000000000000000000000000000000000..59a6ba8dedb52b2f0bcda1d5b26cd280a8f93434
--- /dev/null
+++ b/play/assets/tmpGame/script/Scene.js
@@ -0,0 +1,361 @@
+// 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,
+
+	properties: {
+	},
+
+	// 生命周期 onLoad
+	onLoad() {
+		this.initSceneData();
+		this.initSize();
+	},
+
+	_imageResList: null,
+	_audioResList: null,
+	_animaResList: null,
+	initSceneData() {
+		this._imageResList = [];
+		this._audioResList = [];
+		this._animaResList = [];
+	},
+
+	_designSize: null,  // 设计分辨率
+	_frameSize: null,  // 屏幕分辨率
+	_mapScaleMin: null,  // 场景中常用缩放(取大值)
+	_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
+		let f = screen_size >= design_size
+		cc.Canvas.instance.fitHeight = f
+		cc.Canvas.instance.fitWidth = !f
+
+		const frameSize = cc.view.getFrameSize();
+		this._frameSize = frameSize;
+
+		this._designSize = cc.view.getDesignResolutionSize();
+
+		let sx = cc.winSize.width / frameSize.width;
+		let sy = cc.winSize.height / frameSize.height;
+		this._cocosScale = Math.min(sx, sy);
+
+		sx = frameSize.width / this._designSize.width;
+		sy = frameSize.height / this._designSize.height;
+		this._mapScaleMin = Math.min(sx, sy) * this._cocosScale;
+		this._mapScaleMax = Math.max(sx, sy) * this._cocosScale;
+	},
+
+
+	// 生命周期 start
+  start() {
+		let getData = this.getData.bind(this);
+		if (window && window.courseware) {
+			getData = window.courseware.getData;
+		}
+        
+		getData((data) => {
+			console.log('data:', data);
+			this.data = data || this.getDefaultData();
+			this.data = JSON.parse(JSON.stringify(this.data))
+			this.preloadItem()
+		})
+	},
+
+	getData(cb) {
+		cb(this.getDefaultData());
+	},
+
+	getDefaultData() {
+
+		const dataJson = '{"pic_url":"http://staging-teach.cdn.ireadabc.com/ed94332a503c31e0908bd4c6923a2665.png","pic_url_2":"http://staging-teach.cdn.ireadabc.com/5fb60317ade0195d35ad8034d5370a7f.png","text":"This is a test label.","audio_url":"http://staging-teach.cdn.ireadabc.com/f47f1d7b5c160fe1c59500d180346240.mp3"}'
+		const data = JSON.parse(dataJson);
+		return data;
+	},
+	
+	preloadItem() {
+		this.addPreloadImage();
+		this.addPreloadAudio();
+		this.addPreloadAnima();
+		this.preload();
+	},
+
+
+	addPreloadImage() {
+
+		this._imageResList.push({url: this.data.pic_url});
+		this._imageResList.push({url: this.data.pic_url_2});
+	},
+
+	addPreloadAudio() {
+
+		this._audioResList.push({url: this.data.audio_url});
+	},
+
+	addPreloadAnima() {
+
+	},
+
+	preload() {
+
+		const preloadArr = this._imageResList.concat(this._audioResList).concat(this._animaResList);
+		cc.assetManager.loadAny(preloadArr, null, null, (err, data) => {
+
+			this.loadEnd();
+			if (window && window["air"]) {
+				window["air"].hideAirClassLoading();
+			}
+			
+			cc.debug.setDisplayStats(false);
+		});
+	},
+
+
+	loadEnd() {
+		this.initData();
+		this.initAudio();
+		this.initView();
+		// this.initListener();
+	},
+
+	_cantouch: null,
+	initData() {
+		// 所有全局变量 默认都是null 
+		this._cantouch = true;
+	},
+	
+	audioBtn: null,
+	initAudio() {
+		const audioNode = cc.find('Canvas/res/audio');
+
+		const getAudioByResName = (resName) => {
+			return audioNode.getChildByName(resName).getComponent(cc.AudioSource);
+		}
+
+		this.audioBtn = getAudioByResName('btn');
+
+	},
+
+
+	initView() {
+
+		this.initBg();
+		this.initPic();
+		this.initBtn();
+		this.initIcon();
+	},
+
+	initBg() {
+		const bgNode = cc.find('Canvas/bg');
+		bgNode.scale = this._mapScaleMax;
+	},
+
+	pic1: null,
+	pic2: null,
+	initPic() {
+		const canvas = cc.find('Canvas');
+		const maxW = canvas.width * 0.7;
+
+		this.getSprNodeByUrl(this.data.pic_url, (sprNode) => {
+			const picNode1 = sprNode;
+			picNode1.scale = maxW / picNode1.width;
+			picNode1.baseX = picNode1.x;
+			canvas.addChild(picNode1);
+			this.pic1 = picNode1;	
+
+			const labelNode = new cc.Node();
+			labelNode.color = cc.Color.YELLOW;
+			const label = labelNode.addComponent(cc.Label);
+			label.string = this.data.text;
+			label.fontSize = 60;
+			label.lineHeight = 60;
+			label.font = cc.find('Canvas/res/font/BRLNSDB').getComponent('cc.Label').font;
+			picNode1.addChild(labelNode);
+		});
+
+		this.getSprNodeByUrl(this.data.pic_url_2, (sprNode) => {
+			const picNode2 = sprNode;
+			picNode2.scale = maxW / picNode2.width;
+			canvas.addChild(picNode2);
+			picNode2.x = canvas.width;
+			picNode2.baseX = picNode2.x;
+			this.pic2 = picNode2;
+
+			const labelNode = new cc.Node();
+			const label = labelNode.addComponent(cc.RichText);
+			const size = 60
+			label.font = cc.find('Canvas/res/font/BRLNSDB').getComponent(cc.Label).font;
+			label.string = `<outline color=#751e00 width=4><size=${size}><color=#ffffff>${this.data.text}</color></size></outline>`
+			label.lineHeight = size;
+			picNode2.addChild(labelNode);
+		});
+
+	},
+
+	initIcon() {
+		const iconNode = this.getSprNode('icon');
+		iconNode.zIndex = 5;
+		iconNode.anchorX = 1;
+		iconNode.anchorY = 1;
+		iconNode.parent = cc.find('Canvas');
+		iconNode.x = iconNode.parent.width / 2 - 10;
+		iconNode.y = iconNode.parent.height / 2 - 10;
+
+		iconNode.on(cc.Node.EventType.TOUCH_START, () => {
+			this.playAudioByUrl(this.data.audio_url);
+		})
+	},
+
+	curPage: null,
+	initBtn() {
+
+		this.curPage = 0;
+		const bottomPart = cc.find('Canvas/bottomPart');
+		bottomPart.zIndex = 5; // 提高层级
+		
+		bottomPart.x = bottomPart.parent.width / 2;
+		bottomPart.y = -bottomPart.parent.height / 2;
+
+		const leftBtnNode = bottomPart.getChildByName('btn_left');  
+		//节点中添加了button组件 则可以添加click事件监听
+		leftBtnNode.on('click', () => {
+			if (!this._cantouch) {
+				return;
+			}
+			if (this.curPage == 0) {
+				return;
+			}
+			this.curPage = 0
+			this.leftMove();
+
+			cc.audioEngine.play(this.audioBtn.clip, false, 0.8)
+		})
+
+		const rightBtnNode = bottomPart.getChildByName('btn_right');  
+		//节点中添加了button组件 则可以添加click事件监听
+		rightBtnNode.on('click', () => {
+			if (!this._cantouch) {
+				return;
+			}
+			if (this.curPage == 1) {
+				return;
+			}
+			
+			this.curPage = 1
+			this.rightMove();
+
+			cc.audioEngine.play(this.audioBtn.clip, false, 0.5)
+		})
+	},
+
+	leftMove() {
+		this._cantouch = false;
+		const len = this.pic1.parent.width;
+		cc.tween(this.pic1)
+			.to(1, {x: this.pic1.baseX}, {easing: 'cubicInOut'})
+			.start();
+
+		cc.tween(this.pic2)
+			.to(1, {x: this.pic2.baseX}, {easing: 'cubicInOut'})
+			.call(() => {
+				this._cantouch = true;
+			})
+			.start();
+	},
+
+	rightMove() {
+		this._cantouch = false;
+		const len = this.pic1.parent.width;
+		cc.tween(this.pic1)
+			.to(1, {x: this.pic1.baseX - len}, {easing: 'cubicInOut'})
+			.start();
+
+		cc.tween(this.pic2)
+			.to(1, {x: this.pic2.baseX - len}, {easing: 'cubicInOut'})
+			.call(() => {
+				this._cantouch = true;
+			})
+			.start();
+	},
+		// update (dt) {},
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	// ------------------------------------------------
+	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;
+	},
+
+
+	getSpriteFrimeByUrl(url, cb) {
+		cc.loader.load({url}, (err, img) => {
+			const spriteFrame = new cc.SpriteFrame(img)
+			if (cb) {
+				cb(spriteFrame);
+			}
+		})
+	},
+
+	getSprNodeByUrl(url, cb) {
+		const node = new cc.Node();
+		const spr = node.addComponent(cc.Sprite);
+		this.getSpriteFrimeByUrl(url, (sf) => {
+			spr.spriteFrame = sf;
+			if (cb) {
+				cb(node);
+			}
+		})
+	},
+
+	playAudioByUrl(audio_url, cb=null) {
+		if (audio_url) {
+			cc.assetManager.loadRemote(audio_url, (err, audioClip) => {
+				const audioId = cc.audioEngine.play(audioClip, false, 0.8);
+				if (cb) {
+					cc.audioEngine.setFinishCallback(audioId, () => {
+						cb();
+					});
+				}
+			});
+		}
+	},
+
+	// ------------------------------------------
+
+});
diff --git a/play/assets/tmpGame/script/MusicNode.js.meta b/play/assets/tmpGame/script/Scene.js.meta
similarity index 74%
rename from play/assets/tmpGame/script/MusicNode.js.meta
rename to play/assets/tmpGame/script/Scene.js.meta
index c88acd5def00a98ba37ad8a63020af973e37c22b..76586520228a6b3e46f8441353b67382ce980986 100644
--- a/play/assets/tmpGame/script/MusicNode.js.meta
+++ b/play/assets/tmpGame/script/Scene.js.meta
@@ -1,6 +1,6 @@
 {
   "ver": "1.0.8",
-  "uuid": "193f73e3-d5db-4acc-8735-84bba9bbee84",
+  "uuid": "f4ede462-f8d7-4069-ba80-915611c058ca",
   "isPlugin": false,
   "loadPluginInWeb": true,
   "loadPluginInNative": true,
diff --git a/play/assets/tmpGame/script/defaultData.js b/play/assets/tmpGame/script/defaultData.js
deleted file mode 100644
index 48fc82b5910e1654e4d8f5754e82b6f2533948b9..0000000000000000000000000000000000000000
--- a/play/assets/tmpGame/script/defaultData.js
+++ /dev/null
@@ -1,34 +0,0 @@
-module.exports = {
-    roundList: [{
-        audio: 'ball',
-        questionList: [{
-            rightAudio: 'b',
-            rightWord: 'b',
-            wrongWordList: ['p', 'd'],
-            wrongAudioList: ['p.mp3', 'd.mp3'],
-        }, {
-            rightAudio: 'a',
-            rightWord: 'all',
-            wrongWordList: ['ao', 'arl'],
-            wrongAudioList: ['ao.mp3', 'arl.mp3'],
-        }]
-    }, {
-        audio: 'banana',
-        questionList: [{
-            rightAudio: 'baa',
-            rightWord: 'ba',
-            wrongWordList: ['pa', 'da'],
-            wrongAudioList: ['pa.mp3', 'da.mp3'],
-        }, {
-            rightAudio: 'na',
-            rightWord: 'na',
-            wrongWordList: ['ma', 'ha'],
-            wrongAudioList: ['ma.mp3', 'ha.mp3'],
-        }, {
-            rightAudio: 'na',
-            rightWord: 'na',
-            wrongWordList: ['ma', 'ha'],
-            wrongAudioList: ['ma.mp3', 'ha.mp3'],
-        }]
-    }],
-}
diff --git a/play/assets/tmpGame/script/defaultData.js.meta b/play/assets/tmpGame/script/defaultData.js.meta
deleted file mode 100644
index 0d5edd248d2d49190922727a861d57ea25cffa8e..0000000000000000000000000000000000000000
--- a/play/assets/tmpGame/script/defaultData.js.meta
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "ver": "1.0.8",
-  "uuid": "8bcec27f-bb4b-4987-8289-3880d6079364",
-  "isPlugin": false,
-  "loadPluginInWeb": true,
-  "loadPluginInNative": true,
-  "loadPluginInEditor": false,
-  "subMetas": {}
-}
\ No newline at end of file
diff --git a/play/assets/tmpGame/script/runtime.js b/play/assets/tmpGame/script/runtime.js
deleted file mode 100644
index 22e7b005c29c97df656f5af672e2212fb828267a..0000000000000000000000000000000000000000
--- a/play/assets/tmpGame/script/runtime.js
+++ /dev/null
@@ -1,727 +0,0 @@
-/**
- * Copyright (c) 2014-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-!(function(global) {
-  "use strict";
-
-  var Op = Object.prototype;
-  var hasOwn = Op.hasOwnProperty;
-  var undefined; // More compressible than void 0.
-  var $Symbol = typeof Symbol === "function" ? Symbol : {};
-  var iteratorSymbol = $Symbol.iterator || "@@iterator";
-  var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
-  var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
-
-  var inModule = typeof module === "object";
-  var runtime = global.regeneratorRuntime;
-  if (runtime) {
-    if (inModule) {
-      // If regeneratorRuntime is defined globally and we're in a module,
-      // make the exports object identical to regeneratorRuntime.
-      module.exports = runtime;
-    }
-    // Don't bother evaluating the rest of this file if the runtime was
-    // already defined globally.
-    return;
-  }
-
-  // Define the runtime globally (as expected by generated code) as either
-  // module.exports (if we're in a module) or a new, empty object.
-  runtime = global.regeneratorRuntime = inModule ? module.exports : {};
-
-  function wrap(innerFn, outerFn, self, tryLocsList) {
-    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
-    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
-    var generator = Object.create(protoGenerator.prototype);
-    var context = new Context(tryLocsList || []);
-
-    // The ._invoke method unifies the implementations of the .next,
-    // .throw, and .return methods.
-    generator._invoke = makeInvokeMethod(innerFn, self, context);
-
-    return generator;
-  }
-  runtime.wrap = wrap;
-
-  // Try/catch helper to minimize deoptimizations. Returns a completion
-  // record like context.tryEntries[i].completion. This interface could
-  // have been (and was previously) designed to take a closure to be
-  // invoked without arguments, but in all the cases we care about we
-  // already have an existing method we want to call, so there's no need
-  // to create a new function object. We can even get away with assuming
-  // the method takes exactly one argument, since that happens to be true
-  // in every case, so we don't have to touch the arguments object. The
-  // only additional allocation required is the completion record, which
-  // has a stable shape and so hopefully should be cheap to allocate.
-  function tryCatch(fn, obj, arg) {
-    try {
-      return { type: "normal", arg: fn.call(obj, arg) };
-    } catch (err) {
-      return { type: "throw", arg: err };
-    }
-  }
-
-  var GenStateSuspendedStart = "suspendedStart";
-  var GenStateSuspendedYield = "suspendedYield";
-  var GenStateExecuting = "executing";
-  var GenStateCompleted = "completed";
-
-  // Returning this object from the innerFn has the same effect as
-  // breaking out of the dispatch switch statement.
-  var ContinueSentinel = {};
-
-  // Dummy constructor functions that we use as the .constructor and
-  // .constructor.prototype properties for functions that return Generator
-  // objects. For full spec compliance, you may wish to configure your
-  // minifier not to mangle the names of these two functions.
-  function Generator() {}
-  function GeneratorFunction() {}
-  function GeneratorFunctionPrototype() {}
-
-  // This is a polyfill for %IteratorPrototype% for environments that
-  // don't natively support it.
-  var IteratorPrototype = {};
-  IteratorPrototype[iteratorSymbol] = function () {
-    return this;
-  };
-
-  var getProto = Object.getPrototypeOf;
-  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
-  if (NativeIteratorPrototype &&
-      NativeIteratorPrototype !== Op &&
-      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
-    // This environment has a native %IteratorPrototype%; use it instead
-    // of the polyfill.
-    IteratorPrototype = NativeIteratorPrototype;
-  }
-
-  var Gp = GeneratorFunctionPrototype.prototype =
-    Generator.prototype = Object.create(IteratorPrototype);
-  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
-  GeneratorFunctionPrototype.constructor = GeneratorFunction;
-  GeneratorFunctionPrototype[toStringTagSymbol] =
-    GeneratorFunction.displayName = "GeneratorFunction";
-
-  // Helper for defining the .next, .throw, and .return methods of the
-  // Iterator interface in terms of a single ._invoke method.
-  function defineIteratorMethods(prototype) {
-    ["next", "throw", "return"].forEach(function(method) {
-      prototype[method] = function(arg) {
-        return this._invoke(method, arg);
-      };
-    });
-  }
-
-  runtime.isGeneratorFunction = function(genFun) {
-    var ctor = typeof genFun === "function" && genFun.constructor;
-    return ctor
-      ? ctor === GeneratorFunction ||
-        // For the native GeneratorFunction constructor, the best we can
-        // do is to check its .name property.
-        (ctor.displayName || ctor.name) === "GeneratorFunction"
-      : false;
-  };
-
-  runtime.mark = function(genFun) {
-    if (Object.setPrototypeOf) {
-      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
-    } else {
-      genFun.__proto__ = GeneratorFunctionPrototype;
-      if (!(toStringTagSymbol in genFun)) {
-        genFun[toStringTagSymbol] = "GeneratorFunction";
-      }
-    }
-    genFun.prototype = Object.create(Gp);
-    return genFun;
-  };
-
-  // Within the body of any async function, `await x` is transformed to
-  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
-  // `hasOwn.call(value, "__await")` to determine if the yielded value is
-  // meant to be awaited.
-  runtime.awrap = function(arg) {
-    return { __await: arg };
-  };
-
-  function AsyncIterator(generator) {
-    function invoke(method, arg, resolve, reject) {
-      var record = tryCatch(generator[method], generator, arg);
-      if (record.type === "throw") {
-        reject(record.arg);
-      } else {
-        var result = record.arg;
-        var value = result.value;
-        if (value &&
-            typeof value === "object" &&
-            hasOwn.call(value, "__await")) {
-          return Promise.resolve(value.__await).then(function(value) {
-            invoke("next", value, resolve, reject);
-          }, function(err) {
-            invoke("throw", err, resolve, reject);
-          });
-        }
-
-        return Promise.resolve(value).then(function(unwrapped) {
-          // When a yielded Promise is resolved, its final value becomes
-          // the .value of the Promise<{value,done}> result for the
-          // current iteration. If the Promise is rejected, however, the
-          // result for this iteration will be rejected with the same
-          // reason. Note that rejections of yielded Promises are not
-          // thrown back into the generator function, as is the case
-          // when an awaited Promise is rejected. This difference in
-          // behavior between yield and await is important, because it
-          // allows the consumer to decide what to do with the yielded
-          // rejection (swallow it and continue, manually .throw it back
-          // into the generator, abandon iteration, whatever). With
-          // await, by contrast, there is no opportunity to examine the
-          // rejection reason outside the generator function, so the
-          // only option is to throw it from the await expression, and
-          // let the generator function handle the exception.
-          result.value = unwrapped;
-          resolve(result);
-        }, reject);
-      }
-    }
-
-    var previousPromise;
-
-    function enqueue(method, arg) {
-      function callInvokeWithMethodAndArg() {
-        return new Promise(function(resolve, reject) {
-          invoke(method, arg, resolve, reject);
-        });
-      }
-
-      return previousPromise =
-        // If enqueue has been called before, then we want to wait until
-        // all previous Promises have been resolved before calling invoke,
-        // so that results are always delivered in the correct order. If
-        // enqueue has not been called before, then it is important to
-        // call invoke immediately, without waiting on a callback to fire,
-        // so that the async generator function has the opportunity to do
-        // any necessary setup in a predictable way. This predictability
-        // is why the Promise constructor synchronously invokes its
-        // executor callback, and why async functions synchronously
-        // execute code before the first await. Since we implement simple
-        // async functions in terms of async generators, it is especially
-        // important to get this right, even though it requires care.
-        previousPromise ? previousPromise.then(
-          callInvokeWithMethodAndArg,
-          // Avoid propagating failures to Promises returned by later
-          // invocations of the iterator.
-          callInvokeWithMethodAndArg
-        ) : callInvokeWithMethodAndArg();
-    }
-
-    // Define the unified helper method that is used to implement .next,
-    // .throw, and .return (see defineIteratorMethods).
-    this._invoke = enqueue;
-  }
-
-  defineIteratorMethods(AsyncIterator.prototype);
-  AsyncIterator.prototype[asyncIteratorSymbol] = function () {
-    return this;
-  };
-  runtime.AsyncIterator = AsyncIterator;
-
-  // Note that simple async functions are implemented on top of
-  // AsyncIterator objects; they just return a Promise for the value of
-  // the final result produced by the iterator.
-  runtime.async = function(innerFn, outerFn, self, tryLocsList) {
-    var iter = new AsyncIterator(
-      wrap(innerFn, outerFn, self, tryLocsList)
-    );
-
-    return runtime.isGeneratorFunction(outerFn)
-      ? iter // If outerFn is a generator, return the full iterator.
-      : iter.next().then(function(result) {
-          return result.done ? result.value : iter.next();
-        });
-  };
-
-  function makeInvokeMethod(innerFn, self, context) {
-    var state = GenStateSuspendedStart;
-
-    return function invoke(method, arg) {
-      if (state === GenStateExecuting) {
-        throw new Error("Generator is already running");
-      }
-
-      if (state === GenStateCompleted) {
-        if (method === "throw") {
-          throw arg;
-        }
-
-        // Be forgiving, per 25.3.3.3.3 of the spec:
-        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
-        return doneResult();
-      }
-
-      context.method = method;
-      context.arg = arg;
-
-      while (true) {
-        var delegate = context.delegate;
-        if (delegate) {
-          var delegateResult = maybeInvokeDelegate(delegate, context);
-          if (delegateResult) {
-            if (delegateResult === ContinueSentinel) continue;
-            return delegateResult;
-          }
-        }
-
-        if (context.method === "next") {
-          // Setting context._sent for legacy support of Babel's
-          // function.sent implementation.
-          context.sent = context._sent = context.arg;
-
-        } else if (context.method === "throw") {
-          if (state === GenStateSuspendedStart) {
-            state = GenStateCompleted;
-            throw context.arg;
-          }
-
-          context.dispatchException(context.arg);
-
-        } else if (context.method === "return") {
-          context.abrupt("return", context.arg);
-        }
-
-        state = GenStateExecuting;
-
-        var record = tryCatch(innerFn, self, context);
-        if (record.type === "normal") {
-          // If an exception is thrown from innerFn, we leave state ===
-          // GenStateExecuting and loop back for another invocation.
-          state = context.done
-            ? GenStateCompleted
-            : GenStateSuspendedYield;
-
-          if (record.arg === ContinueSentinel) {
-            continue;
-          }
-
-          return {
-            value: record.arg,
-            done: context.done
-          };
-
-        } else if (record.type === "throw") {
-          state = GenStateCompleted;
-          // Dispatch the exception by looping back around to the
-          // context.dispatchException(context.arg) call above.
-          context.method = "throw";
-          context.arg = record.arg;
-        }
-      }
-    };
-  }
-
-  // Call delegate.iterator[context.method](context.arg) and handle the
-  // result, either by returning a { value, done } result from the
-  // delegate iterator, or by modifying context.method and context.arg,
-  // setting context.delegate to null, and returning the ContinueSentinel.
-  function maybeInvokeDelegate(delegate, context) {
-    var method = delegate.iterator[context.method];
-    if (method === undefined) {
-      // A .throw or .return when the delegate iterator has no .throw
-      // method always terminates the yield* loop.
-      context.delegate = null;
-
-      if (context.method === "throw") {
-        if (delegate.iterator.return) {
-          // If the delegate iterator has a return method, give it a
-          // chance to clean up.
-          context.method = "return";
-          context.arg = undefined;
-          maybeInvokeDelegate(delegate, context);
-
-          if (context.method === "throw") {
-            // If maybeInvokeDelegate(context) changed context.method from
-            // "return" to "throw", let that override the TypeError below.
-            return ContinueSentinel;
-          }
-        }
-
-        context.method = "throw";
-        context.arg = new TypeError(
-          "The iterator does not provide a 'throw' method");
-      }
-
-      return ContinueSentinel;
-    }
-
-    var record = tryCatch(method, delegate.iterator, context.arg);
-
-    if (record.type === "throw") {
-      context.method = "throw";
-      context.arg = record.arg;
-      context.delegate = null;
-      return ContinueSentinel;
-    }
-
-    var info = record.arg;
-
-    if (! info) {
-      context.method = "throw";
-      context.arg = new TypeError("iterator result is not an object");
-      context.delegate = null;
-      return ContinueSentinel;
-    }
-
-    if (info.done) {
-      // Assign the result of the finished delegate to the temporary
-      // variable specified by delegate.resultName (see delegateYield).
-      context[delegate.resultName] = info.value;
-
-      // Resume execution at the desired location (see delegateYield).
-      context.next = delegate.nextLoc;
-
-      // If context.method was "throw" but the delegate handled the
-      // exception, let the outer generator proceed normally. If
-      // context.method was "next", forget context.arg since it has been
-      // "consumed" by the delegate iterator. If context.method was
-      // "return", allow the original .return call to continue in the
-      // outer generator.
-      if (context.method !== "return") {
-        context.method = "next";
-        context.arg = undefined;
-      }
-
-    } else {
-      // Re-yield the result returned by the delegate method.
-      return info;
-    }
-
-    // The delegate iterator is finished, so forget it and continue with
-    // the outer generator.
-    context.delegate = null;
-    return ContinueSentinel;
-  }
-
-  // Define Generator.prototype.{next,throw,return} in terms of the
-  // unified ._invoke helper method.
-  defineIteratorMethods(Gp);
-
-  Gp[toStringTagSymbol] = "Generator";
-
-  // A Generator should always return itself as the iterator object when the
-  // @@iterator function is called on it. Some browsers' implementations of the
-  // iterator prototype chain incorrectly implement this, causing the Generator
-  // object to not be returned from this call. This ensures that doesn't happen.
-  // See https://github.com/facebook/regenerator/issues/274 for more details.
-  Gp[iteratorSymbol] = function() {
-    return this;
-  };
-
-  Gp.toString = function() {
-    return "[object Generator]";
-  };
-
-  function pushTryEntry(locs) {
-    var entry = { tryLoc: locs[0] };
-
-    if (1 in locs) {
-      entry.catchLoc = locs[1];
-    }
-
-    if (2 in locs) {
-      entry.finallyLoc = locs[2];
-      entry.afterLoc = locs[3];
-    }
-
-    this.tryEntries.push(entry);
-  }
-
-  function resetTryEntry(entry) {
-    var record = entry.completion || {};
-    record.type = "normal";
-    delete record.arg;
-    entry.completion = record;
-  }
-
-  function Context(tryLocsList) {
-    // The root entry object (effectively a try statement without a catch
-    // or a finally block) gives us a place to store values thrown from
-    // locations where there is no enclosing try statement.
-    this.tryEntries = [{ tryLoc: "root" }];
-    tryLocsList.forEach(pushTryEntry, this);
-    this.reset(true);
-  }
-
-  runtime.keys = function(object) {
-    var keys = [];
-    for (var key in object) {
-      keys.push(key);
-    }
-    keys.reverse();
-
-    // Rather than returning an object with a next method, we keep
-    // things simple and return the next function itself.
-    return function next() {
-      while (keys.length) {
-        var key = keys.pop();
-        if (key in object) {
-          next.value = key;
-          next.done = false;
-          return next;
-        }
-      }
-
-      // To avoid creating an additional object, we just hang the .value
-      // and .done properties off the next function object itself. This
-      // also ensures that the minifier will not anonymize the function.
-      next.done = true;
-      return next;
-    };
-  };
-
-  function values(iterable) {
-    if (iterable) {
-      var iteratorMethod = iterable[iteratorSymbol];
-      if (iteratorMethod) {
-        return iteratorMethod.call(iterable);
-      }
-
-      if (typeof iterable.next === "function") {
-        return iterable;
-      }
-
-      if (!isNaN(iterable.length)) {
-        var i = -1, next = function next() {
-          while (++i < iterable.length) {
-            if (hasOwn.call(iterable, i)) {
-              next.value = iterable[i];
-              next.done = false;
-              return next;
-            }
-          }
-
-          next.value = undefined;
-          next.done = true;
-
-          return next;
-        };
-
-        return next.next = next;
-      }
-    }
-
-    // Return an iterator with no values.
-    return { next: doneResult };
-  }
-  runtime.values = values;
-
-  function doneResult() {
-    return { value: undefined, done: true };
-  }
-
-  Context.prototype = {
-    constructor: Context,
-
-    reset: function(skipTempReset) {
-      this.prev = 0;
-      this.next = 0;
-      // Resetting context._sent for legacy support of Babel's
-      // function.sent implementation.
-      this.sent = this._sent = undefined;
-      this.done = false;
-      this.delegate = null;
-
-      this.method = "next";
-      this.arg = undefined;
-
-      this.tryEntries.forEach(resetTryEntry);
-
-      if (!skipTempReset) {
-        for (var name in this) {
-          // Not sure about the optimal order of these conditions:
-          if (name.charAt(0) === "t" &&
-              hasOwn.call(this, name) &&
-              !isNaN(+name.slice(1))) {
-            this[name] = undefined;
-          }
-        }
-      }
-    },
-
-    stop: function() {
-      this.done = true;
-
-      var rootEntry = this.tryEntries[0];
-      var rootRecord = rootEntry.completion;
-      if (rootRecord.type === "throw") {
-        throw rootRecord.arg;
-      }
-
-      return this.rval;
-    },
-
-    dispatchException: function(exception) {
-      if (this.done) {
-        throw exception;
-      }
-
-      var context = this;
-      function handle(loc, caught) {
-        record.type = "throw";
-        record.arg = exception;
-        context.next = loc;
-
-        if (caught) {
-          // If the dispatched exception was caught by a catch block,
-          // then let that catch block handle the exception normally.
-          context.method = "next";
-          context.arg = undefined;
-        }
-
-        return !! caught;
-      }
-
-      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
-        var entry = this.tryEntries[i];
-        var record = entry.completion;
-
-        if (entry.tryLoc === "root") {
-          // Exception thrown outside of any try block that could handle
-          // it, so set the completion value of the entire function to
-          // throw the exception.
-          return handle("end");
-        }
-
-        if (entry.tryLoc <= this.prev) {
-          var hasCatch = hasOwn.call(entry, "catchLoc");
-          var hasFinally = hasOwn.call(entry, "finallyLoc");
-
-          if (hasCatch && hasFinally) {
-            if (this.prev < entry.catchLoc) {
-              return handle(entry.catchLoc, true);
-            } else if (this.prev < entry.finallyLoc) {
-              return handle(entry.finallyLoc);
-            }
-
-          } else if (hasCatch) {
-            if (this.prev < entry.catchLoc) {
-              return handle(entry.catchLoc, true);
-            }
-
-          } else if (hasFinally) {
-            if (this.prev < entry.finallyLoc) {
-              return handle(entry.finallyLoc);
-            }
-
-          } else {
-            throw new Error("try statement without catch or finally");
-          }
-        }
-      }
-    },
-
-    abrupt: function(type, arg) {
-      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
-        var entry = this.tryEntries[i];
-        if (entry.tryLoc <= this.prev &&
-            hasOwn.call(entry, "finallyLoc") &&
-            this.prev < entry.finallyLoc) {
-          var finallyEntry = entry;
-          break;
-        }
-      }
-
-      if (finallyEntry &&
-          (type === "break" ||
-           type === "continue") &&
-          finallyEntry.tryLoc <= arg &&
-          arg <= finallyEntry.finallyLoc) {
-        // Ignore the finally entry if control is not jumping to a
-        // location outside the try/catch block.
-        finallyEntry = null;
-      }
-
-      var record = finallyEntry ? finallyEntry.completion : {};
-      record.type = type;
-      record.arg = arg;
-
-      if (finallyEntry) {
-        this.method = "next";
-        this.next = finallyEntry.finallyLoc;
-        return ContinueSentinel;
-      }
-
-      return this.complete(record);
-    },
-
-    complete: function(record, afterLoc) {
-      if (record.type === "throw") {
-        throw record.arg;
-      }
-
-      if (record.type === "break" ||
-          record.type === "continue") {
-        this.next = record.arg;
-      } else if (record.type === "return") {
-        this.rval = this.arg = record.arg;
-        this.method = "return";
-        this.next = "end";
-      } else if (record.type === "normal" && afterLoc) {
-        this.next = afterLoc;
-      }
-
-      return ContinueSentinel;
-    },
-
-    finish: function(finallyLoc) {
-      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
-        var entry = this.tryEntries[i];
-        if (entry.finallyLoc === finallyLoc) {
-          this.complete(entry.completion, entry.afterLoc);
-          resetTryEntry(entry);
-          return ContinueSentinel;
-        }
-      }
-    },
-
-    "catch": function(tryLoc) {
-      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
-        var entry = this.tryEntries[i];
-        if (entry.tryLoc === tryLoc) {
-          var record = entry.completion;
-          if (record.type === "throw") {
-            var thrown = record.arg;
-            resetTryEntry(entry);
-          }
-          return thrown;
-        }
-      }
-
-      // The context.catch method must only be called with a location
-      // argument that corresponds to a known catch block.
-      throw new Error("illegal catch attempt");
-    },
-
-    delegateYield: function(iterable, resultName, nextLoc) {
-      this.delegate = {
-        iterator: values(iterable),
-        resultName: resultName,
-        nextLoc: nextLoc
-      };
-
-      if (this.method === "next") {
-        // Deliberately forget the last sent value so that we don't
-        // accidentally pass it on to the delegate.
-        this.arg = undefined;
-      }
-
-      return ContinueSentinel;
-    }
-  };
-})(
-  // In sloppy mode, unbound `this` refers to the global object, fallback to
-  // Function constructor if we're in global strict mode. That is sadly a form
-  // of indirect eval which violates Content Security Policy.
-  (function() { return this })() || Function("return this")()
-);
diff --git a/play/assets/tmpGame/script/runtime.js.meta b/play/assets/tmpGame/script/runtime.js.meta
deleted file mode 100644
index 6def01a8165ff41595abd1ebf14a303363044fc6..0000000000000000000000000000000000000000
--- a/play/assets/tmpGame/script/runtime.js.meta
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "ver": "1.0.8",
-  "uuid": "d07c22c6-ea88-491a-8716-e509d7265361",
-  "isPlugin": false,
-  "loadPluginInWeb": true,
-  "loadPluginInNative": true,
-  "loadPluginInEditor": false,
-  "subMetas": {}
-}
\ No newline at end of file
diff --git a/play/assets/tmpGame/script/util.js b/play/assets/tmpGame/script/util.js
new file mode 100644
index 0000000000000000000000000000000000000000..94af9b9d974c4b15bbaf94eb2ba3ae6bee268a23
--- /dev/null
+++ b/play/assets/tmpGame/script/util.js
@@ -0,0 +1,134 @@
+export function getPosByAngle(angle, len) {
+
+  const radian = angle * Math.PI / 180;
+  const x = Math.sin(radian) * len;
+  const y = Math.cos(radian) * len;
+
+  return { x, y };
+
+}
+
+export function getAngleByPos(px, py, mx, my) {
+
+  const x = Math.abs(px - mx);
+  const y = Math.abs(py - my);
+
+  const z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
+  const cos = y / z;
+  const radina = Math.acos(cos); // 用反三角函数求弧度
+  let angle = Math.floor(180 / (Math.PI / radina) * 100) / 100; // 将弧度转换成角度
+
+  if (mx > px && my > py) {// 鼠标在第四象限
+    angle = 180 - angle;
+  }
+  if (mx === px && my > py) {// 鼠标在y轴负方向上
+    angle = 180;
+  }
+  if (mx > px && my === py) {// 鼠标在x轴正方向上
+    angle = 90;
+  }
+  if (mx < px && my > py) {// 鼠标在第三象限
+    angle = 180 + angle;
+  }
+  if (mx < px && my === py) {// 鼠标在x轴负方向
+    angle = 270;
+  }
+  if (mx < px && my < py) {// 鼠标在第二象限
+    angle = 360 - angle;
+  }
+
+  // console.log('angle: ', angle);
+  return angle;
+
+}
+
+export function exchangeNodePos(baseNode, targetNode) {
+  return baseNode.convertToNodeSpaceAR(targetNode._parent.convertToWorldSpaceAR(cc.v2(targetNode.x, targetNode.y)));
+}
+
+export function RandomInt(a, b = 0) {
+  let max = Math.max(a, b);
+  let min = Math.min(a, b);
+  return Math.floor(Math.random() * (max - min) + min);
+}
+
+export function randomSortByArr(arr) {
+  const newArr = [];
+  const tmpArr = arr.concat();
+  while (tmpArr.length > 0) {
+    const randomIndex = Math.floor(tmpArr.length * Math.random());
+    newArr.push(tmpArr[randomIndex]);
+    tmpArr.splice(randomIndex, 1);
+  }
+  return newArr;
+}
+
+export function setSprNodeMaxLen(sprNode, maxW, maxH) {
+  const sx = maxW / sprNode.width;
+  const sy = maxH / sprNode.height;
+  const s = Math.min(sx, sy);
+  sprNode.scale = Math.round(s * 1000) / 1000;
+}
+
+export function localPosTolocalPos(baseNode, targetNode) {
+	const worldPos = targetNode.parent.convertToWorldSpaceAR(cc.v2(targetNode.x, targetNode.y));
+	const localPos = baseNode.parent.convertToNodeSpaceAR(cc.v2(worldPos.x, worldPos.y));
+	return localPos;
+}
+
+export function worldPosToLocalPos(worldPos, baseNode) {
+	const localPos = baseNode.parent.convertToNodeSpaceAR(cc.v2(worldPos.x, worldPos.y));
+	return localPos;
+}
+
+export function getScaleRateBy2Node(baseNode, targetNode, maxFlag = true) {
+	const worldRect1 = targetNode.getBoundingBoxToWorld();
+	const worldRect2 = baseNode.getBoundingBoxToWorld();
+
+	const sx = worldRect1.width / worldRect2.width;
+	const sy = worldRect1.height / worldRect2.height;
+	if (maxFlag) {
+		return Math.max(sx, sy);
+	} else {
+		return Math.min(sx, sy);
+	}
+}
+
+export function getDistance (start, end){
+    var pos = cc.v2(start.x - end.x, start.y - end.y);
+    var dis = Math.sqrt(pos.x*pos.x + pos.y*pos.y);
+    return dis;
+}
+
+export function playAudioByUrl(audio_url, cb=null) {
+	if (audio_url) {
+		cc.assetManager.loadRemote(audio_url, (err, audioClip) => {
+      const audioId = cc.audioEngine.play(audioClip, false, 0.8);
+      if (cb) {
+        cc.audioEngine.setFinishCallback(audioId, () => {
+          cb();
+        });
+      }
+		});
+	}
+}
+
+
+export function btnClickAnima(btn, time=0.15, rate=1.05) {
+  btn.tmpScale = btn.scale;
+  btn.on(cc.Node.EventType.TOUCH_START, () => {
+    cc.tween(btn)
+      .to(time / 2, {scale: btn.scale * rate})
+      .start()
+  })
+  btn.on(cc.Node.EventType.TOUCH_CANCEL, () => {
+    cc.tween(btn)
+      .to(time / 2, {scale: btn.tmpScale})
+      .start()
+  })
+  btn.on(cc.Node.EventType.TOUCH_END, () => {
+    cc.tween(btn)
+      .to(time / 2, {scale: btn.tmpScale})
+      .start()
+  })
+}
\ No newline at end of file
diff --git a/play/assets/tmpGame/prefabs/TmpPreFab.js.meta b/play/assets/tmpGame/script/util.js.meta
similarity index 74%
rename from play/assets/tmpGame/prefabs/TmpPreFab.js.meta
rename to play/assets/tmpGame/script/util.js.meta
index 7937fdf85e8e06d2c7114398298f5a778048f9dd..e1def927553d2b09ca8503e2d4f8142de7384102 100644
--- a/play/assets/tmpGame/prefabs/TmpPreFab.js.meta
+++ b/play/assets/tmpGame/script/util.js.meta
@@ -1,6 +1,6 @@
 {
   "ver": "1.0.8",
-  "uuid": "94a7b9b9-6939-44a7-85cf-15336952b997",
+  "uuid": "ade7af40-d56d-4087-bbc6-2888fef55353",
   "isPlugin": false,
   "loadPluginInWeb": true,
   "loadPluginInNative": true,
diff --git a/play/assets/tmpGame/script/utils.js.meta b/play/assets/tmpGame/script/utils.js.meta
deleted file mode 100644
index e5c7aea3b3aba81d8f598f4c26f301469e0183a5..0000000000000000000000000000000000000000
--- a/play/assets/tmpGame/script/utils.js.meta
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "ver": "1.0.8",
-  "uuid": "285dc6a8-c221-449f-a19e-d2144b9d12d5",
-  "isPlugin": false,
-  "loadPluginInWeb": true,
-  "loadPluginInNative": true,
-  "loadPluginInEditor": false,
-  "subMetas": {}
-}
\ No newline at end of file
diff --git a/play/assets/tmpGame/textures/1orange.png b/play/assets/tmpGame/textures/1orange.png
new file mode 100644
index 0000000000000000000000000000000000000000..fe9a37149865449e4f1ad38938476486aa62260a
Binary files /dev/null and b/play/assets/tmpGame/textures/1orange.png differ
diff --git a/play/assets/tmpGame/textures/1orange.png.meta b/play/assets/tmpGame/textures/1orange.png.meta
new file mode 100644
index 0000000000000000000000000000000000000000..cbc7d03803bf7cb91d6eb2c6c3e3fefa7f656b9d
--- /dev/null
+++ b/play/assets/tmpGame/textures/1orange.png.meta
@@ -0,0 +1,36 @@
+{
+  "ver": "2.3.5",
+  "uuid": "efa5fa09-a4dd-4bfc-ab7e-17c19f85408f",
+  "type": "sprite",
+  "wrapMode": "clamp",
+  "filterMode": "bilinear",
+  "premultiplyAlpha": false,
+  "genMipmaps": false,
+  "packable": true,
+  "width": 366,
+  "height": 336,
+  "platformSettings": {},
+  "subMetas": {
+    "1orange": {
+      "ver": "1.0.4",
+      "uuid": "43d1e79d-6de8-4dcb-b8ce-d767df7913aa",
+      "rawTextureUuid": "efa5fa09-a4dd-4bfc-ab7e-17c19f85408f",
+      "trimType": "auto",
+      "trimThreshold": 1,
+      "rotated": false,
+      "offsetX": 0,
+      "offsetY": -0.5,
+      "trimX": 0,
+      "trimY": 1,
+      "width": 366,
+      "height": 335,
+      "rawWidth": 366,
+      "rawHeight": 336,
+      "borderTop": 0,
+      "borderBottom": 0,
+      "borderLeft": 0,
+      "borderRight": 0,
+      "subMetas": {}
+    }
+  }
+}
\ No newline at end of file
diff --git a/play/assets/tmpGame/textures/bg.jpg b/play/assets/tmpGame/textures/bg.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..701c49c4c716d9e48412993f87f47d0fdcfbbe44
Binary files /dev/null and b/play/assets/tmpGame/textures/bg.jpg differ
diff --git a/play/assets/tmpGame/textures/bg.jpg.meta b/play/assets/tmpGame/textures/bg.jpg.meta
new file mode 100644
index 0000000000000000000000000000000000000000..14c84e9b1cecc7d63b0d11d7be9c7627f4a1d901
--- /dev/null
+++ b/play/assets/tmpGame/textures/bg.jpg.meta
@@ -0,0 +1,36 @@
+{
+  "ver": "2.3.5",
+  "uuid": "e1b4d971-9876-4832-803a-5a321964a78b",
+  "type": "sprite",
+  "wrapMode": "clamp",
+  "filterMode": "bilinear",
+  "premultiplyAlpha": false,
+  "genMipmaps": false,
+  "packable": true,
+  "width": 1280,
+  "height": 720,
+  "platformSettings": {},
+  "subMetas": {
+    "bg": {
+      "ver": "1.0.4",
+      "uuid": "8288e3d4-4c75-4b27-8f01-f7014417f4dd",
+      "rawTextureUuid": "e1b4d971-9876-4832-803a-5a321964a78b",
+      "trimType": "auto",
+      "trimThreshold": 1,
+      "rotated": false,
+      "offsetX": 0,
+      "offsetY": 0,
+      "trimX": 0,
+      "trimY": 0,
+      "width": 1280,
+      "height": 720,
+      "rawWidth": 1280,
+      "rawHeight": 720,
+      "borderTop": 0,
+      "borderBottom": 0,
+      "borderLeft": 0,
+      "borderRight": 0,
+      "subMetas": {}
+    }
+  }
+}
\ No newline at end of file
diff --git a/play/assets/tmpGame/textures/btn_left.png b/play/assets/tmpGame/textures/btn_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..e3428fd5bcda4bad311e87c5aa5669fdb7e96a60
Binary files /dev/null and b/play/assets/tmpGame/textures/btn_left.png differ
diff --git a/play/assets/tmpGame/textures/btn_left.png.meta b/play/assets/tmpGame/textures/btn_left.png.meta
new file mode 100644
index 0000000000000000000000000000000000000000..2812db2c1edaf060f69bfe9cef23bf25469265ae
--- /dev/null
+++ b/play/assets/tmpGame/textures/btn_left.png.meta
@@ -0,0 +1,36 @@
+{
+  "ver": "2.3.5",
+  "uuid": "9a79969a-0506-48d4-bc98-3c05d109b027",
+  "type": "sprite",
+  "wrapMode": "clamp",
+  "filterMode": "bilinear",
+  "premultiplyAlpha": false,
+  "genMipmaps": false,
+  "packable": true,
+  "width": 61,
+  "height": 67,
+  "platformSettings": {},
+  "subMetas": {
+    "btn_left": {
+      "ver": "1.0.4",
+      "uuid": "ce19457d-e8f3-4c38-ae3e-d4b99208ddb5",
+      "rawTextureUuid": "9a79969a-0506-48d4-bc98-3c05d109b027",
+      "trimType": "auto",
+      "trimThreshold": 1,
+      "rotated": false,
+      "offsetX": 0,
+      "offsetY": 0,
+      "trimX": 0,
+      "trimY": 0,
+      "width": 61,
+      "height": 67,
+      "rawWidth": 61,
+      "rawHeight": 67,
+      "borderTop": 0,
+      "borderBottom": 0,
+      "borderLeft": 0,
+      "borderRight": 0,
+      "subMetas": {}
+    }
+  }
+}
\ No newline at end of file
diff --git a/play/assets/tmpGame/textures/btn_right.png b/play/assets/tmpGame/textures/btn_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..db0f274024b4ad41d5219acf3936ec2b2f79459c
Binary files /dev/null and b/play/assets/tmpGame/textures/btn_right.png differ
diff --git a/play/assets/tmpGame/textures/btn_right.png.meta b/play/assets/tmpGame/textures/btn_right.png.meta
new file mode 100644
index 0000000000000000000000000000000000000000..a0c8dc85f70bce2ef10d8efee4997c3bae467c4b
--- /dev/null
+++ b/play/assets/tmpGame/textures/btn_right.png.meta
@@ -0,0 +1,36 @@
+{
+  "ver": "2.3.5",
+  "uuid": "d582359e-924e-4ee9-9964-1fc4bb417e71",
+  "type": "sprite",
+  "wrapMode": "clamp",
+  "filterMode": "bilinear",
+  "premultiplyAlpha": false,
+  "genMipmaps": false,
+  "packable": true,
+  "width": 61,
+  "height": 67,
+  "platformSettings": {},
+  "subMetas": {
+    "btn_right": {
+      "ver": "1.0.4",
+      "uuid": "e5a2dbaa-a677-4a32-90d7-a1b057d7fb59",
+      "rawTextureUuid": "d582359e-924e-4ee9-9964-1fc4bb417e71",
+      "trimType": "auto",
+      "trimThreshold": 1,
+      "rotated": false,
+      "offsetX": -0.5,
+      "offsetY": 0.5,
+      "trimX": 0,
+      "trimY": 0,
+      "width": 60,
+      "height": 66,
+      "rawWidth": 61,
+      "rawHeight": 67,
+      "borderTop": 0,
+      "borderBottom": 0,
+      "borderLeft": 0,
+      "borderRight": 0,
+      "subMetas": {}
+    }
+  }
+}
\ No newline at end of file
diff --git a/play/assets/tmpGame/textures/icon.png b/play/assets/tmpGame/textures/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..63bf81e6ea88059e83d595ba2ae71fa1e0e746c8
Binary files /dev/null and b/play/assets/tmpGame/textures/icon.png differ
diff --git a/play/assets/tmpGame/textures/icon.png.meta b/play/assets/tmpGame/textures/icon.png.meta
new file mode 100644
index 0000000000000000000000000000000000000000..53dc69a10c6f823908f9361602c14f5c0be01346
--- /dev/null
+++ b/play/assets/tmpGame/textures/icon.png.meta
@@ -0,0 +1,36 @@
+{
+  "ver": "2.3.5",
+  "uuid": "18d07592-51a9-421e-8972-0f67b68d29e1",
+  "type": "sprite",
+  "wrapMode": "clamp",
+  "filterMode": "bilinear",
+  "premultiplyAlpha": false,
+  "genMipmaps": false,
+  "packable": true,
+  "width": 144,
+  "height": 144,
+  "platformSettings": {},
+  "subMetas": {
+    "icon": {
+      "ver": "1.0.4",
+      "uuid": "6fbc30a8-3c49-44ae-8ba4-7f56f385b78a",
+      "rawTextureUuid": "18d07592-51a9-421e-8972-0f67b68d29e1",
+      "trimType": "auto",
+      "trimThreshold": 1,
+      "rotated": false,
+      "offsetX": 0,
+      "offsetY": -0.5,
+      "trimX": 3,
+      "trimY": 2,
+      "width": 138,
+      "height": 141,
+      "rawWidth": 144,
+      "rawHeight": 144,
+      "borderTop": 0,
+      "borderBottom": 0,
+      "borderLeft": 0,
+      "borderRight": 0,
+      "subMetas": {}
+    }
+  }
+}
\ No newline at end of file
diff --git a/publish/.DS_Store b/publish/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..f522f3d131eb78762494367bf67258334990f6fc
Binary files /dev/null and b/publish/.DS_Store differ