index.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <template>
  2. <div class="t-page-v t-page" v-if="dire == 'V'" :style="{background: `url(${staticImg.bgV})`}" >
  3. <div class="back-icon" >
  4. <img :src="staticImg.backIcon" alt="" @click="backAppPage" >
  5. </div>
  6. <div id="rive-ani"><canvas width="375" height="375" id="rive-canvas" style="scale: 0.6;" ></canvas></div>
  7. <div class="countdown-container" >
  8. <div class="countdown" >{{countDown}}s</div>
  9. <div class="desc" >即将进入下一个环节</div>
  10. </div>
  11. <div class="opra" >
  12. <learn-plan-button :goPage="pageInfo().reload" title="再來一次" style="margin-bottom: 27px;" type="normal" />
  13. <learn-plan-button :goPage="pageInfo().next" :title="pageInfo().title" type="forward" />
  14. </div>
  15. </div>
  16. <div v-else class="t-page-h t-page" :style="{background: `url(${staticImg.bgH})`}">
  17. <div class="back-icon" >
  18. <img :src="staticImg.backIcon" alt="" @click="backAppPage" >
  19. </div>
  20. <div id="rive-ani" >
  21. <canvas width="200" height="200" id="rive-canvas" style="scale: 1;" ></canvas>
  22. </div>
  23. <div class="countdown-container" >
  24. <div class="countdown" >{{countDown}}s</div>
  25. <div class="desc" >即将进入下一个环节</div>
  26. </div>
  27. <div class="opra" >
  28. <learn-plan-button :goPage="pageInfo().reload" style="margin-right: 25px;" title="再來一次" type="normal" />
  29. <learn-plan-button :goPage="pageInfo().next" :title="pageInfo().title" type="forward" />
  30. </div>
  31. </div>
  32. </template>
  33. <script setup lang="ts" name="Rive">
  34. import { ref } from 'vue'
  35. import LearnPlanButton from '../../components/LearnPlanButton.vue'
  36. import { useAppRouter } from '@/hook/appHook'
  37. import { useDeviceDire, useScheduler, useSchedulerOnce } from '@/hook/index'
  38. import { onMounted } from 'vue';
  39. import { useRouter, useRoute } from "vue-router"
  40. import { Rive } from "@rive-app/canvas"
  41. // console.log('Rive:', Rive);
  42. // console.log(rive);
  43. const staticImg = {
  44. backIcon: require('@LP/assets/back-icon.png'),
  45. bgH: require('@LP/assets/TPage-bg-h.png'),
  46. bgV: require('@LP/assets/TPage-bg-v.png')
  47. }
  48. const route = useRoute()
  49. let {from} = route.query
  50. // 来自动画游戏的 进入学一学
  51. // 来自学一学的 进入讲一讲
  52. // 来自讲一讲的 进入学习报告
  53. /**
  54. * {
  55. * from: 'ani' | 'exercise' | 'audio' | 'report'
  56. * }
  57. */
  58. enum FromEnum {
  59. 'ani' = 'ani',
  60. 'exercise' = 'exercise',
  61. 'audio' = 'audio',
  62. 'report' = 'report'
  63. }
  64. console.log("from:", from);
  65. if (!from) {
  66. from = FromEnum.ani
  67. }
  68. const appRouter = useAppRouter()
  69. const [direChange] = useDeviceDire()
  70. const dire = ref<'H' | 'V'>('V')
  71. const countDown = ref(5)
  72. // 1. 初始化rive动画
  73. const initRive = () => {
  74. console.log(document.getElementById('rive-canvas'));
  75. const a = new Rive({
  76. src: "https://res-game.luojigou.vip/qiqiu2.riv",
  77. canvas: document.getElementById('rive-canvas'),
  78. autoplay: false,
  79. stateMachines: "bumpy",
  80. artboard:'reqiqiu-dog',
  81. onLoad: () => {
  82. a.resizeToCanvas()
  83. a.play('idle')
  84. },
  85. });
  86. }
  87. direChange((_dire) => {
  88. console.log('触发了方向')
  89. document.documentElement.style.fontSize = '37.5px'
  90. dire.value = _dire
  91. })
  92. const [stx] = useScheduler({
  93. cb: () => {
  94. countDown.value--
  95. if (countDown.value <= 1) {
  96. stx.pause()
  97. }
  98. },
  99. delay: 1000
  100. })
  101. stx.start()
  102. const backAppPage = () => {
  103. appRouter.back()
  104. }
  105. // 跳转
  106. const pageInfo = () => {
  107. let _reload, _next, _title;
  108. // navigateExercise
  109. // navigateRecord
  110. switch (from) {
  111. case FromEnum.ani:
  112. _reload = () => appRouter.push("reloadGame")
  113. _next = () => appRouter.push("navigateExercise")
  114. _title = '练一练'
  115. break;
  116. case FromEnum.exercise:
  117. _reload = () => appRouter.push("reloadGame")
  118. _next = () => appRouter.push("navigateRecord")
  119. _title = '讲一讲'
  120. break;
  121. default:
  122. _reload = () => appRouter.push("reloadGame")
  123. _next = () => appRouter.push("navigateRecord")
  124. _title = '讲一讲'
  125. break;
  126. }
  127. return {
  128. reload: _reload,
  129. next: _next,
  130. title: _title
  131. }
  132. }
  133. onMounted(() => {
  134. useSchedulerOnce({cb: initRive, delay: 4})
  135. })
  136. </script>
  137. <style scoped lang="scss" >
  138. .t-page {
  139. width: 100vw;
  140. height: 100vh;
  141. overflow: hidden;
  142. .back-icon {
  143. img {
  144. width: 38px;
  145. height: 36px;
  146. }
  147. }
  148. .countdown-container {
  149. font-family: PingFangSC-Semibold, PingFang SC;
  150. font-weight: 600;
  151. color: #ED5D00;
  152. display: flex;
  153. flex-direction: column;
  154. justify-content: center;
  155. align-items: center;
  156. .countdown {
  157. font-size: 24px;
  158. }
  159. .desc {
  160. font-size: 16px;
  161. }
  162. }
  163. }
  164. #rive-ani {
  165. width: 100vw;
  166. // height: 300px;
  167. position: absolute;
  168. left: 50%;
  169. transform: translateX(-50%);
  170. display: flex;
  171. justify-content: center;
  172. }
  173. .t-page-v {
  174. .back-icon {
  175. position: fixed;
  176. top: 50px;
  177. left: 27px;
  178. }
  179. .countdown-container {
  180. position: fixed;
  181. top: 324px;
  182. left: 50%;
  183. transform: translateX(-50%);
  184. }
  185. .opra {
  186. position: fixed;
  187. top: 421px;
  188. left: 50%;
  189. transform: translateX(-50%);
  190. display: flex;
  191. flex-direction: column;
  192. }
  193. }
  194. .t-page-h {
  195. .back-icon {
  196. position: fixed;
  197. top: 17px;
  198. left: 42px;
  199. }
  200. .countdown-container {
  201. position: fixed;
  202. top: 216px;
  203. left: 50%;
  204. transform: translateX(-50%);
  205. }
  206. .opra {
  207. position: fixed;
  208. top: 284px;
  209. left: 50%;
  210. transform: translateX(-50%);
  211. display: flex;
  212. }
  213. }
  214. </style>