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

📄 ch17p2_constspeedcrunchtransition.cpp

📁 游戏开发特殊技巧-special.effects.game.programming
💻 CPP
字号:
#include "Ch17p2_ConstSpeedCrunchTransition.h"

CConstSpeedCrunchTransition::CConstSpeedCrunchTransition(LPDIRECT3DDEVICE8 pDev, LPDIRECT3DTEXTURE8 pOrigImage, 
                                         LPDIRECT3DTEXTURE8 pNewImage, int iNumTiles)
{
  m_pNewImage = pNewImage;
  m_pOrigImage = pOrigImage;
  m_pd3dDevice = pDev;
  m_fFadeTime = 0;
  m_iNumVertsX = iNumTiles+1;
  m_iNumVertsY = iNumTiles+1;
  
  // create vertex buffer for one quad
  if (FAILED(CreateQuad(&m_pVBQuad, D3DPOOL_MANAGED, 2, 0, pDev))) {
    throw("Error creating quad vertex buffer!");
  }
  
  // now create a quad-shaped mesh for the meting image
  CreateVertexFrame(&m_pVBMelt, &m_pIBMelt, D3DPOOL_MANAGED, 2, 0, m_iNumVertsX, m_iNumVertsY, m_pd3dDevice);

  SetDuration(100.0f);
}

void CConstSpeedCrunchTransition::SetDuration(const float data) 
{ 
  CTransition::SetDuration(data);
  m_FallSpeed.m_Min = 1.0f / m_fDuration;
  m_FallSpeed.m_Max = 2.0f / m_fDuration;

  m_Speed.clear();

  for (int q=0; q < ((m_iNumVertsX-1)*2)+((m_iNumVertsY-1)*2)+1; q++) {
    m_Speed.push_back(m_FallSpeed.GetRandomNumInRange());
  }
}

CConstSpeedCrunchTransition::~CConstSpeedCrunchTransition()
{
  SAFE_RELEASE(m_pVBQuad);
  SAFE_RELEASE(m_pVBMelt);
  SAFE_RELEASE(m_pIBMelt);
}


void CConstSpeedCrunchTransition::DoTransition(float fTransTime)
{
  m_fFadeTime += fTransTime;

  HRESULT hr;
  VERTEX_XYZ_DIFFUSE_TEX1* pVertices; 
 
  if( FAILED( hr = m_pVBMelt->Lock( 0, (((m_iNumVertsX-1)*2)+((m_iNumVertsY-1)*2)+1)*sizeof(VERTEX_XYZ_DIFFUSE_TEX1), 
      (BYTE**)&pVertices, 0 ) ) )
    return;

  float fTotalSize = 2.0f;
  float fSizeDiv2 = fTotalSize / 2.0f;
  for (int q=0; q < ((m_iNumVertsX-1)*2)+((m_iNumVertsY-1)*2)+1; q++) {
    
    D3DXVECTOR3 &v = pVertices->position;
    float fStepsX = -(pVertices->tu-0.5f) / 0.5f;
    float fStepsY =  (pVertices->tv-0.5f) / 0.5f;

    if ((fStepsX > 0 && v.x < 0) || (fStepsX < 0 && v.x > 0)) v.x += m_Speed[q] * fTransTime * fStepsX;
    if ((fStepsY < 0 && v.y > 0) || (fStepsY > 0 && v.y < 0)) v.y += m_Speed[q] * fTransTime * fStepsY;

    pVertices++;
  }
  if(FAILED(hr = m_pVBMelt->Unlock())) return;
}

void CConstSpeedCrunchTransition::DoRender(D3DXMATRIX mFinalScale)
{  
  m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);

  // set up our texture stages 
  m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_SELECTARG1 );
  m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
  m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1 );

  if (m_fFadeTime > 0.0f) {
    // set up texture stage states 
    m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
    m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE );
    m_pd3dDevice->SetTexture( 0, m_pNewImage);
  
    m_pd3dDevice->SetStreamSource(0, m_pVBQuad, sizeof(VERTEX_XYZ_DIFFUSE_TEX1));
    m_pd3dDevice->SetVertexShader(D3DFVF_XYZ_DIFFUSE_TEX1);
    m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
  }

  // set our texture active...
  m_pd3dDevice->SetTexture( 0, m_pOrigImage );
 
  // index mode
  m_pd3dDevice->SetIndices(m_pIBMelt, 0);
  
  // draw our mesh
  m_pd3dDevice->SetStreamSource( 0, m_pVBMelt, sizeof(VERTEX_XYZ_DIFFUSE_TEX1) );
  m_pd3dDevice->SetVertexShader( D3DFVF_XYZ_DIFFUSE_TEX1 );
  m_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 
    ((m_iNumVertsX-1)*2)+((m_iNumVertsY-1)*2)+1, 0, ((m_iNumVertsX-1)*2)+((m_iNumVertsY-1)*2));
}

⌨️ 快捷键说明

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