index.tsx 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import React, { useEffect, useMemo, useRef, useState } from 'react'
  2. import styles from './index.module.scss'
  3. import classNames from 'classnames'
  4. const imgObj = {
  5. 1: require('@/assets/sgImg/bacScene1.jpg'),
  6. 2: require('@/assets/sgImg/bacScene2.jpg'),
  7. 3: require('@/assets/sgImg/bacScene3.jpg'),
  8. 4: require('@/assets/img/A7base3_bg.jpg')
  9. }
  10. type Props = {
  11. isShow: boolean
  12. bacNum: 1 | 2 | 3 | 4
  13. callBackFu?: () => void
  14. }
  15. function Zloding({ isShow, bacNum, callBackFu }: Props) {
  16. // 增加消失的时候透明度
  17. const [flag, setFlag] = useState(false)
  18. const [showFlag, setShowFlag] = useState(false)
  19. useEffect(() => {
  20. setShowFlag(isShow)
  21. }, [isShow])
  22. const bacImgRes = useMemo(() => {
  23. return Reflect.get(imgObj, bacNum)
  24. }, [bacNum])
  25. // 进度条
  26. const [loding, setLoding] = useState(0)
  27. const lodingRef = useRef(0)
  28. const timeRef = useRef(-1)
  29. const flagRef = useRef(true)
  30. useEffect(() => {
  31. if (showFlag) {
  32. window.unityLoading = (progress: number) => {
  33. const num = Math.round(Number(progress * 100))
  34. setLoding(num)
  35. if (num >= 100 && flagRef.current) {
  36. clearTimeout(timeRef.current)
  37. setShowFlag(false)
  38. setFlag(true)
  39. timeRef.current = window.setTimeout(() => {
  40. setLoding(0)
  41. setFlag(false)
  42. }, 1000)
  43. if (callBackFu) callBackFu()
  44. flagRef.current = false
  45. }
  46. }
  47. }
  48. return () => {
  49. clearTimeout(timeRef.current)
  50. }
  51. }, [callBackFu, showFlag])
  52. useEffect(() => {
  53. lodingRef.current = loding
  54. }, [loding])
  55. return (
  56. <div
  57. id='Zloding'
  58. className={classNames(
  59. styles.Zloding,
  60. showFlag ? styles.ZlodingShow : '',
  61. flag && !showFlag ? styles.ZlodingChange : ''
  62. )}
  63. style={{ backgroundImage: `url(${bacImgRes})` }}
  64. >
  65. <div className='ZlodingBox'>
  66. <div className='AlodingT'>
  67. <div className='AlodingT1' style={{ width: `${loding}%` }}></div>
  68. <img
  69. className='AlodingT2'
  70. style={{ left: `${loding}%` }}
  71. src={require('@/assets/sgImg/icon_skip.png')}
  72. alt=''
  73. />
  74. </div>
  75. </div>
  76. </div>
  77. )
  78. }
  79. const MemoZloding = React.memo(Zloding)
  80. export default MemoZloding