亮点飞飞塔罗牌的召唤108
源码注释共享

源码注释共享

相互交流学习,开源,飞飞源码公开
  • 6帖子
  • 8讨论
  • 0关注

迷你版《随机天气》

100

主题

3

回帖

159万

积分

站长

站点维护员

积分
1597724

突出贡献荣誉管理论坛元老

QQ
发表于 7 天前 | 显示全部楼层 |阅读模式
15 0
随机天气的微小源变更。
降雪缓慢,降雪迅速,雨水。
这个代码能随机生成天气,2-5分钟内你可以更改,
玩得开心。

#define __RANDOM_WEATHER // 添加了随机天气:雨/雪/无SkyBox.cpp

  1. void CSkyBox::Process()
  2. {
  3.     if (!g_Option.m_nWeatherEffect) return;

  4.     if (m_pWorld)
  5.     {
  6. #ifdef __RANDOM_WEATHER
  7.         static DWORD dwNextWeatherChange =
  8.             timeGetTime() + (120000 + rand() % 180000); // 2–5 Minuten

  9.         DWORD dwNow = timeGetTime();

  10.         if (dwNow >= dwNextWeatherChange)
  11.         {
  12.             dwNextWeatherChange =
  13.                 dwNow + (120000 + rand() % 180000); // 2–5 Minuten

  14.             int rnd = rand() % 100;
  15.             int nNextWeather;

  16.             if (rnd < 35)
  17.                 nNextWeather = WEATHER_NONE;
  18.             else if (rnd < 70)
  19.                 nNextWeather = WEATHER_RAIN;
  20.             else
  21.                 nNextWeather = WEATHER_SNOW;

  22.             if (m_nWeather != nNextWeather)
  23.             {
  24.                 if (nNextWeather == WEATHER_NONE)
  25.                 {
  26.                     SetWeather(m_nWeather, FALSE);
  27.                     m_nWeather = WEATHER_NONE;
  28.                 }
  29.                 else
  30.                 {
  31.                     SetWeather(nNextWeather, TRUE);
  32.                 }

  33.                 InitFall();
  34.             }
  35.         }
  36. #endif

  37. #ifdef __JEFF_11
  38. #ifdef __CLIENT
  39.         if (m_pWorld->GetID() == WI_WORLD_KEBARAS)
  40.         {
  41.             if (CWorld::m_skyBox.GetWeather() != WEATHER_SNOW)
  42.                 CWorld::m_skyBox.SetWeather(WEATHER_SNOW, TRUE);
  43.         }
  44. #endif    // __CLIENT
  45. #endif    // __JEFF_11
  46.         BOOL bFall = FALSE;

  47.         if (m_nWeather == WEATHER_RAIN)
  48.         {
  49.             for (int i = 0; i < (int)(m_nFall); i++)
  50.             {
  51.                 FLOAT fheight = m_pWorld->GetLandHeight_Fast(m_vFall[i].x, m_vFall[i].z) - 1.0f;
  52.                 if (fheight == 0) fheight = 100000.0f;
  53.                 if (1) //m_timerWeather.IsTimeOut() == FALSE )
  54.                 {
  55.                     if (fheight > m_vFall[i].y)
  56.                     {
  57.                         if (xRandom(10) >= 7)
  58.                         {
  59.                             D3DXVECTOR3 v3Pos;
  60.                             D3DXVECTOR3 vec3Tri[3];
  61.                             m_pWorld->GetLandTri(m_vFall[i].x, m_vFall[i].z, vec3Tri);
  62.                             FLOAT ffHeight = m_pWorld->GetLandHeight(m_vFall[i].x, m_vFall[i].z);

  63.                             D3DXVECTOR3 vVector1 = vec3Tri[2] - vec3Tri[0];
  64.                             D3DXVECTOR3 vVector2 = vec3Tri[1] - vec3Tri[0];
  65.                             D3DXVECTOR3 vNormal;
  66.                             D3DXVec3Cross(&vNormal, &vVector1, &vVector2);
  67.                             D3DXVec3Normalize(&vNormal, &vNormal);

  68.                             D3DXVECTOR3 v3Up = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
  69.                             D3DXVECTOR3 v3Cross;
  70.                             FLOAT fDot;
  71.                             FLOAT fTheta;
  72.                             D3DXVec3Cross(&v3Cross, &v3Up, &vNormal);
  73.                             fDot = D3DXVec3Dot(&v3Up, &vNormal);
  74.                             fTheta = acos(fDot);

  75.                             D3DXQUATERNION qDirMap;
  76.                             D3DXQuaternionRotationAxis(&qDirMap, &v3Cross, fTheta);

  77.                             v3Pos = m_vFall[i];
  78.                             v3Pos.y = ffHeight + 0.1f;

  79.                             D3DXVECTOR3 vYPW;
  80.                             QuaternionRotationToYPW(qDirMap, vYPW);


  81.                             LPWATERHEIGHT pWaterHeight = m_pWorld->GetWaterHeight(m_vFall[i]);

  82.                             if (pWaterHeight &&
  83.                                 (pWaterHeight->byWaterTexture & (byte)(~MASK_WATERFRAME)) == WTYPE_WATER)
  84.                             {
  85.                                 FLOAT fHeight = (FLOAT)pWaterHeight->byWaterHeight;
  86.                                 v3Pos.y = fHeight;
  87.                                 CSfx* pObj = CreateSfx(g_Neuz.m_pd3dDevice, XI_GEN_RAINCIRCLE01, v3Pos);
  88.                                 FLOAT fscal = (FLOAT)(xRandom(2) + 1);

  89.                                 fscal *= 0.1f;

  90.                                 pObj->SetScale(D3DXVECTOR3(fscal, fscal, fscal));
  91.                             }
  92.                             else
  93.                             {
  94.                                 FLOAT fscal = xRandom(2) + 0.05f;
  95.                                 CSfx* pObj = CreateSfx(g_Neuz.m_pd3dDevice, XI_GEN_RAINCIRCLE01, v3Pos);
  96.                                 fscal *= 0.1f;
  97.                                 pObj->SetScale(D3DXVECTOR3(fscal, fscal, fscal));

  98.                                 pObj->m_pSfxObj->m_vRotate.x = D3DXToDegree(vYPW.x);
  99.                                 pObj->m_pSfxObj->m_vRotate.y = D3DXToDegree(vYPW.y);
  100.                                 pObj->m_pSfxObj->m_vRotate.z = D3DXToDegree(vYPW.z);

  101.                             }
  102.                         }
  103.                         m_vFall[i].x = g_pPlayer->GetPos().x + (float(rand() - RAND_MAX / 2) / RAND_MAX * 70);
  104.                         m_vFall[i].z = g_pPlayer->GetPos().z + (float(rand() - RAND_MAX / 2) / RAND_MAX * 70);
  105.                         m_vFall[i].y = g_pPlayer->GetPos().y + 10 + (float(rand()) / RAND_MAX * 10);
  106.                     }
  107.                     else
  108.                     {
  109.                         m_vFall[i] += m_vVelocity[i] * 1.5;
  110.                     }
  111.                     bFall = TRUE;
  112.                 }
  113.                 else

  114.                     if (fheight < m_vFall[i].y)
  115.                     {
  116.                         bFall = TRUE;
  117.                         m_vFall[i] += m_vVelocity[i] * 1.5;
  118.                     }
  119.             }
  120.         }
  121.         else if (m_nWeather == WEATHER_SNOW )
  122.         {
  123.             for (int i = 0; i < (int)(m_nFall); i++)
  124.             {
  125.                 FLOAT fheight = m_pWorld->GetLandHeight_Fast(m_vFall[i].x, m_vFall[i].z) - 1.0f;
  126.                 if (fheight == 0)
  127.                     fheight = 100000.0f;
  128.                 if (1) //m_timerWeather.IsTimeOut() == FALSE )
  129.                 {
  130.                     if (fheight > m_vFall[i].y)
  131.                     {
  132.                         m_vFall[i].x = g_pPlayer->GetPos().x + (float(rand() - RAND_MAX / 2) / RAND_MAX * 70);
  133.                         m_vFall[i].z = g_pPlayer->GetPos().z + (float(rand() - RAND_MAX / 2) / RAND_MAX * 70);
  134.                         m_vFall[i].y = g_pPlayer->GetPos().y + 10 + (float(rand()) / RAND_MAX * 20);
  135.                     }
  136.                     else
  137.                         m_vFall[i] += m_vVelocity[i];
  138.                     bFall = TRUE;
  139.                 }
  140.                 else

  141.                     if (fheight < m_vFall[i].y)
  142.                     {
  143.                         bFall = TRUE;
  144.                         m_vFall[i] += m_vVelocity[i];
  145.                     }
  146.             }
  147.         }
  148.         //    if( bFall == FALSE )
  149.         //        m_nWeather = WEATHER_NONE;
  150.     }
  151. }
复制代码
  1. initfall

  2.     // -------------------------------------------------
  3.     // KEIN STURM, KEIN WIND
  4.     // -------------------------------------------------
  5.     m_bStorm = false;

  6.     // -------------------------------------------------
  7.     // PARTIKEL-MENGE (ruhig & wenig)
  8.     // -------------------------------------------------
  9.     if (m_nWeather == WEATHER_RAIN)
  10.         m_nFall = 300;          // 🌧 sehr sanfter Regen
  11.     else if (m_nWeather == WEATHER_SNOW)
  12.         m_nFall = 250;          // ❄ ruhiger Schnee
  13.     else
  14.         m_nFall = 0;
  15.         
  16.         
  17.    
  18.     // -------------------------------------------------
  19.     // INTENSITÄT (sehr sanft)
  20.     // -------------------------------------------------
  21.     float rainIntensity = -0.015f; // langsamer, ruhiger Fall
  22.     float snowIntensity = -0.005f;   
  23.    
  24.    
  25.         // -------------------------------------------------
  26.     // FALL-PARTIKEL
  27.     // -------------------------------------------------
  28.     for (int i = 0; i < m_nFall; i++)
  29.     {
  30.         m_vFall[i].x = g_pPlayer->GetPos().x +
  31.             (float(rand() - RAND_MAX / 2) / RAND_MAX * 60.0f);
  32.         m_vFall[i].z = g_pPlayer->GetPos().z +
  33.             (float(rand() - RAND_MAX / 2) / RAND_MAX * 60.0f);
  34.         m_vFall[i].y = g_pPlayer->GetPos().y +
  35.             10.0f + (float(rand()) / RAND_MAX * 8.0f);

  36.         // -----------------------------
  37.         // RAIN (ruhig, gerade)
  38.         // -----------------------------
  39.         if (m_nWeather == WEATHER_RAIN)
  40.         {
  41.             int y = -6 - xRandom(6);

  42.             m_vVelocity[i] = D3DXVECTOR3(
  43.                 0.0f,                                  // kein Wind
  44.                 float(y) / 220.0f - 0.04f + rainIntensity,
  45.                 0.0f
  46.             );
  47.         }

  48.         // -----------------------------
  49.         // SNOW (ruhig)
  50.         // -----------------------------
  51.         else if (m_nWeather == WEATHER_SNOW)
  52.         {
  53.             int y = -1 - xRandom(2);

  54.             m_vVelocity[i] = D3DXVECTOR3(
  55.                 0.0f,
  56.                 float(y) / 320.0f - 0.01f + snowIntensity,
  57.                 0.0f
  58.             );
  59.         }
  60.     }
  61. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册
发表评论