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

📄 scene2.cpp

📁 我们数据结构课的课程设计
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        pFont->DrawText(str3, lstrlen(str3), &rtSelectLoadFromFile, DT_LEFT, D3DCOLOR_ARGB(255,255,255,0)); 

		pFont->End(); 

		IDirect3DVertexBuffer9 *pTrangleSign; 
		if (FAILED(Device->CreateVertexBuffer(
			3 * sizeof(VertexRHW), 
			D3DUSAGE_WRITEONLY, 
			FVF_VERTEXRHW, 
			D3DPOOL_MANAGED, 
			&pTrangleSign, 
			0)))
		{
			ERMSG("Device->CreateVertexBuffer -- FAILED"); 
			return 0; 
		}

		VertexRHW *vertexrhw; 
		pTrangleSign->Lock(0, 3*sizeof(VertexRHW), (void**)&vertexrhw, 0); 
		if (input_width == true)
		{
			vertexrhw[0] = VertexRHW(  5.0f,  75.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(0,255,0)); 
			vertexrhw[1] = VertexRHW(  5.0f,  55.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(0,255,0)); 
			vertexrhw[2] = VertexRHW( 20.0f,  65.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(0,255,0)); 
		}
		else
		{
			vertexrhw[0] = VertexRHW(  5.0f,115.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(0,255,0)); 
			vertexrhw[1] = VertexRHW(  5.0f, 95.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(0,255,0)); 
			vertexrhw[2] = VertexRHW( 20.0f,105.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(0,255,0));
		}
		pTrangleSign->Unlock(); 
		Device->SetStreamSource(0, pTrangleSign, 0, sizeof(VertexRHW));
		Device->SetFVF(FVF_VERTEXRHW); 
		Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); 

		IDirect3DVertexBuffer9 *pSplitLine; 
		if (FAILED(Device->CreateVertexBuffer(
			6 * sizeof(VertexRHW), 
			D3DUSAGE_WRITEONLY, 
			FVF_VERTEXRHW, 
			D3DPOOL_MANAGED, 
			&pSplitLine, 
			0)))
		{
			ERMSG("Device->CreateVertexBuffer -- FAILED"); 
			return 0; 
		}
        // 
        // 画 Title 分割线
        //

		pSplitLine->Lock(0, 6*sizeof(VertexRHW), (void**)&vertexrhw, 0); 
        
        vertexrhw[0] = VertexRHW(0.0f, 30.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(213,212,212)); 
        vertexrhw[1] = VertexRHW(0.0f, 27.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(213,212,212)); 
        vertexrhw[2] = VertexRHW(ScreenWidth, 27.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(213,212,212)); 
        vertexrhw[3] = VertexRHW(0.0f, 30.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(213,212,212)); 
        vertexrhw[4] = VertexRHW(ScreenWidth, 27.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(213,212,212)); 
        vertexrhw[5] = VertexRHW(ScreenWidth, 30.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(213,212,212)); 

        pSplitLine->Unlock(); 
		Device->SetStreamSource(0, pSplitLine, 0, sizeof(VertexRHW));
		Device->SetFVF(FVF_VERTEXRHW); 
		Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); 

        //
        // 画中间的分割线
        // 

		pSplitLine->Lock(0, 6*sizeof(VertexRHW), (void**)&vertexrhw, 0); 
        
        vertexrhw[0] = VertexRHW(280.0f, ScreenHeight, 0.0f, 1.0f, D3DCOLOR_XRGB(213,212,212)); 
        vertexrhw[1] = VertexRHW(280.0f, 30.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(213,212,212)); 
        vertexrhw[2] = VertexRHW(284.0f, 30.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(213,212,212)); 
        vertexrhw[3] = VertexRHW(280.0f, ScreenHeight, 0.0f, 1.0f, D3DCOLOR_XRGB(213,212,212)); 
        vertexrhw[4] = VertexRHW(284.0f, 30.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(213,212,212)); 
        vertexrhw[5] = VertexRHW(284.0f, ScreenHeight, 0.0f, 1.0f, D3DCOLOR_XRGB(213,212,212)); 

        pSplitLine->Unlock(); 
		Device->SetStreamSource(0, pSplitLine, 0, sizeof(VertexRHW));
		Device->SetFVF(FVF_VERTEXRHW); 
		Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); 


        // 
        // 画下方的分割线
        // 

		pSplitLine->Lock(0, 6*sizeof(VertexRHW), (void**)&vertexrhw, 0); 
        
        vertexrhw[0] = VertexRHW(284.0f, ScreenHeight-150.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(213,212,212)); 
        vertexrhw[1] = VertexRHW(284.0f, ScreenHeight-154.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(213,212,212));  
        vertexrhw[2] = VertexRHW(ScreenWidth, ScreenHeight-154.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(213,212,212)); 
        vertexrhw[3] = VertexRHW(284.0f, ScreenHeight-150.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(213,212,212)); 
        vertexrhw[4] = VertexRHW(ScreenWidth, ScreenHeight-154.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(213,212,212)); 
        vertexrhw[5] = VertexRHW(ScreenWidth, ScreenHeight-150.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(213,212,212)); 
        pSplitLine->Unlock(); 
		Device->SetStreamSource(0, pSplitLine, 0, sizeof(VertexRHW));
		Device->SetFVF(FVF_VERTEXRHW); 
		Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); 

		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(10.0f+j*squaresize, 200.0f+(i+1)*squaresize, 0.0f, 1.0f, 0.0f, 1.0f); 
                    vertexrhwtex[1] = VertexRHWTEX(10.0f+j*squaresize, 200.0f+i*squaresize, 0.0f, 1.0f, 0.0f, 0.0f); 
                    vertexrhwtex[2] = VertexRHWTEX(10.0f+(j+1)*squaresize, 200.0f+i*squaresize, 0.0f, 1.0f, 1.0f, 0.0f); 
                    vertexrhwtex[3] = VertexRHWTEX(10.0f+j*squaresize, 200.0f+(i+1)*squaresize, 0.0f, 1.0f, 0.0f, 1.0f); 
                    vertexrhwtex[4] = VertexRHWTEX(10.0f+(j+1)*squaresize, 200.0f+i*squaresize, 0.0f, 1.0f, 1.0f, 0.0f); 
                    vertexrhwtex[5] = VertexRHWTEX(10.0f+(j+1)*squaresize, 200.0f+(i+1)*squaresize, 0.0f, 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); 
                }
            }
        }

        // 
        // Next按钮
        // 

        SetRect(&rtNext, ScreenWidth-180 - 180, ScreenHeight-80, ScreenWidth-33 - 180, ScreenHeight-19); 
		IDirect3DVertexBuffer9 *pNextButton; 
		if (FAILED(Device->CreateVertexBuffer(
			6 * sizeof(VertexRHWTEX), 
			D3DUSAGE_WRITEONLY, 
			FVF_VERTEXRHWTEX, 
			D3DPOOL_MANAGED, 
			&pNextButton, 
			0)))
		{
			ERMSG("Device->CreateVertexBuffer(pNextButton) -- FAILED"); 
			return 0; 
		}
        
        pNextButton->Lock(0, 6*sizeof(VertexRHWTEX), (void**)&vertexrhwtex, 0); 

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

        pNextButton->Unlock(); 
		Device->SetStreamSource(0, pNextButton, 0, sizeof(VertexRHWTEX));
		Device->SetFVF(FVF_VERTEXRHWTEX); 
        if (nextbuttonstatus == ButtonStatus::NORMAL)
            Device->SetTexture(0, TextureButton[0]); 
        else if (nextbuttonstatus == ButtonStatus::MOUSEOVER)
            Device->SetTexture(0, TextureButton[1]); 
            
	    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 按钮
        // 

        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);

        // 
        // Select 按钮
        // 
        SetRect(&rtSelect,
            rtSelectLoadFromFile.left-30, 
            rtSelectLoadFromFile.top, 
            rtSelectLoadFromFile.left-10,
            rtSelectLoadFromFile.top+20); 

		IDirect3DVertexBuffer9 *pSelectLoadFromFile = 0; 
		if (FAILED(Device->CreateVertexBuffer(
			6 * sizeof(VertexRHWTEX), 
			D3DUSAGE_WRITEONLY, 
			FVF_VERTEXRHWTEX, 
			D3DPOOL_MANAGED, 
			&pSelectLoadFromFile, 
			0)))
		{
			ERMSG("Device->CreateVertexBuffer(pSelectLoadFromFile) -- FAILED"); 
			return 0; 
		}
        pSelectLoadFromFile->Lock(0, 6*sizeof(VertexRHWTEX), (void**)&vertexrhwtex, 0); 

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

        pSelectLoadFromFile->Unlock(); 
		Device->SetStreamSource(0, pSelectLoadFromFile, 0, sizeof(VertexRHWTEX));
		Device->SetFVF(FVF_VERTEXRHWTEX); 
        if (bLoadFromFile == false)
            Device->SetTexture(0, TextureButton[2]); 
        else
            Device->SetTexture(0, TextureButton[3]); 
		Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); 

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

        D3DVIEWPORT9 vp = {240, 0, 640, 480, 0, 1}; 
        Device->SetViewport(&vp); 

        D3DXVECTOR3 pos(0.0f, 0.0f, -(maze_width>maze_height?maze_width*1.3f:maze_height*1.3f));
	    D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
	    D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);

	    D3DXMATRIX V;
	    D3DXMatrixLookAtLH(
		    &V,
		    &pos,
		    &target,
		    &up);

	    Device->SetTransform(D3DTS_VIEW, &V);

        static float x = D3DX_PI * 0.2f;
		D3DXMATRIX xRot;
        if (GetAsyncKeyState('W') & 0x8000f)
        {
            x += D3DX_PI * 0.02f; 
        }
        if (GetAsyncKeyState('S') & 0x8000f)
        {
            x -= D3DX_PI * 0.02f; 
        }
		D3DXMatrixRotationX(&xRot, x);

		static float y = 0.0f;
        
        if (GetAsyncKeyState('A') & 0x8000f)
        {
            y += D3DX_PI * 0.02f; 
        }

        if (GetAsyncKeyState('D') & 0x8000f)
        {
            y -= D3DX_PI * 0.02f; 
        }
        if (!step)
        y -= D3DX_PI * 0.6f * timeDelta; 

		D3DXMATRIX yRot;
		D3DXMatrixRotationY(&yRot, y);

		if( y >= 6.28f )
			y = 0.0f;
        if (x >= 6.28f)
            x = 0.0f; 

		D3DXMATRIX World = xRot * yRot;

		Device->SetTransform(D3DTS_WORLD, &World);


			Device->SetTexture(0, Textures[0] );
			maze_mesh->DrawSubset(0);
			Device->SetTexture(0, Textures[1] );
			maze_mesh->DrawSubset(1);
			Device->SetTexture(0, Textures[2] );
			maze_mesh->DrawSubset(2);
			Device->SetTexture(0, Textures[3] );
			maze_mesh->DrawSubset(3);

        D3DVIEWPORT9 vp2 = {0, 0, ScreenWidth, ScreenHeight, 0, 1}; 
        Device->SetViewport(&vp2); 


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

        if (pBorder)
            pBorder->Release(); 
        pNextButton->Release(); 
        pExitButton->Release(); 
        pSelectLoadFromFile->Release(); 
		pTrangleSign->Release(); 
        pSplitLine->Release(); 
		pFont->Release(); 

	}
	return true;
}


/////////////////////////////////////////
// 从文件读取迷宫并保存到BufferMatrix

bool LoadFromFile(TCHAR *filename) 
{
	char k;
    int i, j;  
	FILE *fin = _tfopen(filename, TEXT("r")); 
	if (!fin)
	{
		return false; 
	}

	if (fscanf(fin, "%d %d", &maze_width, &maze_height) != 2)
        return false;
    else
    {
		RtlZeroMemory(matrix, sizeof(matrix));  // 对2维数组清0
		// 输入迷宫
		for (i=0; i<maze_height; i++)
		{
			for (j=0; j<maze_width; j++)
			{
				fscanf(fin, " %c", &k); 
				matrix[i][j] = k;  
			}
		} 
	}

	fclose(fin); 
	return true; 
}

⌨️ 快捷键说明

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