📄 scene2.cpp
字号:
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 + -