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

📄 main.cpp

📁 自己做的一个3D场景
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			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 + -