⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch18p2_particleprops.cpp

📁 游戏开发特殊技巧-special.effects.game.programming
💻 CPP
📖 第 1 页 / 共 2 页
字号:
              OPENFILENAME ofn;       // common dialog box structure
              char szFile[260];       // buffer for filename
              
              // Initialize OPENFILENAME
              ZeroMemory(&ofn, sizeof(OPENFILENAME));
              ofn.lStructSize = sizeof(OPENFILENAME);
              ofn.hwndOwner = hWnd;
              strcpy(szFile, "ParticleSystem.txt");
              ofn.lpstrFile = szFile;
              ofn.nMaxFile = sizeof(szFile);
              ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0\0";
              ofn.lpstrFileTitle = "Save Particle System Properties";
              ofn.nMaxFileTitle = 0;
              ofn.lpstrInitialDir = NULL;
              ofn.Flags = OFN_OVERWRITEPROMPT;

              // Display the Save As dialog box. 

              if (GetSaveFileName(&ofn)==TRUE) {
                if (!g_theSystem->Save(ofn.lpstrFile)) {
                  ::MessageBox(hWnd, g_theSystem->m_strLastError.c_str(), "Error Saving File", MB_ICONSTOP);
                } 
                else SetWindowText(hWnd, ofn.lpstrFile);
              }
            }
            break;

          case IDC_LOAD:
            {
              OPENFILENAME ofn;       // common dialog box structure
              char szFile[260];       // buffer for filename
              
              // Initialize OPENFILENAME
              ZeroMemory(&ofn, sizeof(OPENFILENAME));
              ofn.lStructSize = sizeof(OPENFILENAME);
              ofn.hwndOwner = hWnd;
              strcpy(szFile, "ParticleSystem.txt");
              ofn.lpstrFile = szFile;
              ofn.nMaxFile = sizeof(szFile);
              ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0\0";
              ofn.lpstrFileTitle = "Save Particle System Properties";
              ofn.nMaxFileTitle = 0;
              ofn.lpstrInitialDir = NULL;
              ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

              // Display the Save As dialog box. 

              if (GetOpenFileName(&ofn)==TRUE) {
                if (!g_theSystem->Load(ofn.lpstrFile)) {
                  ::MessageBox(hWnd, g_theSystem->m_strLastError.c_str(), "Error Loading File", MB_ICONSTOP);
                } 
                else SetWindowText(hWnd, ofn.lpstrFile);
              }
            }
            break;



        } // switch wID
      } // WM_COMMAND block
      break;
  } // switch uMsg
  return(0);
}

//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: Entry point to the program. Initializes everything, and goes into a
//       message-processing loop. Idle time is used to render the scene.
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
  CMyD3DApplication d3dApp;
  g_pD3DApp = &d3dApp;

  if( FAILED( d3dApp.Create( hInst ) ) )
    return 0;

  return d3dApp.Run();
}

//-----------------------------------------------------------------------------
// Name: CMyD3DApplication()
// Desc: Application constructor. Sets attributes for the app.
//-----------------------------------------------------------------------------
CMyD3DApplication::CMyD3DApplication()
{
  m_strWindowTitle    = _T("Ch18p2_ParticleProps");
  m_bUseDepthBuffer   = TRUE;

  m_pFont            = new CD3DFont( _T("Arial"), 12, D3DFONT_BOLD );
  m_pFontSmall       = new CD3DFont( _T("Arial"),  9, D3DFONT_BOLD );
}

//-----------------------------------------------------------------------------
// Name: OneTimeSceneInit()
// Desc: Called during initial app startup, this function performs all the
//       permanent initialization.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::OneTimeSceneInit()
{
  return S_OK;
}

//-----------------------------------------------------------------------------
// Name: FrameMove()
// Desc: Called once per frame, the call is the entry point for animating
//       the scene.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::FrameMove()
{
  if (m_fElapsedTime < 0.0001f) m_fElapsedTime = 0.0001f;
  m_PartSys.Update(m_fTime, m_fElapsedTime);
  return S_OK;
}

void CMyD3DApplication::ProcessInput()
{
  const float fSpeed = 0.5f;
  unsigned char m_bKey[256];
  ZeroMemory( m_bKey, 256 );
  GetKeyboardState(m_bKey);
  // Process keyboard input
  if(m_bKey['D'] & 128) m_Camera.AddToVelocity(D3DXVECTOR3(fSpeed, 0.0f, 0.0f)); // Slide Right
  if(m_bKey['A'] & 128) m_Camera.AddToVelocity(D3DXVECTOR3(-fSpeed, 0.0f, 0.0f));// Slide Left
  if(m_bKey['Q'] & 128) m_Camera.AddToVelocity(D3DXVECTOR3(0.0f, fSpeed, 0.0f)); // Slide Up
  if(m_bKey['Z'] & 128) m_Camera.AddToVelocity(D3DXVECTOR3(0.0f, -fSpeed, 0.0f));// Slide Down
  if(m_bKey['W'] & 128) m_Camera.AddToVelocity(D3DXVECTOR3(0.0f, 0.0f, fSpeed)); // Slide Foward
  if(m_bKey['S'] & 128) m_Camera.AddToVelocity(D3DXVECTOR3(0.0f, 0.0f, -fSpeed));// Slide Back
  if(m_bKey['L'] & 128) m_Camera.AddToYawPitchRoll(fSpeed, 0.0f, 0.0f);  // Turn Right
  if(m_bKey['J'] & 128) m_Camera.AddToYawPitchRoll(-fSpeed, 0.0f, 0.0f); // Turn Left
  if(m_bKey['K'] & 128) m_Camera.AddToYawPitchRoll(0.0f, fSpeed, 0.0f); // Turn Down
  if(m_bKey['I'] & 128) m_Camera.AddToYawPitchRoll(0.0f, -fSpeed, 0.0f);// Turn Up

  // mouse look
  DIMOUSESTATE2 dims2;
  m_InputManager.ReadMouse(dims2);

  // play with the divisor constants to change the mouselook sensitivity.
  // I've found that these values most accurately simulate my beloved Q3A setup. :)
  m_Camera.AddToYawPitchRoll((float)dims2.lX/0.8f, (float)dims2.lY/0.8f, 0.0f);
  
}

//-----------------------------------------------------------------------------
// Name: Render()
// Desc: Called once per frame, the call is the entry point for 3d
//       rendering. This function sets up render states, clears the
//       viewport, and renders the scene.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::Render()
{
  
  // these are done here so that you can move the camera around during a freeze
  // frame, ala The Matrix

  //ProcessInput();
  m_Camera.Update(m_fElapsedTime);

  m_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
  m_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
  m_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );

  // Clear the backbuffer
  m_pd3dDevice->Clear( 0L, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
                       0x000000, 1.0f, 0L );
  
  if( SUCCEEDED( m_pd3dDevice->BeginScene() ) )
  {
    if (m_bShowGround) {
      // draw our quad
      m_pd3dDevice->SetTransform( D3DTS_VIEW, &m_Camera.GetViewMatrix());
      m_pd3dDevice->SetTexture( 0, m_Ground.GetTexture() );
      m_pd3dDevice->SetVertexShader( D3DFVF_XYZ_DIFFUSE_TEX1 );
      m_pd3dDevice->SetStreamSource( 0, m_Ground.GetVB(), sizeof(VERTEX_XYZ_DIFFUSE_TEX1) );
      m_pd3dDevice->SetIndices( m_Ground.GetIB(), 0L );
      m_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 
        m_Ground.GetNumVerts(), 0, m_Ground.GetNumIndices()/3 );
    }

    // setup alpha blending states
    m_pd3dDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE );
    m_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
    
    // render the particle system
    m_PartSys.Render();

    char buf[256];
    _snprintf(buf, 256, "Particles: %d, FPS: %0.2f", 
      m_PartSys.GetNumActiveParticles(), m_fFPS);

    m_pFontSmall->DrawText( 2,  0, D3DCOLOR_ARGB(255,255,255,0), buf );

    // End the scene.
    m_pd3dDevice->EndScene();
  }

  return S_OK;
}

//-----------------------------------------------------------------------------
// Name: InitDeviceObjects()
// Desc: Initialize scene objects.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InitDeviceObjects()
{
  m_pFont->InitDeviceObjects( m_pd3dDevice );
  m_pFontSmall->InitDeviceObjects( m_pd3dDevice );
  return S_OK;
}

//-----------------------------------------------------------------------------
// Name: RestoreDeviceObjects()
// Desc: Initialize scene objects.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::RestoreDeviceObjects()
{

  SetWindowLong( m_hWnd, GWL_STYLE, m_dwWindowStyle );

  static bool bBeenHere = false;
  m_InputManager.CreateDevices(m_hWnd, false, true);

  m_pFont->RestoreDeviceObjects();
  m_pFontSmall->RestoreDeviceObjects();
  m_Camera.SetPosition(D3DXVECTOR3(0.0f, 2.0f, -5.0f));

  // create the ground plane
  m_Ground.RestoreDeviceObjects(m_pd3dDevice, "Ch18p2_GroundTexture.png", 256.0f, 256.0f, 8);

  // initialize the particle system
  if (!bBeenHere) {
    // first time here, set initial system properties
    m_PartSys.SetSpawnDir1(D3DXVECTOR3(-2.0f, -2.0f, -2.0f));
    m_PartSys.SetSpawnDir2(D3DXVECTOR3( 2.0f, 2.0f,  2.0f));
    m_PartSys.SetStartColor1(D3DXCOLOR(0.0f, 0.0f, 0.0f, 0.0f));
    m_PartSys.SetStartColor2(D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f));
    m_PartSys.SetEndColor1(D3DXCOLOR(0.0f, 0.0f, 0.0f, 0.0f));
    m_PartSys.SetEndColor2(D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f));
    m_PartSys.SetPos(D3DXVECTOR3(0.0f, 2.0f, 0.0f));
    m_PartSys.SetLifetime(CMinMax<float>(0.0f, 10.0f));
    m_PartSys.SetEmitRate(CMinMax<float>(10.0f, 20.0f));
    m_PartSys.SetTexture("Ch18p2_ParticleTexture.png");
  }  

  bBeenHere = true;
  
  // initialize it!
  m_PartSys.RestoreDeviceObjects(m_pd3dDevice);

  // initialize the dialog
  {
    g_theSystem = &m_PartSys; // so dialog box can get at it.

    m_hWndPropDlg = CreateDialog(NULL, MAKEINTRESOURCE(IDD_PARTICLEPROPS), m_hWnd, 
      (DLGPROC) PropDlgProc); 

    ShowWindow(m_hWndPropDlg, SW_SHOW); 
  }

  // Set the world matrix
  D3DXMATRIX matWorld;
  D3DXMatrixIdentity( &matWorld );
  m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );

  // Set projection matrix
  D3DXMATRIX matProj;
  FLOAT fAspect = ((FLOAT)m_d3dsdBackBuffer.Width) / m_d3dsdBackBuffer.Height;
  D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, fAspect, 0.1f, 100.0f );
  m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );

  m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
  m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
  m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
  m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE );
  m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP,   D3DTOP_DISABLE );
  m_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP,   D3DTOP_DISABLE );

  m_pd3dDevice->SetRenderState( D3DRS_SRCBLEND,  D3DBLEND_ONE );
  m_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
  m_pd3dDevice->SetRenderState( D3DRS_LIGHTING,  FALSE );
  m_pd3dDevice->SetRenderState( D3DRS_CULLMODE,  D3DCULL_CCW );
  m_pd3dDevice->SetRenderState( D3DRS_SHADEMODE, D3DSHADE_FLAT );

  return S_OK;
}

//-----------------------------------------------------------------------------
// Name: InvalidateDeviceObjects()
// Desc:
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InvalidateDeviceObjects()
{
  DestroyWindow(m_hWndPropDlg);

  m_InputManager.DestroyDevices();

  m_pFont->InvalidateDeviceObjects();
  m_pFontSmall->InvalidateDeviceObjects();
  
  m_Ground.InvalidateDeviceObjects();
  m_PartSys.InvalidateDeviceObjects();
  return S_OK;
}

//-----------------------------------------------------------------------------
// Name: DeleteDeviceObjects()
// Desc: Called when the app is exiting, or the device is being changed,
//       this function deletes any device dependent objects.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::DeleteDeviceObjects()
{
  m_pFont->DeleteDeviceObjects();
  m_pFontSmall->DeleteDeviceObjects();
  
  m_Ground.DeleteDeviceObjects();
  return S_OK;
}

//-----------------------------------------------------------------------------
// Name: FinalCleanup()
// Desc: Called before the app exits, this function gives the app the chance
//       to cleanup after itself.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::FinalCleanup()
{
  SAFE_DELETE( m_pFont );
  SAFE_DELETE( m_pFontSmall );
  return S_OK;
}

//-----------------------------------------------------------------------------
// Name: ConfirmDevice()
// Desc: Called during device intialization, this code checks the device
//       for some minimum set of capabilities
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::ConfirmDevice( D3DCAPS8* pCaps, DWORD dwBehavior,
                                          D3DFORMAT Format )
{
  return S_OK;
}

//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: Message proc function to handle key and menu input
//-----------------------------------------------------------------------------
LRESULT CMyD3DApplication::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam,
                                    LPARAM lParam )
{
  // Pass remaining messages to default handler
  return CD3DApplication::MsgProc( hWnd, uMsg, wParam, lParam );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -