zoukankan      html  css  js  c++  java
  • 游戏中跟踪弹算法

    在飞行射击游戏中,恐怕没有一个游戏不用到跟踪算法的。比如在玩街机的时候,是不是经常挂于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项限为负

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

    假设敌人子弹的坐标为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.1415926…………(呵呵,别忘记近似哦)
    好了,现在已经得到正确的方向了,可以计算子弹坐标了!
    
    slug.x += slug.speed * cos(theta);
    slug.y += slug.speed * sin(theta);
    
      

     

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

  • 相关阅读:
    D. Constructing the Array
    B. Navigation System
    B. Dreamoon Likes Sequences
    A. Linova and Kingdom
    G. Special Permutation
    B. Xenia and Colorful Gems
    Firetrucks Are Red
    java getInstance()的使用
    java 静态代理和动态代理
    java 类加载机制和反射机制
  • 原文地址:https://www.cnblogs.com/lm3515/p/1832348.html
Copyright © 2011-2022 走看看