📄 main.cpp
字号:
g_pD3DDevice->SetRenderState( D3DRS_FOGEND,*(DWORD*)&end);
g_pD3DDevice->SetRenderState( D3DRS_FOGTABLEMODE,D3DFOG_LINEAR);
//strcpy(g_PrintText,"linear fog");
break;
case 1:
g_pD3DDevice->SetRenderState( D3DRS_FOGDENSITY,*(DWORD*)&density);
g_pD3DDevice->SetRenderState( D3DRS_FOGTABLEMODE,D3DFOG_EXP);
// strcpy(g_PrintText,"exp fog");
break;
case 2:
g_pD3DDevice->SetRenderState( D3DRS_FOGDENSITY,*(DWORD*)&density);
g_pD3DDevice->SetRenderState( D3DRS_FOGTABLEMODE,D3DFOG_EXP2);
// strcpy(g_PrintText,"exp2 fog");
break;
}*/
}
//***************************************************
//
//***************************************************
LRESULT SetMatrix()
{
D3DXMATRIX matWorld,matView,matProj;
//D3DXMatrixRotationY(&matWorld,timeGetTime()/400.0f);//绕Y轴旋转的世界变换矩阵
/*
D3DXMatrixLookAtLH(&matView,//视图变换矩阵
//&(g_Control.LookAt [0]),
&D3DXVECTOR3(100*sin(timeGetTime()/1000.0f),30,100*cos(timeGetTime()/1000.0f)),//摄像机位置
&D3DXVECTOR3(0,30,0), //焦点位置
&D3DXVECTOR3(0,5,0)); //向上方向
*/
D3DXMatrixLookAtLH(&matView,&(g_Control.LookAt [0]),//摄影机的位置
&(g_Control.LookAt [1]),//摄影机朝向的位置
&(g_Control.LookAt [2]));//摄影机的正方向
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,5000.0f);
//PI/4的视角,4/3的长宽比,近平面1.0,远屏幕1000;
g_pD3DDevice->SetTransform(D3DTS_WORLD,&matWorld);
g_pD3DDevice->SetTransform(D3DTS_VIEW,&matView);//视图变换
g_pD3DDevice->SetTransform(D3DTS_PROJECTION,&matProj);//投影转换
return D3D_OK;
}
//-----------------------------------------------------------------------------
// 名称: ProcInput()
// 功能: 处理外部控制设备的输入
//-----------------------------------------------------------------------------
void ProcInput()
{
if(KEYDOWN(VK_DOWN))
{
g_Control.LookAt[0].x =(g_Control.LookAt[0].x-sinf(g_Angle)*10);
g_Control.LookAt[0].z =(g_Control.LookAt[0].z-cosf(g_Angle)*10);
g_Control.LookAt[1].x = (g_Control.LookAt[1].x-sinf(g_Angle)*10);
g_Control.LookAt[1].z = (g_Control.LookAt[1].z-cosf(g_Angle)*10);
// g_lightPosition.x = g_lightPosition.x - sinf(g_Angle)/20;
// g_lightPosition.z = g_lightPosition.z-cosf(g_Angle)/20;
};
if(KEYDOWN(VK_UP))
{
g_Control.LookAt[0].x = (g_Control.LookAt[0].x+sinf(g_Angle)*20);
g_Control.LookAt[0].z = (g_Control.LookAt[0].z+cosf(g_Angle)*20);
g_Control.LookAt[1].x = (g_Control.LookAt[1].x+sinf(g_Angle)*20);
g_Control.LookAt[1].z = (g_Control.LookAt[1].z+cosf(g_Angle)*20);
/*
g_lightPosition.x = g_lightPosition.x+sinf(g_Angle)/20;
g_lightPosition.z = g_lightPosition.z+cosf(g_Angle)/20;
*/
};
if(KEYDOWN(VK_RIGHT))
{
g_Angle+=0.1f;
g_Control.LookAt[1].x = g_Control.LookAt[0].x+sinf(g_Angle);
g_Control.LookAt[1].z = g_Control.LookAt[0].z+cosf(g_Angle);
};
if(KEYDOWN(VK_LEFT))
{
g_Angle-=0.1f;
g_Control.LookAt[1].x = g_Control.LookAt[0].x+sinf(g_Angle);
g_Control.LookAt[1].z = g_Control.LookAt[0].z+cosf(g_Angle);
};
/*
if(KEYDOWN(VK_1))
{
g_TextureFilter = TRUE; // 按键1表示使用纹理过滤
}
else if(KEYDOWN(VK_2))
{
g_TextureFilter = FALSE; // 按键2表示不使用纹理过滤
}
*/
return;
};
//**************************************************************
//渲染
//**************************************************************
void Render()
{
if(g_pD3DDevice==NULL)
{
return;
}
//图形绘制前,需要清空图形绘制区域,用某色进行对缓冲区清屏
g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
g_pD3DDevice->BeginScene();//通知D3D设备开始图形渲染工作,开始绘制
SetMatrix();
g_pMesh->Render();
g_pMeshGirl->Render(g_Control.LookAt[1].x,g_Angle,g_Control.LookAt[1].z);
char strInf[240];
sprintf(strInf," \r\n USING KEYBOARDS CONTROL MOVING....");
RECT rect={0,0,640,250};
g_pFont->DrawText(NULL,strInf,strlen(strInf),&rect,DT_CENTER,0xff000000);
En_Snow_Draw( g_pD3DDevice, &g_Snow ); // 渲染雨效果
g_pD3DDevice->EndScene();//结束绘制,与BeginScene()成对出现,绘制工作在这两函数间进行
g_pD3DDevice->Present(NULL,NULL,NULL,NULL);//屏幕翻转,将图形渲染的结果从后台缓冲区复制到前台缓冲区
}
//游戏循环
void GameLoop()
{
MSG msg;
BOOL fMessage;
PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);
while(msg.message != WM_QUIT)
{
fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);
if(fMessage)
{
//翻译消息,并发送消息
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Render();
ProcInput();
}
}
}
void CleanUp()
{
SafeRelease(g_pD3DDevice);//释放d3d设备指针
SafeRelease(g_pD3D);//释放d3d对象
}
LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)//Windows消息处理函数
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN:
break;
case WM_RBUTTONDOWN:
break;
case WM_KEYUP:
switch(wParam)
{
case VK_ESCAPE:
DestroyWindow(hWnd);
return 0;
break;
}
}
return DefWindowProc(hWnd,msg,wParam,lParam);
};
////////////////////////////////////
//主函数
////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,WinProc,0L,0L,
GetModuleHandle(NULL),NULL,NULL,NULL,NULL,
"YakeyClass",NULL};
//使用WNDCLASSEX结构创建一个结构体变量wc,sizeof(WNDCLASSEX)表示类结构的大小,
//CS_CLASSDC是一种类风格,表示Windows的设备关联,可由该类所有窗口共享。
//WinProc是指向窗口过程函数的指针,Windows消息函数
//"DXBase"是自定义的Windows类的名称
RegisterClassEx(&wc);
//将变量wc到注册windows系统
//LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HWND hWnd=CreateWindow("YakeyClass","我是窗口",
WS_OVERLAPPEDWINDOW,50,50,500,500,
GetDesktopWindow(),NULL,wc.hInstance,NULL);
//hWnd
//WinClass是类名,我是窗口是窗口名
//WS_OVERLAPPEDWINDOW是一种windows窗口风格
//50,50是窗口位置坐标,代表x,y方向
//500,500是窗口宽度和高度
//创建窗口
if(SUCCEEDED(InitialiseD3D(hWnd)))
{
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd);
}
GameLoop();
CleanUp();//释放d3d资源
UnregisterClass("YakeyClass",wc.hInstance);//注销wndclass类
return 0;
};
///////////////////////////////////////////////////////////////////////
// 定义字体类
///////////////////////////////////////////////////////////////////////
class CFont
{
public:
void DrawText(LPSTR pText, int x, int y, D3DCOLOR rgbFontColour);
CFont(LPDIRECT3DDEVICE9 pD3DDevice, LPSTR pFontFace, int nHeight, bool fBold, bool fItalic, bool fUnderlined);
virtual ~CFont();
private:
LPDIRECT3DDEVICE9 m_pD3DDevice;
LPD3DXFONT m_pFont;
};
//////////////////////////////////////////////////////////////////////
// 实现字体类
//////////////////////////////////////////////////////////////////////
CFont::CFont(LPDIRECT3DDEVICE9 pD3DDevice, LPSTR pFontFace, int nHeight, bool fBold, bool fItalic, bool fUnderlined)
{
m_pD3DDevice = pD3DDevice;
int nWeight = FW_NORMAL;
DWORD dwItalic = 0;
DWORD dwUnderlined = 0;
if(fBold)
{
nWeight = FW_BOLD;
}
if(fItalic)
{
dwItalic = 1;
}
if(fUnderlined)
{
dwUnderlined = 1;
}
//LPD3DXFONT pFont;
RECT rect={0,0,200,200};
D3DXCreateFont( m_pD3DDevice, 15, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
"Arial", &m_pFont );
/*
HFONT hFont;
hFont = CreateFont(nHeight, 0, 0, 0, nWeight, dwItalic, dwUnderlined, 0, ANSI_CHARSET, 0, 0, 0, 0, pFontFace);
D3DXCreateFont(m_pD3DDevice, hFont, &m_pFont);
*/
}
CFont::~CFont()
{
SafeRelease(m_pFont);
}
void CFont::DrawText(LPSTR pText, int x, int y, D3DCOLOR rgbFontColour)
{
RECT Rect;
Rect.left = x;
Rect.top = y;
Rect.right = 0;
Rect.bottom = 0;
m_pFont->DrawText(NULL,pText,strlen(pText) , &Rect, DT_CALCRECT, 0); //计算文字占用的矩形大小
m_pFont->DrawText(NULL,pText, strlen(pText), &Rect, DT_LEFT, rgbFontColour);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -