home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1999 February / VPR9902A.BIN / FFILLY / BOID / boid2.tfy < prev    next >
Text File  |  1997-11-23  |  3KB  |  191 lines

  1. #info IART "もりきゅう,VZF07161@niftyserve.or.jp"
  2. #info ICMT "Boid 2"
  3. #info INAM "Boid 2"
  4. #info ICOP "(c)Kazuhiro.Yoshida"
  5. #info ISBJ "Boid 2"
  6. #info VIDO "640x480; 256"
  7. #info GRPC "もりきゅう,VZF07161@niftyserve.or.jp"
  8.  
  9. #include "local.tfy"
  10.  
  11. int distance( int nPx1, int nPy1, int nPx2, int nPy2 )
  12. {
  13.     int nDistance;
  14.     real rPx1, rPy1, rPx2, rPy2, rDistance;
  15.     
  16.     rPx1 = InttoReal(nPx1);
  17.     rPy1 = InttoReal(nPy1);
  18.     rPx2 = InttoReal(nPx2);
  19.     rPy2 = InttoReal(nPy2);
  20.     
  21.     rDistance = Sqrt( Pow( rPx2 - rPx1, 2.0 ) + Pow( rPy2 - rPy1, 2.0 ) );
  22.     nDistance = RealtoInt( rDistance );
  23.     
  24.     return nDistance;
  25. }
  26. main()
  27. {
  28.     int i,j;
  29.     int x,y;
  30.     int sum; // 物体(岩と鳥)の数
  31.     int in; // ここまで岩。ここから鳥。
  32.     
  33.     int wMain;
  34.     int pBase,pBack,pBoid,pRock;
  35.     int cBack;
  36.     int nTransColor; // 透明色
  37.     
  38.     int cBoid[];
  39.     int bw2,bh2;
  40.     
  41.     int nx[],ny[]; // 位置
  42.     int vx[],vy[]; // 速度
  43.     int ax[],ay[]; // 加速度
  44.     
  45.     pBase = LoadPic("base.bmp");
  46.     pBoid = LoadPic("boid.bmp");
  47.     pRock = LoadPic("rock.bmp");
  48.     pBack = copyPic(pBase);
  49.     
  50.     nTransColor = GetColor(pBoid,0,0);
  51.     cBack = PutCast(pBack,pBase);
  52.     wMain = OpenWin(pBase);
  53.     
  54.     // ボイド表示修正用
  55.     bw2 = PicWidth(pBoid) / 2;
  56.     bh2 = PicHeight(pBoid) / 2;
  57.     
  58.     sum = 20;
  59.     in  = 10;
  60.     
  61.     // 岩の状態
  62.     for( i=0 ; i<in ; i=i+1 )
  63.     {
  64.         nx[i] = PicWidth(pBase)/2;
  65.         ny[i] = PicHeight(pBase)/2;
  66.         vx[i] = 0;
  67.         vy[i] = 0;
  68.         ax[i] = 0;
  69.         ay[i] = 0;
  70.         cBoid[i] = PutCast(pRock,pBase,nx[i]-bw2,ny[i]-bh2,nTransColor);
  71.     }
  72.     
  73.     // 鳥の状態
  74.     for( i=in ; i<sum ; i=i+1 )
  75.     {
  76.         nx[i] = Random(PicWidth(pBase));
  77.         ny[i] = Random(PicHeight(pBase));
  78.         vx[i] = Random(11)-5;
  79.         vy[i] = Random(11)-5;
  80.         ax[i] = 0;
  81.         ay[i] = 0;
  82.         cBoid[i] = PutCast(pBoid,pBase,nx[i]-bw2,ny[i]-bh2,nTransColor);
  83.     }
  84.     
  85.     int mesTIME;
  86.     
  87.     mes(TIME)
  88.     {
  89.     step(5)
  90.     {
  91.         // 質量中心を求める
  92.         x=0;
  93.         y=0;
  94.         for(i=0;i<sum;i=i+1)
  95.         {
  96.             x = x + nx[i];
  97.             y = y + ny[i];
  98.         }
  99.         x = x/sum;
  100.         y = y/sum;
  101.         
  102.         // 規則1
  103.         // 鳥は質量中心に向かう
  104.         for(i=in;i<sum;i=i+1)
  105.         {
  106.             if ( nx[i] < x )
  107.             {
  108.                 ax[i] =  1;
  109.             }
  110.             else if ( nx[i] > x )
  111.             {
  112.                 ax[i] = -1;
  113.             }
  114.             
  115.             if ( ny[i] < y )
  116.             {
  117.                 ay[i] =  1;
  118.             }
  119.             else if ( ny[i] > y )
  120.             {
  121.                 ay[i] = -1;
  122.             }
  123.         }
  124.         
  125.         // 規則2
  126.         // 鳥は物体と一定の間隔を空ける
  127.         for(i=in;i<sum;i=i+1)
  128.         {
  129.             for(j=0;j<sum;j=j+1)
  130.             {
  131.                 if ( j==i )
  132.                 {
  133.                     break;
  134.                 }
  135.                 
  136.                 if ( distance(nx[i],ny[i],nx[j],ny[j]) < 80 )
  137.                 {
  138.                     if ( nx[i] < nx[j] )
  139.                     {
  140.                         ax[i] = -1;
  141.                     }
  142.                     else if ( nx[i] > nx[j] )
  143.                     {
  144.                         ax[i] =  1;
  145.                     }
  146.                     
  147.                     if ( ny[i] < ny[j] )
  148.                     {
  149.                         ay[i] = -1;
  150.                     }
  151.                     else if ( ny[i] > ny[j] )
  152.                     {
  153.                         ay[i] =  1;
  154.                     }
  155.                 }
  156.             }
  157.         }
  158.         
  159.         // 鳥の状態を変化
  160.         for(i=in;i<sum;i=i+1)
  161.         {
  162.             vx[i] = vx[i] + ax[i];
  163.             vy[i] = vy[i] + ay[i];
  164.             nx[i] = nx[i] + vx[i] / 2;
  165.             ny[i] = ny[i] + vy[i] / 2;
  166.         }
  167.         
  168.         // 移動
  169.         for(i=in;i<sum;i=i+1)
  170.         {
  171.             MoveCast(cBoid[i],pBoid,nx[i]-bw2,ny[i]-bh2);
  172.         }
  173.     }
  174.     }
  175.     mesTIME = GetMesNo(0);
  176.     
  177.     int pause;
  178.     pause = 0;
  179.     
  180.     mes(LBUP)
  181.     {
  182.         if ( pause == 0 ) {
  183.             FreezeMes(mesTIME);
  184.             pause = 1;
  185.         } else {
  186.             ActivateMes(mesTIME);
  187.             pause = 0;
  188.         }
  189.     }
  190. }
  191.