李志伟 3 years ago
parent
commit
881221fcb9
2 changed files with 60 additions and 43 deletions
  1. 60
    42
      src/pages/game/algorithm/cage.js
  2. 0
    1
      src/utils/api.js

+ 60
- 42
src/pages/game/algorithm/cage.js View File

1
 // 辅助逻辑的颜色,
1
 // 辅助逻辑的颜色,
2
-const colorList = ['#f5222d', '#d4380d', '#d46b08', '#d48806', '#d4b106', '#7cb305', '#389e0d', '#08979c', '#096dd9', '#531dab']
3
-import { desginRadius, desginCageRadius, cageNum, scale, primaryColor } from './design';
2
+const colorList = [
3
+  "#f5222d",
4
+  "#d4380d",
5
+  "#d46b08",
6
+  "#d48806",
7
+  "#d4b106",
8
+  "#7cb305",
9
+  "#389e0d",
10
+  "#08979c",
11
+  "#096dd9",
12
+  "#531dab",
13
+];
14
+import {
15
+  desginRadius,
16
+  desginCageRadius,
17
+  cageNum,
18
+  scale,
19
+  primaryColor,
20
+} from "./design";
4
 
21
 
5
 // 绘制目标轿厢
22
 // 绘制目标轿厢
6
 export function drawTargeCages({ two, center }) {
23
 export function drawTargeCages({ two, center }) {
7
   // 摩天轮半径
24
   // 摩天轮半径
8
   const wheelRaduis = desginRadius * scale;
25
   const wheelRaduis = desginRadius * scale;
9
-  const perAngle = Math.PI / cageNum // 2 * Math.PI / ( cageNum * 2 ) 分成 轿厢 * 2 的分数, 最终效果是每隔一个空白,一个轿厢
26
+  const perAngle = Math.PI / cageNum; // 2 * Math.PI / ( cageNum * 2 ) 分成 轿厢 * 2 的分数, 最终效果是每隔一个空白,一个轿厢
10
   const offsetAngle = perAngle / 2;
27
   const offsetAngle = perAngle / 2;
11
   // 轿厢半径
28
   // 轿厢半径
12
-  const cageRadius = desginCageRadius * scale;
13
-  
29
+  const cageRadius = desginCageRadius * scale - 1;
30
+
14
   // 绘制
31
   // 绘制
15
-  const list = Array(cageNum).fill().map((_, inx) => {
16
-    const startAngle = 2 * inx * perAngle - offsetAngle; // 实际效果图是圆形有固定大小的, 不能直接从 0° 开始, 需要从 0 - offset 开始
17
-    // const endAngle = startAngle + perAngle
18
-
19
-    // 1、计算扇形边上的中心坐标
20
-    const cx = center.x + Math.cos(startAngle + perAngle / 2) * wheelRaduis
21
-    const cy = center.y + Math.sin(startAngle + perAngle / 2) * wheelRaduis
22
-
23
-    // 2、轿厢
24
-    const rect = two.makeCircle(cx, cy, cageRadius);
25
-    rect.id = `mnt-${inx}`
26
-    // rect.fill = colorList[inx] // 取消这个注释, 有助于梳理逻辑
27
-    rect.noFill()
28
-    rect.stroke = primaryColor
29
-    rect.linewidth = 2
30
-    rect.dashes = [4]
31
-    rect.__$angle = startAngle;  // 轿厢的初始弧度
32
-    rect.__$mnt = null; // 当前实体轿厢 也就是已经被击中的轿厢
33
-
34
-    return rect
35
-  })
32
+  const list = Array(cageNum)
33
+    .fill()
34
+    .map((_, inx) => {
35
+      const startAngle = 2 * inx * perAngle - offsetAngle; // 实际效果图是圆形有固定大小的, 不能直接从 0° 开始, 需要从 0 - offset 开始
36
+      // const endAngle = startAngle + perAngle
37
+
38
+      // 1、计算扇形边上的中心坐标
39
+      const cx = center.x + Math.cos(startAngle + perAngle / 2) * wheelRaduis;
40
+      const cy = center.y + Math.sin(startAngle + perAngle / 2) * wheelRaduis;
41
+
42
+      // 2、轿厢
43
+      const rect = two.makeCircle(cx, cy, cageRadius);
44
+      rect.id = `mnt-${inx}`;
45
+      // rect.fill = colorList[inx] // 取消这个注释, 有助于梳理逻辑
46
+      rect.noFill();
47
+      rect.stroke = primaryColor;
48
+      rect.linewidth = 2;
49
+      rect.dashes = [4];
50
+      rect.__$angle = startAngle; // 轿厢的初始弧度
51
+      rect.__$mnt = null; // 当前实体轿厢 也就是已经被击中的轿厢
52
+
53
+      return rect;
54
+    });
36
 
55
 
37
   // 是否击中
56
   // 是否击中
38
   const checkHit = (bullet) => {
57
   const checkHit = (bullet) => {
39
     // next 是否继续下一轮验证
58
     // next 是否继续下一轮验证
40
     // error 是否发生了错误
59
     // error 是否发生了错误
41
-    let res = { next: true, error: false }
60
+    let res = { next: true, error: false };
42
 
61
 
43
     // 可接受校验偏差范围
62
     // 可接受校验偏差范围
44
     const offset = cageRadius / 3;
63
     const offset = cageRadius / 3;
45
-    
64
+
46
     const rect2 = bullet.getBoundingClientRect();
65
     const rect2 = bullet.getBoundingClientRect();
47
-    const x = rect2.left + rect2.width / 2
48
-    const y = rect2.top + rect2.height / 2
66
+    const x = rect2.left + rect2.width / 2;
67
+    const y = rect2.top + rect2.height / 2;
49
 
68
 
50
     // 如果子弹 y 坐标超过警戒线
69
     // 如果子弹 y 坐标超过警戒线
51
-    if (y < (center.y + wheelRaduis + offset)) {
70
+    if (y < center.y + wheelRaduis + offset) {
52
       res.next = false;
71
       res.next = false;
53
       res.error = true;
72
       res.error = true;
54
       return res;
73
       return res;
58
     const cage = list.filter((it) => {
77
     const cage = list.filter((it) => {
59
       const rect = it.getBoundingClientRect();
78
       const rect = it.getBoundingClientRect();
60
 
79
 
61
-      const left = rect.left + offset
62
-      const right = rect.right - offset
63
-      const top = rect.top + offset
64
-      const bottom = rect.bottom - offset
80
+      const left = rect.left + offset;
81
+      const right = rect.right - offset;
82
+      const top = rect.top + offset;
83
+      const bottom = rect.bottom - offset;
65
 
84
 
66
       // 如果当前子弹的中心点位于目标轿厢矩形范围内
85
       // 如果当前子弹的中心点位于目标轿厢矩形范围内
67
       // 则代表击中
86
       // 则代表击中
68
-      return x >= left && x <= right &&
69
-        y >= top && y <= bottom;
70
-    })[0]
87
+      return x >= left && x <= right && y >= top && y <= bottom;
88
+    })[0];
71
 
89
 
72
     // 未找到对应的目标轿厢
90
     // 未找到对应的目标轿厢
73
     if (!cage) {
91
     if (!cage) {
74
       res.next = true;
92
       res.next = true;
75
       res.error = false;
93
       res.error = false;
76
       return res;
94
       return res;
77
-    };
78
-    
95
+    }
96
+
79
     // 如果目标轿厢已经挂载了一个
97
     // 如果目标轿厢已经挂载了一个
80
     if (cage.__$mnt) {
98
     if (cage.__$mnt) {
81
       res.next = false;
99
       res.next = false;
90
     res.next = false;
108
     res.next = false;
91
     res.error = false;
109
     res.error = false;
92
     return res;
110
     return res;
93
-  }
111
+  };
94
 
112
 
95
   return {
113
   return {
96
     list,
114
     list,
97
     cageRadius,
115
     cageRadius,
98
     checkHit,
116
     checkHit,
99
-  }
117
+  };
100
 }
118
 }

+ 0
- 1
src/utils/api.js View File

29
 
29
 
30
 /**
30
 /**
31
  * @游戏排行榜
31
  * @游戏排行榜
32
- *
33
  */
32
  */
34
 //
33
 //
35
 export const gameTop = () => request(`/api/wx/top`, { method: 'get' })
34
 export const gameTop = () => request(`/api/wx/top`, { method: 'get' })