@shijiu/jsview-vue-samples 2.2.373 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/BakeViewDemo/AnimatePic.vue +1 -1
  2. package/Basic/components/text/TextDirection.vue +7 -2
  3. package/BasicFocusControl/components/BaseBlock.vue +65 -18
  4. package/BreakRender/assets/imageList.json +235 -235
  5. package/ColorSpace/App.vue +4 -4
  6. package/CoupletsTest/App.vue +1 -1
  7. package/CoupletsTest/widget/Banger/Banger.vue +3 -3
  8. package/CoupletsTest/widget/Banger/MaroonLoader.vue +5 -5
  9. package/CoupletsTest/widget/Couplets/Couplets.vue +4 -4
  10. package/CoupletsTest/widget/Fireworks/Fireworks.vue +13 -13
  11. package/CssPreprocessor/Stylus/components/stylus-group1/StylusOperations.vue +0 -1
  12. package/CssPreprocessor/utils/ContentBlock.vue +3 -3
  13. package/CssPreprocessor/utils/{FontStyle.css → FontConfig.css} +3 -3
  14. package/CssPreprocessor/utils/TitleBar.vue +2 -2
  15. package/CustomShader/App.vue +6 -6
  16. package/CustomShader/gaussianBlur.glsl +1 -1
  17. package/DashPath/App.vue +79 -0
  18. package/DashPath/AppForOperator.vue +35 -0
  19. package/DashPath/DashPath.vue +118 -0
  20. package/DemoForOperator/AnimPic/AnimPic.vue +47 -0
  21. package/DemoForOperator/AnimPic/App.vue +28 -0
  22. package/DemoForOperator/Banger/App.vue +26 -0
  23. package/DemoForOperator/Banger/Banger/Banger.vue +252 -0
  24. package/DemoForOperator/Banger/Banger/Maroon.vue +123 -0
  25. package/DemoForOperator/Banger/Banger/MaroonLoader.vue +78 -0
  26. package/DemoForOperator/Banger/Banger/SpriteDeal.js +30 -0
  27. package/DemoForOperator/Bounce/App.vue +43 -0
  28. package/DemoForOperator/Bounce/Bounce.vue +49 -0
  29. package/DemoForOperator/Bounce/FreeMoveBuilder.js +139 -0
  30. package/DemoForOperator/ChunLian/App.vue +47 -0
  31. package/DemoForOperator/ChunLian/Couplets.vue +248 -0
  32. package/DemoForOperator/EpisodeList/App.vue +80 -0
  33. package/DemoForOperator/EpisodeList/EpisodeList/Controller.vue +113 -0
  34. package/DemoForOperator/EpisodeList/EpisodeList/EpisodeList.vue +176 -0
  35. package/DemoForOperator/EpisodeList/GroupItem.vue +65 -0
  36. package/DemoForOperator/EpisodeList/ListItem.vue +48 -0
  37. package/DemoForOperator/Firework1/App.vue +25 -0
  38. package/DemoForOperator/Firework1/Fireworks.vue +358 -0
  39. package/DemoForOperator/Firework1/SpriteDeal.js +30 -0
  40. package/DemoForOperator/FlipPage/App.vue +75 -0
  41. package/DemoForOperator/FlipPage/FlipPage/FlipPage.vue +150 -0
  42. package/DemoForOperator/FlipPage/FlipPage/flipIn.glsl +41 -0
  43. package/DemoForOperator/FlipPage/FlipPage/flipOut.glsl +41 -0
  44. package/DemoForOperator/Focus/Alpha/AlphaFocusBox.vue +70 -0
  45. package/DemoForOperator/Focus/Alpha/AlphaPage.vue +40 -0
  46. package/DemoForOperator/Focus/Alpha/Item.vue +64 -0
  47. package/DemoForOperator/Focus/App.vue +124 -0
  48. package/DemoForOperator/Focus/CommonPageSetting.js +30 -0
  49. package/DemoForOperator/Focus/Item.vue +46 -0
  50. package/DemoForOperator/Focus/Light/Item.vue +67 -0
  51. package/DemoForOperator/Focus/Light/LightFocusBox.vue +46 -0
  52. package/DemoForOperator/Focus/Light/LightPage.vue +43 -0
  53. package/DemoForOperator/Focus/Light/utils/FrameCanvasStore.ts +68 -0
  54. package/DemoForOperator/Focus/Light/utils/RotateFrame.vue +146 -0
  55. package/DemoForOperator/Focus/Light/utils/circleHaloMask.png +0 -0
  56. package/DemoForOperator/Focus/Normal/Item.vue +64 -0
  57. package/DemoForOperator/Focus/Normal/NormalFocusBox.vue +53 -0
  58. package/DemoForOperator/Focus/Normal/NormalPage.vue +41 -0
  59. package/DemoForOperator/Focus/SwipeLight/Item.vue +73 -0
  60. package/DemoForOperator/Focus/SwipeLight/SwipeLightBox.vue +62 -0
  61. package/DemoForOperator/Focus/SwipeLight/SwipeLightPage.vue +44 -0
  62. package/DemoForOperator/FullscreenIn/App.vue +105 -0
  63. package/DemoForOperator/FullscreenIn/FullscreenPoster.vue +41 -0
  64. package/DemoForOperator/FullscreenIn/Item.vue +50 -0
  65. package/DemoForOperator/Genie/App.vue +78 -0
  66. package/DemoForOperator/Genie/geniePakcer/Genie.vue +699 -0
  67. package/DemoForOperator/Genie/geniePakcer/genieBottom.glsl +49 -0
  68. package/DemoForOperator/Genie/geniePakcer/genieLeft.glsl +50 -0
  69. package/DemoForOperator/Genie/geniePakcer/genieRight.glsl +57 -0
  70. package/DemoForOperator/Genie/geniePakcer/genieTop.glsl +50 -0
  71. package/DemoForOperator/GrayFilter/App.vue +51 -0
  72. package/DemoForOperator/GrayFilter/GrayFilter.vue +38 -0
  73. package/DemoForOperator/Jigsaw/App.vue +45 -0
  74. package/DemoForOperator/Jigsaw/JigsawFull.vue +100 -0
  75. package/DemoForOperator/Jigsaw/JigsawSingle.vue +86 -0
  76. package/DemoForOperator/Particle/App.vue +69 -0
  77. package/DemoForOperator/Particle/Drop/DropParticle.vue +176 -0
  78. package/DemoForOperator/Particle/Explode/ExplodeParticle.vue +99 -0
  79. package/DemoForOperator/PosterAnim/App.vue +125 -0
  80. package/DemoForOperator/PosterAnim/Bounce/BouncePage.vue +54 -0
  81. package/DemoForOperator/PosterAnim/Bounce/Item.vue +85 -0
  82. package/DemoForOperator/PosterAnim/Breath/BreathPage.vue +47 -0
  83. package/DemoForOperator/PosterAnim/Breath/Item.vue +58 -0
  84. package/DemoForOperator/PosterAnim/CommonPageSetting.js +30 -0
  85. package/DemoForOperator/PosterAnim/Item.vue +46 -0
  86. package/DemoForOperator/PosterAnim/PosterAnim.js +58 -0
  87. package/DemoForOperator/PosterAnim/Scale/Item.vue +72 -0
  88. package/DemoForOperator/PosterAnim/Scale/ScalePage.vue +48 -0
  89. package/DemoForOperator/PosterAnim/Shake/Item.vue +85 -0
  90. package/DemoForOperator/PosterAnim/Shake/ShakePage.vue +53 -0
  91. package/DemoForOperator/PosterOverflow/App.vue +116 -0
  92. package/DemoForOperator/PosterOverflow/Item.vue +67 -0
  93. package/DemoForOperator/PosterOverflow/PosterOverflow.vue +23 -0
  94. package/DemoForOperator/Ripple/App.vue +54 -0
  95. package/DemoForOperator/Ripple/Ripple.vue +50 -0
  96. package/DemoForOperator/ScalePoster/App.vue +4 -0
  97. package/DemoForOperator/ScalePoster/ScalePoster.vue +0 -0
  98. package/DemoForOperator/Sprite/App.vue +33 -0
  99. package/DemoForOperator/Sprite/Sprite.vue +90 -0
  100. package/DemoForOperator/Stretch/App.vue +103 -0
  101. package/DemoForOperator/Stretch/Stretch/Item.vue +192 -0
  102. package/DemoForOperator/Stretch/Stretch/Stretch.vue +168 -0
  103. package/DemoForOperator/TabContent/App.vue +89 -0
  104. package/DemoForOperator/TabContent/ContentPage.vue +66 -0
  105. package/DemoForOperator/TabContent/Item.vue +85 -0
  106. package/DemoForOperator/TabContent/PageItem.vue +40 -0
  107. package/DemoForOperator/TabContent/TabContent/CreepFocus.vue +160 -0
  108. package/DemoForOperator/TabContent/TabContent/Item.vue +63 -0
  109. package/DemoForOperator/TabContent/TabContent/TabContent.vue +146 -0
  110. package/DemoForOperator/TabContent/TabContent/TabItem.vue +368 -0
  111. package/DemoForOperator/TabContent/TabContent/TabWidget.vue +243 -0
  112. package/DemoForOperator/TabContent/TabContent/Util.js +3 -0
  113. package/DemoForOperator/TabContent/TabContent/ViewSwiper.vue +110 -0
  114. package/DemoForOperator/TabContent/testData.js +241 -0
  115. package/DemoForOperator/Vortex/App.vue +78 -0
  116. package/DemoForOperator/Vortex/Vortex/Vortex.vue +154 -0
  117. package/DemoForOperator/Vortex/Vortex/vortexIn.glsl +38 -0
  118. package/DemoForOperator/Vortex/Vortex/vortexOut.glsl +38 -0
  119. package/DemoForOperator/index.js +6 -0
  120. package/DemoForOperator/routeList.js +142 -0
  121. package/DemoHomepage/App.vue +50 -30
  122. package/DemoHomepage/components/Dialog.vue +1 -0
  123. package/DemoHomepage/components/TabFrame.vue +7 -0
  124. package/DemoHomepage/router.js +104 -81
  125. package/DemoHomepage/views/Homepage.vue +7 -6
  126. package/DivMetroPerformance/components/ContentItem.vue +0 -1
  127. package/DivMetroPerformance/data.js +3 -3
  128. package/DriftScopeTest/App.vue +1 -1
  129. package/FilterDemo/AnimatePic.vue +1 -1
  130. package/FilterDemo/VideoLayer.vue +2 -2
  131. package/FlexCellDemo/TestFrame1.vue +0 -4
  132. package/FullScreenFlex/TestFrame2.vue +1 -1
  133. package/GiftRain/App.vue +12 -15
  134. package/HashParams/App.vue +0 -1
  135. package/JsvPreDownloader/App.vue +4 -6
  136. package/Marquee/App.vue +2 -2
  137. package/MediaDemo/components/frames/AudioFrame.vue +1 -1
  138. package/MediaDemo/components/frames/VideoFrame.vue +1 -1
  139. package/MetroWidgetDemos/MassiveItems/ContentItem.vue +1 -2
  140. package/MetroWidgetDemos/MassiveItems/data.js +1 -1
  141. package/MetroWidgetDemos/PerformanceTest/components/ContentItem.vue +0 -1
  142. package/MetroWidgetDemos/PerformanceTest/components/MyTab.vue +18 -17
  143. package/MetroWidgetDemos/PerformanceTest/data.js +3 -3
  144. package/MetroWidgetDemos/RefreshDemo/assets/imageList.json +235 -235
  145. package/MetroWidgetDemos/SkeletonDiagram/assets/imageList.json +235 -235
  146. package/MetroWidgetDemos/focusableItemMetroWidget/WidgetItem.vue +3 -1
  147. package/MetroWidgetDemos/routeList.js +17 -17
  148. package/Poster3d/App.vue +69 -0
  149. package/Poster3d/Poster3d.vue +92 -0
  150. package/PosterPacker/App.vue +5 -5
  151. package/PosterPacker/tools/geniePakcer/Genie.vue +2 -2
  152. package/PosterPacker/tools/vortexPacker/Vortex.vue +15 -15
  153. package/QrcodeDemo/App.vue +1 -1
  154. package/Ripple/App.vue +1 -1
  155. package/ScaleDownNeon/App.vue +13 -10
  156. package/SceneTransition/App.vue +7 -6
  157. package/SceneTransition/maskConfig/config2.js +12 -12
  158. package/SceneTransition/maskConfig/config3.js +14 -14
  159. package/SprayView/App.vue +96 -51
  160. package/SpringFestival/App.vue +73 -0
  161. package/SpringFestival/SpringFestivalScene/ChunLian.vue +211 -0
  162. package/SpringFestival/SpringFestivalScene/FreeMoveBuilder.js +139 -0
  163. package/SpringFestival/SpringFestivalScene/LanternAnim.js +60 -0
  164. package/SpringFestival/SpringFestivalScene/Rain.vue +137 -0
  165. package/SpringFestival/SpringFestivalScene/Scene.vue +218 -0
  166. package/SpringFestival/SpringFestivalScene/imageConfig.js +87 -0
  167. package/SpringFestival/SpringFestivalScene/index.js +1 -0
  168. package/Swiper/App.vue +28 -29
  169. package/Swiper/Item.vue +19 -0
  170. package/SwiperTest/App.vue +9 -9
  171. package/TestNativeSharedView/AckEventDefine.ts +82 -0
  172. package/TestNativeSharedView/App.vue +4 -6
  173. package/TestNativeSharedView/JsvDemoTester.js +131 -0
  174. package/TextureAnimation/App3.vue +100 -0
  175. package/TextureAnimation/utils/FrameCanvasStore.ts +68 -0
  176. package/TextureAnimation/utils/RotateFrame.vue +146 -0
  177. package/TextureAnimation/utils/circleHaloMask.png +0 -0
  178. package/TextureSize/App.vue +5 -6
  179. package/TombSweepingDayTest/Raining/RainScene.vue +4 -4
  180. package/ViewOpacity/App.vue +6 -7
  181. package/package.json +1 -1
@@ -0,0 +1,252 @@
1
+ <!--
2
+ * 【模块 export 内容】
3
+ * Banger:鞭炮组件
4
+ * props说明:
5
+ * left {Number} 组件顶端中心Left位置
6
+ * top {Number} 组件顶端中心Top位置
7
+ * num {Number} 鞭炮个数(个数决定长度)
8
+ * leadWireTime {Number} 引线燃烧时间
9
+ * width {Number} 整个组件的宽度
10
+ -->
11
+ <template>
12
+ <!-- 预加载 -->
13
+ <JsvPreload
14
+ :preloadList="preload_info"
15
+ :onPreloadDone="loadDone"
16
+ ></JsvPreload>
17
+ <div
18
+ v-show="myShow"
19
+ :style="{
20
+ left: props.left - widgetWidth / 2,
21
+ top: props.top,
22
+ width: widgetWidth,
23
+ height: leadWireHeight,
24
+ transform: `scale3d(${props.width / widgetWidth},${
25
+ props.width / widgetWidth
26
+ },1)`,
27
+ transformOrigin: 'center top',
28
+ }"
29
+ >
30
+ <div
31
+ :style="{
32
+ top: -leadWireHeight,
33
+ left: 0,
34
+ width: 80,
35
+ height: leadWireHeight,
36
+ overflow: 'hidden',
37
+ animation: aniName1,
38
+ }"
39
+ >
40
+ <div
41
+ :style="{
42
+ top: leadWireHeight,
43
+ left: 0,
44
+ width: 80,
45
+ height: leadWireHeight,
46
+ backgroundImage: leadWire,
47
+ animation: aniName2,
48
+ }"
49
+ ></div>
50
+ </div>
51
+ <!-- 燃烧特效 -->
52
+ <div
53
+ v-if="isSpark"
54
+ :style="{
55
+ top: -10,
56
+ left: 31,
57
+ animation: aniName1,
58
+ }"
59
+ @animationend="closeSpark"
60
+ >
61
+ <JsvSpriteLoader
62
+ :imageUrl="sparkPng"
63
+ :configUrl="sparkJson"
64
+ :onConfigReady="preloadCallback"
65
+ :noNeedResource="false"
66
+ >
67
+ <div
68
+ :style="{
69
+ transform: `scale3d(${20 / view_size.w},${20 / view_size.h},1)`,
70
+ }"
71
+ >
72
+ <JsvSpriteAnim
73
+ :spriteInfo="sprite_info.info"
74
+ :loop="'infinite'"
75
+ :duration="0.1"
76
+ :imageUrl="sparkPng"
77
+ ref="controllerAnim"
78
+ autoStart="true"
79
+ >
80
+ </JsvSpriteAnim>
81
+ </div>
82
+ </JsvSpriteLoader>
83
+ </div>
84
+
85
+ <MaroonLoader :starSrcs="starSrcs" :bangerSpriteSrc="bangerSpriteSrc">
86
+ <Maroon
87
+ v-for="(item, index) in spriteArray"
88
+ :top="leadWireHeight - 40 - index * 16"
89
+ :left="10"
90
+ :deg="index % 2 == 0 ? 30 : -30"
91
+ :ref="(el) => (RefArray[index] = el)"
92
+ :myRef="spriteArray[index]"
93
+ ></Maroon>
94
+ </MaroonLoader>
95
+ </div>
96
+ </template>
97
+
98
+ <script setup>
99
+ import Maroon from "./Maroon.vue";
100
+ import MaroonLoader from "./MaroonLoader.vue";
101
+ import { shallowRef, onBeforeUnmount, watch, provide } from "vue";
102
+ import {
103
+ JsvSpriteAnim,
104
+ getKeyFramesGroup,
105
+ JsvSpriteLoader,
106
+ JsvPreload,
107
+ buildPreloadInfo,
108
+ } from "jsview";
109
+ import { _formatInfo } from "./SpriteDeal";
110
+
111
+ const props = defineProps({
112
+ top: { type: Number, default: 0 },
113
+ left: { type: Number, default: 0 },
114
+ num: { type: Number, default: 12 },
115
+ width: { type: Number, require: true },
116
+ leadWireTime: { type: Number, require: true },
117
+ starSrcs: { type: Array },
118
+ bangerSpriteSrc: { type: String },
119
+ sparkSpriteSrc: { type: String },
120
+ leadWireSrc: { type: String },
121
+ });
122
+
123
+ const leadWire = props.leadWireSrc;
124
+ const sparkPng = props.sparkSpriteSrc;
125
+ const sparkJson = props.sparkSpriteSrc + ".json";
126
+
127
+ //预加载
128
+ const preload_info = [buildPreloadInfo(leadWire), buildPreloadInfo(sparkPng)];
129
+ //定义ref
130
+ let controllerAnim = shallowRef(null);
131
+ //设定变量控制动画的播放
132
+ let readyNum = shallowRef(0);
133
+ const loadDone = (a) => {
134
+ readyNum.value++;
135
+ myShow.value = true;
136
+ };
137
+ let myShow = shallowRef(false);
138
+
139
+ // 组件宽度
140
+ const widgetWidth = 80;
141
+ let sprite_info = shallowRef(null);
142
+ let view_size = shallowRef(null);
143
+ //计算引线长度
144
+ let leadWireHeight = (props.num - 1) * 16 + 20;
145
+ //插入动画
146
+ const idRandom = Math.floor(Math.random() * 1000000);
147
+ let styleShell = getKeyFramesGroup();
148
+ let name1 = "animLw1-" + idRandom;
149
+ let name2 = "animLw2-" + idRandom;
150
+ let animLw1 = `@keyframes ${name1} {
151
+ from {
152
+ transform: translate3d(0,${leadWireHeight}, 0);
153
+ }
154
+ to {
155
+ transform: translate3d(0, 0, 0);
156
+ }
157
+ }`;
158
+ styleShell.insertRule(animLw1);
159
+ let animLw2 = `@keyframes ${name2} {
160
+ from {
161
+ transform: translate3d(0,${-leadWireHeight}, 0);
162
+ }
163
+ to {
164
+ transform: translate3d(0, 0, 0);
165
+ }
166
+ }`;
167
+ styleShell.insertRule(animLw2);
168
+
169
+ //预加载
170
+ const preloadCallback = (config_json, resolve_set) => {
171
+ sprite_info.value = _formatInfo(config_json);
172
+ view_size.value = {
173
+ w: sprite_info.value.maxW,
174
+ h: sprite_info.value.maxH,
175
+ };
176
+ resolve_set(); // 通知loader数组设置完成
177
+ readyNum.value++;
178
+ };
179
+ //子组件加载完毕的flag
180
+ let sonFlag = shallowRef(false);
181
+ provide("sonFlag", sonFlag);
182
+ //动画名字
183
+ let aniName1 = shallowRef(null);
184
+ let aniName2 = shallowRef(null);
185
+ //控制燃烧特效
186
+ let isSpark = shallowRef(true);
187
+ const closeSpark = () => {
188
+ isSpark.value = false;
189
+ };
190
+ //ref数组
191
+ const spriteArray = new Array(props.num);
192
+ let RefArray = shallowRef([]);
193
+ for (let i = 0; i < spriteArray.length; i++) {
194
+ spriteArray[i] = shallowRef(null);
195
+ }
196
+
197
+ const callFireMethod = (index) => {
198
+ // 检查索引是否超出范围,如果超出则停止递归
199
+ if (index >= spriteArray.length) {
200
+ return;
201
+ }
202
+
203
+ // 获取当前索引对应的Maroon组件的ref
204
+ const currentMaroonRef = RefArray.value[index];
205
+ // 调用当前Maroon组件的fire方法
206
+ if (currentMaroonRef) {
207
+ currentMaroonRef.fire();
208
+ }
209
+ // 延迟1秒后递归调用下一个Maroon组件的fire方法
210
+ timer.id2 = setTimeout(() => {
211
+ callFireMethod(index + 1);
212
+ }, (props.leadWireTime * 1000) / (props.num - 1));
213
+ };
214
+
215
+ //延时器
216
+ let timer = { id: -1, id2: -1 };
217
+ watch(readyNum, (n, o) => {
218
+ if (o != 3 && n == 3) {
219
+ timer.id = setTimeout(() => {
220
+ controllerAnim.value.start();
221
+ callFireMethod(0);
222
+ aniName1.value = `${name1} ${props.leadWireTime}s linear`;
223
+ aniName2.value = `${name2} ${props.leadWireTime}s linear`;
224
+ }, 0);
225
+ }
226
+ });
227
+
228
+ watch(sonFlag, (n) => {
229
+ if (n == true) {
230
+ readyNum.value++;
231
+ }
232
+ });
233
+
234
+ onBeforeUnmount(() => {
235
+ styleShell.removeRule(name1);
236
+ styleShell.removeRule(name2);
237
+ clearTimeout(timer.id);
238
+ clearTimeout(timer.id2);
239
+ timer.id = -1;
240
+ timer.id2 = -1;
241
+ });
242
+ </script>
243
+
244
+ <style scoped>
245
+ .text {
246
+ font-size: 24;
247
+ color: #ffffff;
248
+ font-weight: bold;
249
+ text-align: center;
250
+ line-height: 32;
251
+ }
252
+ </style>
@@ -0,0 +1,123 @@
1
+ <template>
2
+ <jsv-free-move-actor
3
+ :top="props.top"
4
+ :left="props.left"
5
+ :width="30"
6
+ :height="60"
7
+ ref="actorRef"
8
+ >
9
+ <div
10
+ :style="{
11
+ width: 30,
12
+ height: 60,
13
+ }"
14
+ >
15
+ <div
16
+ :style="{
17
+ width: 30,
18
+ height: 40,
19
+ transform: `rotate3d(0,0,1,${deg}deg) scale3d(${40 / view_size.w},${
20
+ 40 / view_size.w
21
+ },1)`,
22
+ transformOrigin: 'center center',
23
+ }"
24
+ >
25
+ <!-- 炮仗图 -->
26
+ <JsvSpriteAnim
27
+ :spriteInfo="maroonResource.firecrackerSet.info.value"
28
+ :loop="1"
29
+ :duration="0.8"
30
+ :imageUrl="maroonResource.firecrackerPng"
31
+ :onAnimEnd="onAnimEnd"
32
+ :ref="props.myRef"
33
+ >
34
+ </JsvSpriteAnim>
35
+ <!-- 喷射粒子 -->
36
+ <div
37
+ v-if="isSpray"
38
+ :style="{
39
+ top: view_size.h / 2,
40
+ left: view_size.w / 2,
41
+ width: view_size.w,
42
+ height: view_size.h,
43
+ }"
44
+ >
45
+ <jsv-spray
46
+ v-for="item in ImgData"
47
+ :pointRes="`url(${item})`"
48
+ :sprayStyle="sprayOk"
49
+ :ignoreClip="true"
50
+ />
51
+ </div>
52
+ </div>
53
+ </div>
54
+ </jsv-free-move-actor>
55
+ </template>
56
+
57
+ <script setup>
58
+ import { shallowRef, watch, inject, onMounted } from "vue";
59
+ import { JsvSpriteAnim, JsvSpray, JsvFreeMoveActor } from "jsview";
60
+ import { _formatInfo } from "./SpriteDeal";
61
+ const props = defineProps({
62
+ top: Number,
63
+ left: Number,
64
+ deg: Number,
65
+ controller: Object,
66
+ myRef: Object,
67
+ });
68
+
69
+ let maroonResource = inject("maroonResource");
70
+
71
+ let view_size = maroonResource.firecrackerSet.viewSize;
72
+
73
+ //FreeMove
74
+ let actorRef = shallowRef(null);
75
+ let actorControl;
76
+
77
+ let isShow = shallowRef(true);
78
+ let isSpray = shallowRef(false);
79
+ let deg = shallowRef(props.deg);
80
+
81
+ //动画处理
82
+ const fire = () => {
83
+ props.myRef.value.start();
84
+ actorControl.run((cmds) => [
85
+ cmds.action().setSpdAndAccel(undefined, 0, undefined, 0.15, null, null),
86
+ cmds
87
+ .condition()
88
+ .reachPosition(undefined, 280)
89
+ .then([cmds.action().stopMoving()]),
90
+ ]);
91
+ };
92
+
93
+ //粒子效果
94
+ const ImgData = maroonResource.stars;
95
+ const sprayOk = {
96
+ type: 0,
97
+ particleNum: 100,
98
+ deltaAngle: 360,
99
+ deltaWidth: 20,
100
+ deltaHeight: 20,
101
+ pointSizeMin: 20,
102
+ pointSizeMax: 30,
103
+ speedMin: 1,
104
+ speedMax: 7,
105
+ lifeMin: 1000,
106
+ lifeMax: 2000,
107
+ accelerateX: 0,
108
+ accelerateY: 0,
109
+ enableFade: true,
110
+ enableShrink: true,
111
+ };
112
+ //动画结束播放粒子效果
113
+ const onAnimEnd = () => {
114
+ isShow.value = false;
115
+ isSpray.value = true;
116
+ };
117
+ onMounted(() => {
118
+ actorControl = actorRef.value.control;
119
+ });
120
+ defineExpose({ fire });
121
+ </script>
122
+
123
+ <style scoped></style>
@@ -0,0 +1,78 @@
1
+ <template>
2
+ <JsvPreload
3
+ :preloadList="preload_info"
4
+ :onPreloadDone="loadDone"
5
+ ></JsvPreload>
6
+ <JsvSpriteLoader
7
+ :imageUrl="maroonResource.firecrackerPng"
8
+ :configUrl="maroonResource.firecrackerJson"
9
+ :onConfigReady="preloadCallback"
10
+ :noNeedResource="false"
11
+ >
12
+ <slot v-if="sonFlag" />
13
+ </JsvSpriteLoader>
14
+ </template>
15
+
16
+ <script setup>
17
+ import { shallowRef, watch, inject, provide } from "vue";
18
+ import { JsvPreload, buildPreloadInfo, JsvSpriteLoader } from "jsview";
19
+ import { _formatInfo } from "./SpriteDeal";
20
+ const props = defineProps({
21
+ top: Number,
22
+ left: Number,
23
+ deg: Number,
24
+ controller: Object,
25
+ myRef: Object,
26
+ starSrcs: {
27
+ type: Array,
28
+ },
29
+ bangerSpriteSrc: {
30
+ type: String,
31
+ },
32
+ });
33
+
34
+ const maroonResource = {
35
+ stars: props.starSrcs,
36
+ firecrackerPng: props.bangerSpriteSrc,
37
+ firecrackerJson: props.bangerSpriteSrc + ".json",
38
+ firecrackerSet: {
39
+ info: shallowRef(null),
40
+ viewSize: shallowRef(null),
41
+ },
42
+ };
43
+
44
+ //预加载
45
+ const preload_info = [
46
+ ...props.starSrcs.map((i) => buildPreloadInfo(i)),
47
+ buildPreloadInfo(props.bangerSpriteSrc),
48
+ ];
49
+ let sonFlag = inject("sonFlag");
50
+
51
+ provide("maroonResource", maroonResource);
52
+
53
+ let readyNum = shallowRef(0);
54
+
55
+ const loadDone = (a) => {
56
+ readyNum.value++;
57
+ };
58
+
59
+ const preloadCallback = (config_json, resolve_set) => {
60
+ let sprite_info = _formatInfo(config_json);
61
+ maroonResource.firecrackerSet.info.value = sprite_info.info;
62
+ maroonResource.firecrackerSet.viewSize.value = {
63
+ w: sprite_info.maxW,
64
+ h: sprite_info.maxH,
65
+ };
66
+ resolve_set(); // 通知loader数组设置完成
67
+ readyNum.value++;
68
+ };
69
+
70
+ //ref
71
+ watch(readyNum, (n, o) => {
72
+ if (o != 2 && n == 2) {
73
+ sonFlag.value = true;
74
+ }
75
+ });
76
+ </script>
77
+
78
+ <style scoped></style>
@@ -0,0 +1,30 @@
1
+ //精灵图信息函数
2
+ const _formatInfo = (action_json) => {
3
+ const info = {
4
+ frames: [],
5
+ meta: {
6
+ size: action_json.meta.size,
7
+ },
8
+ };
9
+ let frames_ref = info.frames;
10
+ let max_width = 0;
11
+ let max_height = 0;
12
+
13
+ for (let i = 0; i < action_json.frames.length; i++) {
14
+ const target = action_json.frames[i].spriteSourceSize;
15
+ frames_ref.push({
16
+ target,
17
+ source: action_json.frames[i].frame,
18
+ });
19
+ const sprite_with = target.x + target.w;
20
+ const sprite_height = target.y + target.h;
21
+ if (sprite_with > max_width) {
22
+ max_width = sprite_with;
23
+ }
24
+ if (sprite_height > max_height) {
25
+ max_height = sprite_height;
26
+ }
27
+ }
28
+ return { info, maxW: max_width, maxH: max_height };
29
+ };
30
+ export { _formatInfo }
@@ -0,0 +1,43 @@
1
+ <template>
2
+ <div :style="{ width: 1280, height: 720, backgroundColor: '#F5F5DC' }"></div>
3
+ <jsv-focus-block autoFocus :onAction="{ onKeyDown }"></jsv-focus-block>
4
+ <div
5
+ :style="{
6
+ width: 1280,
7
+ height: 100,
8
+ lineHeight: 100,
9
+ textAlign: 'center',
10
+ fontSize: 40,
11
+ color: '#000000',
12
+ }"
13
+ >
14
+ 按OK键触发动画
15
+ </div>
16
+ <bounce
17
+ ref="bounceRef"
18
+ :src="iLeftSnake"
19
+ :layout="{
20
+ width: 320,
21
+ height: 320,
22
+ top: 400,
23
+ left: 400,
24
+ }"
25
+ />
26
+ </template>
27
+
28
+ <script setup>
29
+ import Bounce from "./Bounce.vue";
30
+ import { shallowRef } from "vue";
31
+
32
+ const bounceRef = shallowRef(null);
33
+ let iLeftSnake =
34
+ "https://cdn.release.qcast.cn/JsViewFrameworkTester/JsViewVueSampleResources/DemoForOperator/Bounce/App/snake_left.png?md5=e0310d4ba1c74899899ca365a8b16385";
35
+
36
+ function onKeyDown(ev) {
37
+ if (ev.keyCode == 13) {
38
+ bounceRef.value.start(-400, -400, 7);
39
+ return true;
40
+ }
41
+ return false;
42
+ }
43
+ </script>
@@ -0,0 +1,49 @@
1
+ <template>
2
+ <JsvFreeMoveActor
3
+ :top="layout.top"
4
+ :left="layout.left"
5
+ :width="layout.width"
6
+ :height="layout.height"
7
+ ref="actorRef"
8
+ >
9
+ <img
10
+ :src="src"
11
+ :style="{
12
+ width: layout.width,
13
+ height: layout.height,
14
+ }"
15
+ />
16
+ </JsvFreeMoveActor>
17
+ </template>
18
+
19
+ <script setup>
20
+ import { JsvFreeMoveActor } from "jsview";
21
+ import { shallowRef } from "vue";
22
+ import { buildBounce } from "./FreeMoveBuilder";
23
+
24
+ const props = defineProps({
25
+ src: {
26
+ type: String,
27
+ required: true,
28
+ },
29
+ layout: {
30
+ type: Object,
31
+ required: true,
32
+ },
33
+ });
34
+
35
+ let actorRef = shallowRef(null);
36
+ let vLeftSnakeControl = null;
37
+
38
+ function startSnakeAnim(left, top, bounceTimes) {
39
+ // showSnake.value = true;
40
+ vLeftSnakeControl = actorRef.value.control;
41
+ vLeftSnakeControl.run((cmds) => [
42
+ ...buildBounce(cmds, 1, left, top, bounceTimes, 2.0, (state) => {}),
43
+ ]);
44
+ }
45
+
46
+ defineExpose({
47
+ start: startSnakeAnim,
48
+ });
49
+ </script>
@@ -0,0 +1,139 @@
1
+ const SQRT2VAL = Math.sqrt(2)
2
+
3
+
4
+ // 获取原地起跳抛物的处理
5
+ function getParabola(
6
+ cmds,
7
+ condGroupId, // 后续改为specName
8
+ xSpeed,
9
+ ySpeed,
10
+ gravity,
11
+ times,
12
+ onLandCmds
13
+ ) {
14
+ let actCmds;
15
+ if (times > 0) {
16
+ actCmds = getParabola(
17
+ cmds,
18
+ condGroupId,
19
+ xSpeed,
20
+ ySpeed / SQRT2VAL,
21
+ gravity,
22
+ times - 1,
23
+ onLandCmds
24
+ );
25
+ } else {
26
+ actCmds = onLandCmds;
27
+ }
28
+
29
+ return [
30
+ cmds.state().removeConditionByName(sFloorConditionName),
31
+ // (state: any) => {
32
+ // console.log(`State on t=${Date.now()} land y=${ySpeed} setStartOffsetPos times=${times}`,
33
+ // JSON.stringify(state))
34
+ // },
35
+ cmds.state().setStartPos(undefined, -1), // 离开接触点
36
+ cmds.action().setSpdAndAccel(xSpeed, ySpeed, 0, gravity),
37
+
38
+ // 下一帧再重启condition,避免当前帧的判断循环中仍然激活condition
39
+ cmds
40
+ .condition(condGroupId)
41
+ .onNextTick()
42
+ .then([
43
+ cmds
44
+ .condition(condGroupId, false, sFloorConditionName)
45
+ .reachPosition(undefined, 0)
46
+ .then([
47
+ ...actCmds,
48
+ ]),
49
+ ]),
50
+ ];
51
+ }
52
+
53
+ const sFloorConditionName = "floorCond";
54
+ const sWallConditionName = "wallCond";
55
+
56
+ /*
57
+ 弹跳处理
58
+ */
59
+ export function buildBounce(
60
+ cmds,// FreeMove的cmds句柄
61
+ condGroupId,
62
+ startX, // 起始位置和目标位置的偏差, 单位px
63
+ startY, // 起始位置和目标位置的偏差, 单位px
64
+ times, // 整数,落点数(弹起次数-1)
65
+ gravity, // y轴的加速度, 建议设置成0.8
66
+ onEnd,
67
+ ) {
68
+ let xDistance = startX - 0;
69
+ let yDistance = startY - 0;
70
+
71
+ if (times < 1) {
72
+ times = 1;
73
+ console.log("at least 1 times");
74
+ }
75
+
76
+ // 每个碰撞点之间的x的距离为
77
+ // sx * (1 + 1/sqrt(2) + 1/sqrt(2)^2 + ...) (=次数的数列)
78
+ // sx 为第一次下落过程x轴走过的距离
79
+ let sqrt2 = 1 / SQRT2VAL;
80
+ let sxSubBase = 2;
81
+ let sxSub = sxSubBase / 2;
82
+ for (let i = 0; i < times - 1; i++) {
83
+ sxSubBase = sxSubBase * sqrt2;
84
+ sxSub += sxSubBase;
85
+ }
86
+ let sx = -(xDistance / sxSub);
87
+
88
+ // 求首次下落使用的时间, 按照 s = 1/2*a*t^2的公式求解
89
+ let t1st = Math.sqrt(Math.abs(yDistance) * 2 / gravity);
90
+
91
+ // 求x的速度
92
+ let vx = sx / t1st;
93
+
94
+ // 求第一次落点的y速度
95
+ let vy1st = gravity * t1st;
96
+
97
+ let onLandCmds = [
98
+ cmds.action().teleportTo(0, 0),
99
+ // cmds.action().stopMoving(true),
100
+ cmds.state().removeConditionByGroup(condGroupId),
101
+ (...args) => {
102
+ onEnd?.(...args);
103
+ }
104
+ ];
105
+
106
+ let parabolaCmds;
107
+ if (times > 1) {
108
+ // 递归创建所有运动处理
109
+ parabolaCmds = getParabola(cmds, condGroupId, vx, -vy1st / SQRT2VAL, gravity, times - 2, onLandCmds);
110
+ } else {
111
+ parabolaCmds = onLandCmds;
112
+ }
113
+
114
+ let wallname = xDistance > 0 ? "left" : "right";
115
+
116
+ let cmdsArray = [
117
+ // 清理掉所有condition,除了group的外,还有wallposition
118
+ // 但后续specName的bug修正后,可以用specName来控制动画,只清理group即可
119
+ cmds.state().removeConditionByGroup(condGroupId),
120
+
121
+ // wallPosition用于规避运动路程计算超出(times越大超出越多)时,解决动画结尾的回弹问题
122
+ cmds.condition(condGroupId, true, sWallConditionName).wallPosition(wallname, 0, undefined).then([
123
+ cmds.action().teleportTo(0, undefined),
124
+ cmds.action().setSpdAndAccel(0, undefined, undefined, undefined),
125
+ ]),
126
+
127
+ // 启动从起始点的抛物下落动画
128
+ cmds.state().setStartPos(startX, startY),
129
+ cmds.action().setSpdAndAccel(vx, 0, 0, gravity),
130
+ cmds
131
+ .condition(condGroupId, false, sFloorConditionName)
132
+ .reachPosition(undefined, 0)
133
+ .then([
134
+ ...parabolaCmds
135
+ ])
136
+ ];
137
+
138
+ return cmdsArray;
139
+ }