1 void CbitmapDlg::OnHit()
2 {
3 //defender hit
4 for(int i = 0; i < iCurplane; i++)
5 {
6 //修正定时器偏差和键盘消息之间偏差导致的错误碰撞检测
7 if (plane[i].status == DESTROYED)
8 continue;
9 int defendcox = superdefender.pos_x + superdefender.Deswidth/2;
10 int defendcoy = superdefender.pos_y + superdefender.Desheight/2;
11 int planecox = plane[i].pos_x + plane[i].Deswidth/2;
12 int planecoy = plane[i].pos_y + plane[i].Desheight/2;
13
14 //按照圆形包围体检测
15 if(((defendcox - planecox)*(defendcox - planecox) + (defendcoy - planecoy)*(defendcoy - planecoy)) > ((superdefender.Desheight + plane[i].Desheight)*(superdefender.Desheight + plane[i].Desheight)/4 + (superdefender.Deswidth + plane[i].Deswidth)*(superdefender.Deswidth + plane[i].Deswidth)/4))
16 continue;
17 else
18 {
19 //检测defender的4个点是否碰撞到飞机
20 CRect rect;
21 rect.left = plane[i].pos_x;
22 rect.right = plane[i].pos_x + plane[i].Deswidth;
23 rect.top = plane[i].pos_y;
24 rect.bottom = plane[i].pos_y + plane[i].Desheight;
25
26 CPoint point1, point2, point3, point4;
27 point1.x = superdefender.pos_x;
28 point1.y = superdefender.pos_y;
29 point2.x = superdefender.pos_x + superdefender.Deswidth;
30 point2.y = superdefender.pos_y;
31 point3.x = superdefender.pos_x;
32 point3.y = superdefender.pos_y + superdefender.Desheight;
33 point4.x = superdefender.pos_x + superdefender.Deswidth;
34 point4.y = superdefender.pos_y + superdefender.Desheight;
35
36 if(PtInRect(rect, point1) || PtInRect(rect, point2) || PtInRect(rect, point3) || PtInRect(rect, point4))
37 superdefender.status = DESTROYED;
38
39 }
40 if(superdefender.status == DESTROYED)
41 {
42 life -= 1;
43 AddDefender();
44 return ;
45 }
46 }
47 }
- 海报