程序改变世界

2D 游戏激光炮实现

2017-12-01  本文已影响21人  齊葩

1:首先需要知道起点,终点,激光宽度
2:判断所有的敌人与激光起点,终点连接起来的线段的垂直距离,如果小于激光宽度/2就说明打到了(注意敌人是有体积的)

基本没什么难点,如果有就是计算敌人与线段的垂直距离。

下面是计算距离的代码

/*********************************/  
// 如果经过点做直线的垂足,垂足落在线段上,则取垂线段的距离  
// 否则取到线段两端点距离的最小值  
//  
// 参数:  
// point:  存储点的xy坐标  
// p1, p2: 线段的两点  
//  
// return: 点到线段的最小距离  
/*********************************/  
private static double distance(Point p, Point p1) {
    return Math.hypot(p.x-p1.x, p.y-p1.y);
  }
  //点到线段的最短距离,x0,y0是圆心
  private static double pointToLine(Point p1,Point p2, Point p) {
    double ans = 0;
    double a, b, c;
    a = distance(p1, p2);
    b = distance(p1, p);
    c = distance(p2, p);
    if (c+b==a) {//点在线段上
      ans = 0;
      return ans;
    }
    if (a<=0.00001) {//不是线段,是一个点
      ans = b;
      return ans;
    }
    if (c*c >= a*a + b*b) { //组成直角三角形或钝角三角形,p1为直角或钝角
      ans = b;
      return ans;
    }
    if (b * b >= a * a + c * c) {// 组成直角三角形或钝角三角形,p2为直角或钝角
      ans = c;
      return ans;
    }
    // 组成锐角三角形,则求三角形的高
    double p0 = (a + b + c) / 2;// 半周长
    double s = Math.sqrt(p0 * (p0 - a) * (p0 - b) * (p0 - c));// 海伦公式求面积
    ans = 2*s / a;// 返回点到线的距离(利用三角形面积公式求高)
    return ans;
  }

点击这里可以看到作者的其他文章


上一篇 下一篇

猜你喜欢

热点阅读