西西河

主题:初到贵宝地,灌一点游戏开发的东东 -- foundera

共:💬23 🌺4
全看分页树展 · 主题 跟帖
家园 2D飞行射击中简单的跟踪算法

2D飞行射击中简单的跟踪算法

  首先,本文讨论的是很简单的算法。高手莫入。

  在飞行射击游戏中,恐怕没有一个游戏不用到跟踪算法的。比如在玩街机的时候,是不是经常挂于BOSS的“跟踪弹”?

  这是怎样实现的呢?很简单,只要有高中的一点数学知识就行了。

  首先回忆几个三角函数:sin、cos、tan(tg)、arctan(arctg)。

  sin(x) ― 对边/斜边。在1,2项限为正,3,4项限为负。

  cos(x) ― 邻边/斜边。在1,4项限为正,2,3项限为负。

  tan(x) ― 对边/邻边。在1,3项限为正,2,4项限为负。

  考虑到游戏里面的坐标系如下所示:

图1

  假设敌人子弹的坐标为slug.x,slug.y,子弹的速度为slug.speed(全部是double型)。上面的三角形的斜边就代表子弹的速度,则子弹每次移动的时候座标的改变为:

  slug.x+=slug.speed*cos(theta); slug.y+=slug.speed*sin(theta);

  在敌人子弹向你发射过来的时候,首先要计算子弹位置与你所在的位置所夹的角度theta。

  简单计算就是:

  double deltax=player.x-slug.x;  // 注意,是以主角位置为起点,在上图中表示就是x1-x0

  double deltay=player.y-slug.y;  // y1-y0

  为了防止在相除的时候分母为0,做一个判断,使分母近似为0,究竟是负的近似还是正的近似呢?这就需要比较子弹和你的Y坐标谁大谁小了。

  if(deltax==0)

  {

    if(player.y>=slug.y)  // 子弹需要下移

      deltax=0.0000001;

    else          // 子弹需要上移

      deltax=-0.0000001;

  }

  同理,对deltay作判断:

  if(deltay==0)

  {

    if(player.x>=slug.x)  // 子弹需要右移

      deltay=0.0000001;

    else          // 子弹需要左移

      deltay=-0.0000001;

  }

  现在对角度所处的项限作判断:

  if(deltax>0 && deltay>0)

    angle=atan(fabs(deltay/deltax));    // 第一项限

  else if(deltax<0 && deltay<0)

    angle=π-atan(fabs(deltay/deltax));   // 第二项限

  else if(deltax<0 && deltay<0)

    angle=π+atan(fabs(deltay/deltax));   // 第三项限

  else

    angle=2π-atan(fabs(deltay/deltax));  // 第四项限

  其中π取3.1416926…………(呵呵,别忘记近似哦)。好了,现在已经得到正确的方向了,可以计算子弹坐标了。

  slug.x+=slug.speed*cos(theta);

  slug.y+=slug.speed*sin(theta);

  这样,每次子弹移动之前做一下判断,重新计算角度,怎么样?“跟踪弹”出来了吧?

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河