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

📄 scene3.cpp

📁 我们数据结构课的课程设计
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            
	    Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
	    Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

		Device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
		Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); 
		Device->SetRenderState(D3DRS_ALPHABLENDENABLE, false);

	    Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
	    Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO);

        //
        // Exit 按钮
        // 
        RECT rtExit; 
        SetRect(&rtExit, ScreenWidth-180, ScreenHeight-80, ScreenWidth-33, ScreenHeight-19); 
		IDirect3DVertexBuffer9 *pExitButton; 
		if (FAILED(Device->CreateVertexBuffer(
			6 * sizeof(VertexRHWTEX), 
			D3DUSAGE_WRITEONLY, 
			FVF_VERTEXRHWTEX, 
			D3DPOOL_MANAGED, 
			&pExitButton, 
			0)))
		{
			ERMSG("Device->CreateVertexBuffer(pExitButton) -- FAILED"); 
			return 0; 
		}
        
        pExitButton->Lock(0, 6*sizeof(VertexRHWTEX), (void**)&vertexrhwtex, 0); 

        vertexrhwtex[0] = VertexRHWTEX(rtExit.left, rtExit.bottom, 0.0f, 1.0f, 0.0f, 1.0f); 
        vertexrhwtex[1] = VertexRHWTEX(rtExit.left, rtExit.top, 0.0f, 1.0f, 0.0f, 0.0f); 
        vertexrhwtex[2] = VertexRHWTEX(rtExit.right, rtExit.top, 0.0f, 1.0f, 1.0f, 0.0f); 
        vertexrhwtex[3] = VertexRHWTEX(rtExit.left, rtExit.bottom, 0.0f, 1.0f, 0.0f, 1.0f); 
        vertexrhwtex[4] = VertexRHWTEX(rtExit.right, rtExit.top, 0.0f, 1.0f, 1.0f, 0.0f); 
        vertexrhwtex[5] = VertexRHWTEX(rtExit.right, rtExit.bottom, 0.0f, 1.0f, 1.0f, 1.0f); 

        pExitButton->Unlock(); 
		Device->SetStreamSource(0, pExitButton, 0, sizeof(VertexRHWTEX));
		Device->SetFVF(FVF_VERTEXRHWTEX); 
        if (exitbuttonstatus == ButtonStatus::NORMAL)
            Device->SetTexture(0, TextureButton[4]); 
        else if (exitbuttonstatus == ButtonStatus::MOUSEOVER)
            Device->SetTexture(0, TextureButton[5]); 
            
	    Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
	    Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

		Device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
		Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); 
		Device->SetRenderState(D3DRS_ALPHABLENDENABLE, false);

	    Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
	    Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO);

        ////////////////////////////////////
        
		IDirect3DVertexBuffer9 *pBorder=0;
        if (maze_width*maze_height)
        {
		    if (FAILED(Device->CreateVertexBuffer(
			    6*sizeof(VertexRHWTEX), 
			    D3DUSAGE_WRITEONLY, 
			    FVF_VERTEXRHWTEX, 
			    D3DPOOL_MANAGED, 
			    &pBorder, 
			    0)))
		    {
			    ERMSG("Device->CreateVertexBuffer(pBorder) -- FAILED"); 
                return 0; 
            }
            if (maze_width < 16)
                squaresize = 16.0f; 
            else
                squaresize = 260.0f / maze_width; 
            VertexRHWTEX *vertexrhwtex;
            for (int i=0; i<maze_height; i++)
            {
                for (int j=0; j<maze_width; j++)
                {
                    pBorder->Lock(0, 6*sizeof(VertexRHWTEX), (void**)&vertexrhwtex, 0); 

                    vertexrhwtex[0] = VertexRHWTEX(100.0f+j*48, 100.0f+(i+1)*48, 0.9999f, 1.0f, 0.0f, 1.0f); 
                    vertexrhwtex[1] = VertexRHWTEX(100.0f+j*48, 100.0f+i*48, 0.9999f, 1.0f, 0.0f, 0.0f); 
                    vertexrhwtex[2] = VertexRHWTEX(100.0f+(j+1)*48, 100.0f+i*48, 0.9999f, 1.0f, 1.0f, 0.0f); 
                    vertexrhwtex[3] = VertexRHWTEX(100.0f+j*48, 100.0f+(i+1)*48, 0.9999f, 1.0f, 0.0f, 1.0f); 
                    vertexrhwtex[4] = VertexRHWTEX(100.0f+(j+1)*48, 100.0f+i*48, 0.9999f, 1.0f, 1.0f, 0.0f); 
                    vertexrhwtex[5] = VertexRHWTEX(100.0f+(j+1)*48, 100.0f+(i+1)*48, 0.9999f, 1.0f, 1.0f, 1.0f); 

                    pBorder->Unlock(); 
                    Device->SetStreamSource(0, pBorder, 0, sizeof(VertexRHWTEX)); 
                    Device->SetFVF(FVF_VERTEXRHWTEX); 
                    if (matrix[i][j] == '1')
                        Device->SetTexture(0, Textures[0]); 
                    else
                        Device->SetTexture(0, Textures[1]); 
                    Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); 
                }
            }
        }

///////////////////////

        ////////////////////

        // 剑圣
            
        // Setup the light
        D3DLIGHT9 light;
        D3DUtil_InitLight( light, D3DLIGHT_DIRECTIONAL, 0.0f,-1.0f, 1.0f );
        Device->SetLight(0, &light );
        Device->LightEnable(0, TRUE );

        // Set Light for vertex shader
        D3DXVECTOR4 vLightDir( 0.0f, 1.0f, -1.0f, 0.0f );
        D3DXVec4Normalize( &vLightDir, &vLightDir );
        Device->SetVertexShaderConstantF(1, (float*)&vLightDir, 1);

        // Setup the projection matrix
        D3DXMATRIXA16 matProj;
        FLOAT      fAspect = (FLOAT)m_d3dsdBackBuffer.Width / (FLOAT)m_d3dsdBackBuffer.Height;
        D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/2, fAspect, 
                                    m_fObjectRadius/64.0f, m_fObjectRadius*200.0f );
        Device->SetTransform( D3DTS_PROJECTION, &matProj );

        m_pEffect->SetMatrix( "mViewProj", &matProj);
        m_pEffect->SetVector( "lhtDir", &vLightDir);

        // set the projection matrix for the vertex shader based skinning method
        D3DXMatrixTranspose(&matProj, &matProj);
        Device->SetVertexShaderConstantF(2, (float*)&matProj, 4);

        ///////////////////////////////////////

        if (sign)
        {
            sign = false; 
            FLOAT fDeltaX = ( 1200 ) *  m_ArcBall->m_fRadiusTranslation /  m_ArcBall->m_iWidth;
            FLOAT fDeltaY = ( 750 ) * m_ArcBall->m_fRadiusTranslation / m_ArcBall->m_iHeight;
            D3DXMatrixTranslation( &m_ArcBall->m_matTranslationDelta, -2*fDeltaX, 2*fDeltaY, 200.0f );
            D3DXMatrixMultiply( &m_ArcBall->m_matTranslation, &m_ArcBall->m_matTranslation, &m_ArcBall->m_matTranslationDelta );
            
            D3DXVECTOR3 s_vDown;  
            s_vDown = m_ArcBall->ScreenToVector( 50, 50 );
            m_ArcBall->m_qDown = m_ArcBall->m_qNow;
            D3DXVECTOR3 vCur = m_ArcBall->ScreenToVector( 600, 250 );
            D3DXQUATERNION qAxisToAxis;
            D3DXQuaternionAxisToAxis(&qAxisToAxis, &s_vDown, &vCur);
            m_ArcBall->m_qNow = m_ArcBall->m_qDown;
            m_ArcBall->m_qNow *= qAxisToAxis;
            D3DXMatrixRotationQuaternion(&m_ArcBall->m_matRotationDelta, &qAxisToAxis);  
            D3DXMatrixRotationQuaternion(&m_ArcBall->m_matRotation, &m_ArcBall->m_qNow);  
            s_vDown = m_ArcBall->ScreenToVector( 50, 300 );
            m_ArcBall->m_qDown = m_ArcBall->m_qNow;
            vCur = m_ArcBall->ScreenToVector( 700, 300 );
            D3DXQuaternionAxisToAxis(&qAxisToAxis, &s_vDown, &vCur);
            m_ArcBall->m_qNow = m_ArcBall->m_qDown;
            m_ArcBall->m_qNow *= qAxisToAxis;
            D3DXMatrixRotationQuaternion(&m_ArcBall->m_matRotationDelta, &qAxisToAxis);  
            D3DXMatrixRotationQuaternion(&m_ArcBall->m_matRotation, &m_ArcBall->m_qNow);
            s_vDown = m_ArcBall->ScreenToVector( 50, 150 );
            m_ArcBall->m_qDown = m_ArcBall->m_qNow;

            vCur = m_ArcBall->ScreenToVector(200, 170 );
            D3DXQuaternionAxisToAxis(&qAxisToAxis, &s_vDown, &vCur);
            m_ArcBall->m_qNow = m_ArcBall->m_qDown;
            m_ArcBall->m_qNow *= qAxisToAxis;
            D3DXMatrixRotationQuaternion(&m_ArcBall->m_matRotationDelta, &qAxisToAxis);  
            D3DXMatrixRotationQuaternion(&m_ArcBall->m_matRotation, &m_ArcBall->m_qNow);

        }
        else
        {
            if (!path.empty() && iter != path.end())
            {
                FLOAT fDeltaX = ( 220*( iterX - iter->x ) ) *  m_ArcBall->m_fRadiusTranslation /  m_ArcBall->m_iWidth;
                FLOAT fDeltaY = ( 160*(iterY - iter->y ) ) * m_ArcBall->m_fRadiusTranslation / m_ArcBall->m_iHeight;
                D3DXMatrixTranslation( &m_ArcBall->m_matTranslationDelta, -2*fDeltaX, 2*fDeltaY, 0.0f );
                D3DXMatrixMultiply( &m_ArcBall->m_matTranslation, &m_ArcBall->m_matTranslation, &m_ArcBall->m_matTranslationDelta );
                iterX= iter->x;
                iterY = iter->y; 
                
                {
                    static float y = 10; 
                    y -= timeDelta*8.0f;  
                    if (y<=0)
                    {
                        ++iter;  
                        y = 10;  
                    }
                }
                if (iter == path.end())
                {
                    iter = path.begin(); 
                }
            }
        }

        DrawFrame(m_pFrameRoot);

		Device->EndScene(); 
		Device->Present(0, 0, 0, 0);	

        pSplitLine->Release(); 
        pBorder->Release(); 
        pBkgnd->Release(); 
		pFont->Release(); 
        pExitButton->Release(); 
        pNewButton->Release(); 

	}
	return true; 
}

⌨️ 快捷键说明

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