www.pudn.com > 3DRPG.rar > Game.cpp


// Game.cpp : 定义应用程序的入口点。 
//在class Game的private中声明静态模型和动态模型 
 
#include "stdafx.h" 
#include "Game.h" 
 
#include  
#include  
#include  
#include "Font.h" 
#include  
#include "Mesh.h" 
#include "Panel.h" 
#include "Input.h" 
//#include "Terrain.h" 
#include "npc.h" 
#include "Sky.h" 
#include "Snow.h" 
#include "Water.h" 
#include "SkinMesh.h" 
#include "Open.h" 
//#include "Sound.h" 
//#include "Music.h" 
#define MAX_LOADSTRING 100 
// 全局变量: 
HINSTANCE hInst;								// 当前实例 
TCHAR szTitle[MAX_LOADSTRING];					// 标题栏文本 
TCHAR szWindowClass[MAX_LOADSTRING];			// 主窗口类名 
#define SafeRelease(pObject) if(pObject!=NULL){pObject->Release();pObject=NULL;} 
#define SafeDelete(object) if(object!=NULL){delete object;object=NULL;} 
#define MESH_D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1) 
 
// 此代码模块中包含的函数的前向声明: 
ATOM				MyRegisterClass(HINSTANCE hInstance); 
BOOL				InitInstance(HINSTANCE, int); 
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM); 
LRESULT CALLBACK	About(HWND, UINT, WPARAM, LPARAM); 
 
 
 
 
class CGame 
{ 
public: 
	CGame(HINSTANCE hinst,HWND hwnd); 
	virtual ~CGame(); 
	void GameLoop(); 
	void Render(); 
    POSITION ViewPos; 
	POSITION PreViewPos; 
	 
    COLLIPE * object; 
	NPOSITION BossPos; 
	int flash; 
	void InitialTools(); 
	HRESULT InitialD3D(HWND hWnd); 
	HRESULT InitialLight(); 
    CInput * m_pInput; 
     
    CTerrain * m_pTerrain; 
    bool  ViewFlag;//镜头碰到地面的判断 
	 
	D3DXVECTOR3 vecUp,sub;;//sub为视点位置与摄像机位置的矢量差,vecUp为sub相对变化矢量 
	float fUp; 
  
	bool shoot;//判断鼠标左键是否点下,按下为true 
    CPanel * m_pPanel; 
 
	bool nomoney; 
private: 
	D3DLIGHT9 d3dLight; 
    int iBianhao; 
	POSITION SetNpcPosition(float x,float z); 
	void SetCamera2D(); 
	void Render2D(); 
	void SetCamera3D(); 
	void Render3D(); 
	void RenderText(); 
	void SetFog(); 
	void SetWaterFog(); 
	void GetMouse(); 
	void GetMouse1(); 
	LPDIRECT3D9  m_pD3D; 
	LPDIRECT3DDEVICE9 m_pD3DDevice; 
	DWORD m_dwFrame; 
	DWORD m_dwStartTime; 
	CFont * m_pFont; 
    CFont * m_pWrong;//当角色想攻击npc,但背朝对方时使用 
	CWater * m_pWater; 
	//CSnow * m_pSnow; 
	 
	CSky * m_pSky; 
	int m_nScreenWidth; 
	int m_nScreenHeight; 
	HWND hWnd; 
	HINSTANCE hInst; 
	 
	POINT m_Point; 
	D3DXVECTOR3 m_Proj; 
	RECT m_Rect; 
	 
	BOOL present; 
	D3DXVECTOR3 DirWorld,OriginWorld; 
    D3DXMATRIX matProj; 
    void ScreenTo3D(int mx,int my,D3DXVECTOR3 * p1,D3DXVECTOR3 * p2); 
    float cy;//镜头的高度 
     
	void AI();//npc的人工智能,包括行走和动作 
    void RoleAction();//主角的动作 
	bool Collipe(COLLIPE col);//npc、主角和场景的碰撞检测 
	 
	 
    CSound * m_pMusic; 
	CSound * m_pSound; 
     /////////////// 
    //声明模型的地方,声明过后请到InitialTools()中初始化模型,静态和动态的初始化有区别 
	////////////// 
	//静态模型用CNpc类,动态模型用CSkinMesh类 
	CNpc * m_pTree_1_1; 
	CNpc * m_pTree_1_2; 
	CNpc * m_pTree_1_3; 
	CNpc * m_pTree_1_4; 
	CNpc * m_pTree_1_5; 
	CNpc * m_pTree_1_6; 
	CNpc * m_pTree_1_7; 
	CNpc * m_pTree_1_8; 
	CNpc * m_pTree_1_9; 
	CNpc * m_pTree_1_10; 
	CNpc * m_pTree_1_11; 
	CNpc * m_pTree_1_12; 
    CNpc * m_pTree_1_13; 
	CNpc * m_pTree_1_14; 
	CNpc * m_pTree_1_15; 
	CNpc * m_pTree_1_16; 
	CNpc * m_pTree_1_17; 
	CNpc * m_pTree_1_18; 
	CNpc * m_pTree_1_19; 
	CNpc * m_pTree_1_20; 
	CNpc * m_pTree_1_21; 
	CNpc * m_pTree_u_1; 
	CNpc * m_pTree_u_2; 
	CNpc * m_pTree_u_3; 
	CNpc * m_pTree_u_4; 
	CNpc * m_pTree_u_5; 
	CNpc * m_pDead_cow_1; 
	CNpc * m_pRock_1_1; 
	CNpc * m_pRock_1_2; 
	CNpc * m_pRock_1_3; 
	CNpc * m_pRock_1_4; 
	CNpc * m_pRock_1_5; 
	CNpc * m_pRock_1_6; 
	CNpc * m_pRock_2_1; 
	CNpc * m_pRock_2_2; 
	CNpc * m_pRock_2_3; 
	CNpc * m_pRock_2_4; 
	CNpc * m_pRock_2_5; 
	CNpc * m_pRock_2_6; 
	CNpc * m_pRock_3_1; 
	CNpc * m_pRock_4_1; 
    CNpc * m_pTree_2_1; 
    CNpc * m_pTree_2_2; 
	CNpc * m_pBridge; 
	CNpc * m_pHole; 
    CMesh * m_pBoss; 
    CMesh * m_pMesh; 
 
 
    CSkinMesh * m_pSkinMesh; 
	 
	CSkinMesh * m_pSBoss; 
	 
 
}; 
 
CGame::CGame(HINSTANCE hinst,HWND hwnd) 
{   hWnd=hwnd; 
    hInst=hinst; 
	m_pD3D=NULL; 
	m_pD3DDevice=NULL; 
	m_pFont=NULL; 
	m_dwFrame=0; 
	m_dwStartTime=timeGetTime(); 
 
	flash=0; 
	ViewPos.x=3037.0f;//500 
	ViewPos.y=0.0f; 
	ViewPos.z=3205.0f;//500 
	ViewPos.a=180.0f; 
	ViewPos.b=0.0f; 
	ViewPos.ca=0.0f; 
	ViewPos.cb=45.0f; 
	ViewPos.cc=200.0f; 
	PreViewPos=ViewPos; 
	 
    BossPos.x=2417; 
	BossPos.y=254; 
	BossPos.z=1185; 
	BossPos.a=0; 
	fUp=0.0f; 
	shoot=false; 
    nomoney=false; 
} 
 
POSITION CGame::SetNpcPosition(float x,float z) 
{ 
	POSITION MonsterPos; 
	MonsterPos.x=x;MonsterPos.z=z; 
	MonsterPos.y=m_pTerrain->GetHeight(x,z); 
	return MonsterPos; 
} 
 
void CGame::InitialTools() 
{    
       HFONT hNewFont = CreateFont(50, 0, 0, 0, 0, 0, 0, 0,  
							ANSI_CHARSET, 0, 0, 0, 0, "shit"); 
        bool  hihi=false; 
		HFONT hOldFont; 
 
		HDC		hwndDC; 
		HDC		dcMem; 
		 
		HBITMAP bmpMem; 
		HBITMAP bmpMem_2; 
		HBITMAP bmpMem_3; 
		LOGBRUSH logB={BS_SOLID|DIB_RGB_COLORS,RGB(100,60,160),HS_VERTICAL}; 
		HBRUSH	hbr=CreateBrushIndirect(&logB); 
		//LPCTSTR pStr="载入中..."; 
		//LPCRSTR pEnd="请按鼠标左键进入游戏"; 
        int length=50; 
		 
		 
		hwndDC=GetDC(hWnd); 
		hOldFont=(HFONT)SelectObject(hwndDC,hNewFont); 
 
		RECT rect,FrameRect,DrawRect; 
		GetClientRect(hWnd,&rect);  
		FrameRect.left=220;FrameRect.top=450;FrameRect.right=620;FrameRect.bottom=470; 
		DrawRect.left=220;DrawRect.top=450;DrawRect.right=220;DrawRect.bottom=470; 
		dcMem=CreateCompatibleDC(hwndDC); 
	 
		bmpMem=(HBITMAP)LoadImage(NULL,"./res/loading.bmp",IMAGE_BITMAP,rect.right ,rect.bottom,LR_LOADFROMFILE); 
        bmpMem_2=(HBITMAP)LoadImage(NULL,"./res/loading_1.bmp",IMAGE_BITMAP,311 ,36,LR_LOADFROMFILE); 
        bmpMem_3=(HBITMAP)LoadImage(NULL,"./res/loading_2.bmp",IMAGE_BITMAP,311 ,36,LR_LOADFROMFILE); 
        
		 
		SelectObject(dcMem,bmpMem); 
		BitBlt(hwndDC,0,0,rect.right,rect.bottom,dcMem,0,0,SRCCOPY);   
		SetBkMode(hwndDC,TRANSPARENT);  
	    Rectangle(hwndDC,	FrameRect.left ,FrameRect.top,FrameRect.right,FrameRect.bottom);  
		 
			 
		SelectObject(dcMem,bmpMem_2); 
		BitBlt(hwndDC,250,500,311,36,dcMem,0,0,SRCCOPY);   
		SetBkMode(hwndDC,TRANSPARENT);  
        //TextOut(hwndDC,250,	450,"载入中",	6); 
         
	m_pFont=new CFont(m_pD3DDevice,"vadana"); 
    m_pWrong=new CFont(m_pD3DDevice,"vadana"); 
	 
	 
    m_pMesh=new CMesh(m_pD3DDevice,"./mod/kuangjia.X"); 
	m_pSkinMesh=new CSkinMesh(m_pD3DDevice); 
	m_pSkinMesh->LoadFromXFile("./mod/role.X"); 
	 
	 
	DrawRect.right+=length; 
	FillRect(hwndDC,&DrawRect,hbr); 
	 
 
	m_pPanel=new CPanel(m_pD3DDevice,900,64,m_nScreenWidth,m_nScreenHeight); 
    DrawRect.right+=length; 
	FillRect(hwndDC,&DrawRect,hbr); 
 
 
	m_pTerrain=new CTerrain(hInst,m_pD3DDevice); 
	m_pWater=new CWater(hInst,m_pD3DDevice,m_pTerrain->m_dwRow,m_pTerrain->m_dwCol); 
    DrawRect.right+=length; 
	FillRect(hwndDC,&DrawRect,hbr); 
     
	 
	ViewPos.y=m_pTerrain->GetHeight(ViewPos.x,ViewPos.z); 
    DrawRect.right+=length; 
	FillRect(hwndDC,&DrawRect,hbr); 
    
     
    object=new COLLIPE[44]; 
    DrawRect.right+=length; 
	FillRect(hwndDC,&DrawRect,hbr); 
    
	COLLIPE col0={1662,254,3729,50,}; 
    COLLIPE col1={2009,253,3679,50,}; 
    COLLIPE col2={2294,253,3693,50,}; 
    COLLIPE col3={2605,253,3671,50,}; 
    COLLIPE col4={3292,253,2558,50,}; 
    COLLIPE col5={3619,253,2353,50,}; 
    COLLIPE col6={3609,253,2254,50,}; 
    COLLIPE col7={3686,253,1992,50,}; 
    COLLIPE col8={3699,253,1873,50,}; 
    COLLIPE col9={3660,253,1653,50,}; 
    COLLIPE col10={141,253,3216,50,}; 
    COLLIPE col11={155,253,2950,50,}; 
    COLLIPE col12={2568,253,2574,50,}; 
    COLLIPE col13={1851,253,3599,50,}; 
    COLLIPE col14={2184,253,3570,50,}; 
    COLLIPE col15={3637,253,2109,50,}; 
    COLLIPE col16={3448,253,2465,50,}; 
    COLLIPE col17={2083,303,2568,50,}; 
    COLLIPE col18={2458,253,3598,50,}; 
    COLLIPE col19={2180,303,2567,50,}; 
    COLLIPE col20={2773,310,2569,50,}; 
    COLLIPE col21={3135,255,2665,50,}; 
    COLLIPE col22={2293,315,2573,50,}; 
    COLLIPE col23={2409,315,2566,50,}; 
    COLLIPE col24={2539,268,3503,50,}; 
    COLLIPE col25={2330,293,3586,50,}; 
    COLLIPE col26={2975,220,345,50,}; 
    COLLIPE col27={2885,295,2566,50,}; 
    COLLIPE col28={3010,315,2575,50,}; 
    COLLIPE col29={3185,305,2581,50,}; 
    COLLIPE col30={3056,295,2474,50,}; 
    COLLIPE col31={3010,295,2635,50,}; 
    COLLIPE col32={3185,305,2521,50,}; 
    COLLIPE col33={2925,295,2560,50,}; 
    COLLIPE col34={2955,295,2570,50,}; 
    COLLIPE col35={3060,315,2570,50,}; 
    COLLIPE col36={2925,295,2610,50,}; 
    COLLIPE col37={2955,295,2620,50,}; 
    COLLIPE col38={3060,305,2620,50,}; 
    COLLIPE col39={420,200,3340,50,}; 
    COLLIPE col40={163,300,2711,150,}; 
    COLLIPE col41={1166,250,814,400,}; 
    COLLIPE col42={3357,200,409,100,}; 
    COLLIPE col43={3638,254,3252,250,}; 
 
	object[0]=col0; 
    object[1]=col1; 
	object[2]=col2; 
	object[3]=col3; 
	object[4]=col4; 
	object[5]=col5; 
	object[6]=col6; 
	object[7]=col7; 
	object[8]=col8; 
	object[9]=col9; 
	object[10]=col10; 
	object[11]=col11; 
	object[12]=col12; 
	object[13]=col13; 
	object[14]=col14; 
	object[15]=col15; 
	object[16]=col16; 
	object[17]=col17; 
	object[18]=col18; 
	object[19]=col19; 
	object[20]=col20; 
	object[21]=col21; 
	object[22]=col22; 
	object[23]=col23; 
	object[24]=col24; 
	object[25]=col25; 
	object[26]=col26; 
	object[27]=col27; 
	object[28]=col28; 
	object[29]=col29; 
	object[30]=col30; 
	object[31]=col31; 
	object[32]=col32; 
	object[33]=col33; 
	object[34]=col34; 
	object[35]=col35; 
	object[36]=col36; 
	object[37]=col37; 
	object[38]=col38; 
	object[39]=col39; 
	object[40]=col40; 
	object[41]=col41; 
	object[42]=col42; 
	object[43]=col43; 
	 
    DrawRect.right+=length; 
	FillRect(hwndDC,&DrawRect,hbr); 
     
   /* 
    m_pTree_1_1->Translation(1662,254,3729,0,5);//0 
    m_pTree_1_2->Translation(2009,253,3679,180,4.3);//1 
    m_pTree_1_3->Translation(2294,253,3693,90,4);//2 
	m_pTree_1_4->Translation(2605,253,3671,45,8);//3 
	m_pTree_1_5->Translation(3292,253,2558,0,6);//4 
	m_pTree_1_6->Translation(3619,253,2353,180,6);//5 
	m_pTree_1_7->Translation(3609,253,2254,90,5);//6 
	m_pTree_1_8->Translation(3686,253,1992,45,4);//7 
	m_pTree_1_9->Translation(3699,253,1873,270,5);//8 
	m_pTree_1_10->Translation(3660,253,1653,0,6);//9 
	m_pTree_1_11->Translation(141,253,3216,90,6);//10 
	m_pTree_1_12->Translation(155,253,2950,90,3);//11 
	m_pTree_1_13->Translation(2568,253,2574,270,6);//12 
	m_pTree_1_14->Translation(1851,253,3599,270,5);//13 
	m_pTree_1_15->Translation(2184,253,3570,270,3);//14 
	m_pTree_1_16->Translation(3637,253,2109,90,4);//15 
	m_pTree_1_17->Translation(3448,253,2465,180,6);//16 
	m_pTree_1_18->Translation(2083,303,2568,90,3);//17 
	m_pTree_1_19->Translation(2458,253,3598,180,3);//18 
	m_pTree_1_20->Translation(2180,303,2567,270,3);//19 
	m_pTree_1_21->Translation(2773,310,2569,0,3);//20   
    m_pTree_u_1->Translation(3135,255,2665,0,2);//21 
	m_pTree_u_2->Translation(2293,315,2573,90,2.5);//22   
	m_pTree_u_3->Translation(2409,315,2566,270,1.8);//23 
	m_pTree_u_4->Translation(2539,268,3503,0,1);//24 
	m_pTree_u_5->Translation(2330,293,3586,270,1.8);//25 
	m_pDead_cow_1->Translation(2975,220,345,180,3);//26 
	m_pRock_1_1->Translation(2885,295,2566,0,3);//27 
	m_pRock_1_2->Translation(3010,315,2575,180,3);//28 
	m_pRock_1_3->Translation(3185,305,2581,270,3);//29 
    m_pRock_1_6->Translation(3056,295,2474,90,3);//30 
	m_pRock_1_5->Translation(3010,295,2635,0,3);//31 
	m_pRock_1_4->Translation(3185,305,2521,180,3);//32 
	m_pRock_2_1->Translation(2925,295,2560,0,3);//33 
	m_pRock_2_2->Translation(2955,295,2570,180,3);//34 
	m_pRock_2_3->Translation(3060,315,2570,90,3);//35 
	m_pRock_2_6->Translation(2925,295,2610,270,3);//36 
	m_pRock_2_5->Translation(2955,295,2620,0,3);//37 
	m_pRock_2_4->Translation(3060,305,2620,180,3);//38 
	m_pRock_3_1->Translation(420,200,3340,180,3);//39 
	m_pRock_4_1->Translation(163,300,2711,0,3);//40 
	m_pTree_2_1->Translation(1166,250,814,0,12);//41 
	m_pTree_2_1->Translation(3357,200,409,270,8);//42 
	m_pHole->Translation(3638,254,3252,180,5);//43 
	*/ 
    /////////////// 
	//初始化动静态模型的地方 
	/////////////// 
   //以下是静态模型,参数是3D设备和.X文件的路径 
	 
	//缺口1 
	m_pTree_1_1=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	m_pTree_1_2=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
    m_pTree_1_3=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	m_pTree_1_4=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	//缺口2 
	m_pTree_1_5=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	m_pTree_1_6=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	m_pTree_1_7=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	m_pTree_1_8=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	m_pTree_1_9=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	m_pTree_1_10=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	//边上 
	m_pTree_1_11=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	m_pTree_1_12=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	//突出 
	m_pTree_1_13=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	//树1补充 
	m_pTree_1_14=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	m_pTree_1_15=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	m_pTree_1_16=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	m_pTree_1_17=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	m_pTree_1_18=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	m_pTree_1_19=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	m_pTree_1_20=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	m_pTree_1_21=new CNpc(m_pD3DDevice,"./mod/tree_1.X"); 
	//树桩 
    m_pTree_u_1=new CNpc(m_pD3DDevice,"./mod/tree_under.X"); 
	m_pTree_u_2=new CNpc(m_pD3DDevice,"./mod/tree_under.X"); 
	m_pTree_u_3=new CNpc(m_pD3DDevice,"./mod/tree_under.X"); 
	m_pTree_u_4=new CNpc(m_pD3DDevice,"./mod/tree_under.X"); 
	m_pTree_u_5=new CNpc(m_pD3DDevice,"./mod/tree_under.X"); 
	//死牛 
	m_pDead_cow_1=new CNpc(m_pD3DDevice,"./mod/dead_cow.X"); 
	//岩石 
	m_pRock_1_1=new CNpc(m_pD3DDevice,"./mod/rock_1.X"); 
	m_pRock_1_2=new CNpc(m_pD3DDevice,"./mod/rock_1.X"); 
	m_pRock_1_3=new CNpc(m_pD3DDevice,"./mod/rock_1.X"); 
	m_pRock_1_4=new CNpc(m_pD3DDevice,"./mod/rock_1.X"); 
	m_pRock_1_5=new CNpc(m_pD3DDevice,"./mod/rock_1.X"); 
	m_pRock_1_6=new CNpc(m_pD3DDevice,"./mod/rock_1.X"); 
	m_pRock_2_1=new CNpc(m_pD3DDevice,"./mod/rock_2.X"); 
	m_pRock_2_2=new CNpc(m_pD3DDevice,"./mod/rock_2.X"); 
	m_pRock_2_3=new CNpc(m_pD3DDevice,"./mod/rock_2.X"); 
	m_pRock_2_4=new CNpc(m_pD3DDevice,"./mod/rock_2.X"); 
	m_pRock_2_5=new CNpc(m_pD3DDevice,"./mod/rock_2.X"); 
	m_pRock_2_6=new CNpc(m_pD3DDevice,"./mod/rock_2.X"); 
	m_pRock_3_1=new CNpc(m_pD3DDevice,"./mod/rock_3.X"); 
	m_pRock_4_1=new CNpc(m_pD3DDevice,"./mod/rock_4.X"); 
    
    //巨树 
	m_pTree_2_1=new CNpc (m_pD3DDevice,"./mod/tree_2.X"); 
	m_pTree_2_2=new CNpc (m_pD3DDevice,"./mod/tree_2.X"); 
	//洞 
	m_pHole=new CNpc(m_pD3DDevice,"./mod/rockdoor.X"); 
 
     //桥 
    m_pBridge=new CNpc(m_pD3DDevice,"./mod/bridge.X"); 
	m_pBoss=new CMesh(m_pD3DDevice,"./mod/kuangjia.X"); 
	 
	 
	 
	//以下是动态模型,初始化结束后请到Render3D()中确定模型的位置和渲染模型 
	 
	m_pSBoss=new CSkinMesh(m_pD3DDevice); 
	m_pSBoss->LoadFromXFile("./mod/boss.X"); 
    DrawRect.right+=length; 
	FillRect(hwndDC,&DrawRect,hbr); 
     
 
	m_pInput=new CInput(hInst,hWnd,m_pPanel->NIcon); 
    DrawRect.right+=length; 
	FillRect(hwndDC,&DrawRect,hbr); 
     
 
	m_pSky=new CSky(m_pD3DDevice); 
 
	m_pMusic=new CSound(hWnd); 
    m_pSound=new CSound(hWnd); 
	    DeleteObject(bmpMem_2); 
        SelectObject(dcMem,bmpMem_3); 
		BitBlt(hwndDC,250,500,311,36,dcMem,0,0,SRCCOPY);   
		SetBkMode(hwndDC,TRANSPARENT);  
   // TextOut(hwndDC,100,	50,"请按空格进入游戏",	16); 
	while(hihi==false) 
	{ 
		m_pInput->Update(); 
		m_pInput->GetOut(&hihi); 
		 
	} 
//	m_pSnow=new CSnow(m_pD3DDevice,10,10,10,25,1.0f); 
    SelectObject(hwndDC,hOldFont); 
		DeleteObject(hNewFont); 
		DeleteObject(bmpMem); 
		 
		DeleteObject(bmpMem_3); 
		DeleteObject(dcMem); 
		DeleteObject(hwndDC); 
 
		m_pMusic->Play(0,"./res/Midi_2.mid"); 
		 
} 
CGame::~CGame() 
{  // SafeDelete(m_pSnow); 
	SafeDelete(m_pSound); 
	SafeDelete(m_pMusic); 
   
	 
	SafeDelete(m_pSky); 
	SafeDelete(m_pTerrain); 
	SafeDelete(m_pInput); 
	SafeDelete(m_pPanel); 
	SafeDelete(m_pFont); 
    SafeDelete(m_pMesh); 
	SafeDelete(m_pSkinMesh); 
	SafeRelease(m_pD3DDevice); 
    SafeRelease(m_pD3D); 
	 
} 
void CGame::ScreenTo3D(int mx,int my,D3DXVECTOR3 * p1,D3DXVECTOR3 * p2) 
{ 
    float dy,dx; 
	float HalfGameWidth = m_Rect.right / 2.0f; 
	float HalfGameHeight = m_Rect.bottom / 2.0f; 
	float tang = tanf((float)(D3DX_PI/4.0f) * 0.5f); 
    D3DXMATRIX matView,matWorld; 
    m_pD3DDevice->GetTransform(D3DTS_VIEW,&matView); 
	m_pD3DDevice->GetTransform(D3DTS_WORLD,&matWorld); 
	dx = tang * (mx / HalfGameWidth - 1.0f) / (float)(1.25); 
	dy = tang * (1.0f - my / HalfGameHeight); 
 
	//calculate the beginning and end points of the ray 
	p1->x = dx * 1.0f;p1->y = dy * 1.0f;p1->z = 1.0f; 
	p2->x = dx * 10000.0f;p2->y = dy * 10000.0f;p2->z = 10000.0f; 
 
	//inverse them by the view matrix 
	D3DXMATRIX invMat; //the inverse of the view matrix 
	D3DXMatrixInverse(&invMat,NULL,&matView); //inverse the view mat 
 
	D3DXVec3TransformCoord(p2,p2,&invMat); 
	D3DXVec3TransformCoord(p1,p1,&invMat); 
 
	//inverse them by the world matrix 
	//D3DXMATRIX invwMat; //the inverse of the view matrix 
	//D3DXMatrixInverse(&invwMat,NULL,&matWorld); //inverse the view mat 
 
	//D3DXVec3TransformCoord(p2,p2,&invwMat); 
	//D3DXVec3TransformCoord(p1,p1,&invwMat); 
   // D3DXMatrixInverse(&invwMat,NULL,&m_pMesh->matWorld);  
	//D3DXVec3TransformCoord(p2,p2,&invwMat); 
	//D3DXVec3TransformCoord(p1,p1,&invwMat); 
	//D3DXVec3Normalize(p2,&(*p2 - *p1)); 
 
} 
 
void CGame::GetMouse() 
{   
  
 
	 
	 
		 
	if(shoot==true) 
	{ 
    BOOL hit; 
    FLOAT  distance; 
	hit=FALSE; 
	GetCursorPos(&m_Point); 
   // ScreenToClient(hWnd,&m_Point); 
    D3DXMATRIX  matInv; 
	D3DXVECTOR3 start,dir; 
 
	//ScreenTo3D(m_Point.x,m_Point.y,&start,&dir); 
	 
		 
        D3DVIEWPORT9 viewport; 
		D3DXMATRIX matProj,matView,matWorld; 
	    m_pD3DDevice->GetViewport(&viewport); 
        m_pD3DDevice->GetTransform(D3DTS_PROJECTION,&matProj); 
        m_pD3DDevice->GetTransform(D3DTS_VIEW,&matView); 
        m_pD3DDevice->GetTransform(D3DTS_WORLD,&matWorld); 
        D3DXVec3Unproject(&dir,&D3DXVECTOR3(m_Point.x,m_Point.y,1.0f),&viewport,&matProj,&matView,&matWorld); 
        D3DXMatrixInverse(&matInv,NULL,&matView); 
        start.x=matInv._41; 
        start.y=matInv._42; 
        start.z=matInv._43; 
 
         D3DXMatrixInverse(&matInv,NULL,&m_pMesh->matWorld);  
	     D3DXVec3TransformCoord(&dir,&dir,&matInv); 
	     D3DXVec3TransformCoord(&start,&start,&matInv); 
		 dir=dir-start; 
	    D3DXIntersect(m_pMesh->m_pMesh,&start,&dir,&hit,NULL,NULL,NULL,&distance,NULL,NULL); 
 
	//present=hit; 
	/*if(hit==TRUE) 
	{ 
		MessageBox(NULL,"Mouse over mesh","blah",NULL); 
 
	}*/ 
	} 
	 
 
	/*else 
	{ 
		present=FALSE; 
	}*/ 
} 
void CGame::GetMouse1() 
{ 
   
	if(shoot==true) 
	{ 
    BOOL hit; 
    FLOAT  distance; 
	hit=FALSE; 
	GetCursorPos(&m_Point); 
   // ScreenToClient(hWnd,&m_Point); 
    D3DXMATRIX  matInv; 
	D3DXVECTOR3 start,dir; 
 
	//ScreenTo3D(m_Point.x,m_Point.y,&start,&dir); 
	 
		 
        D3DVIEWPORT9 viewport; 
		D3DXMATRIX matProj,matView,matWorld; 
	    m_pD3DDevice->GetViewport(&viewport); 
        m_pD3DDevice->GetTransform(D3DTS_PROJECTION,&matProj); 
        m_pD3DDevice->GetTransform(D3DTS_VIEW,&matView); 
        m_pD3DDevice->GetTransform(D3DTS_WORLD,&matWorld); 
        D3DXVec3Unproject(&dir,&D3DXVECTOR3(m_Point.x,m_Point.y,1.0f),&viewport,&matProj,&matView,&matWorld); 
        D3DXMatrixInverse(&matInv,NULL,&matView); 
        start.x=matInv._41; 
        start.y=matInv._42; 
        start.z=matInv._43; 
 
         D3DXMatrixInverse(&matInv,NULL,&m_pBoss->matWorld);  
	     D3DXVec3TransformCoord(&dir,&dir,&matInv); 
	     D3DXVec3TransformCoord(&start,&start,&matInv); 
		 dir=dir-start; 
	    D3DXIntersect(m_pBoss->m_pMesh,&start,&dir,&hit,NULL,NULL,NULL,&distance,NULL,NULL); 
 
	present=hit; 
	if(hit==TRUE) 
	{ 
		m_pSound->PlaySound("./res/sound_1.wav"); 
 
	} 
	} 
} 
void CGame::SetFog() 
{   float start=400.0f; 
    float end=4500.0f; 
	m_pD3DDevice->SetRenderState(D3DRS_FOGENABLE,TRUE); 
	m_pD3DDevice->SetRenderState(D3DRS_FOGCOLOR,D3DCOLOR_XRGB(255,255,255)); 
	D3DCAPS9 stCaps; 
	m_pD3DDevice->GetDeviceCaps(&stCaps); 
	if(stCaps.RasterCaps&D3DPRASTERCAPS_FOGRANGE) 
	{ 
		m_pD3DDevice->SetRenderState(D3DRS_RANGEFOGENABLE,TRUE); 
	} 
	 
	m_pD3DDevice->SetRenderState(D3DRS_FOGSTART,*(DWORD*)&start); 
	m_pD3DDevice->SetRenderState(D3DRS_FOGEND,*(DWORD*)&end); 
	m_pD3DDevice->SetRenderState(D3DRS_FOGTABLEMODE,D3DFOG_LINEAR); 
} 
void CGame::SetWaterFog() 
{    
	m_pD3DDevice->SetRenderState(D3DRS_FOGENABLE,TRUE); 
	m_pD3DDevice->SetRenderState(D3DRS_FOGCOLOR,D3DCOLOR_XRGB(90,184,194)); 
	D3DCAPS9 stCaps; 
	m_pD3DDevice->GetDeviceCaps(&stCaps); 
	if(stCaps.RasterCaps&D3DPRASTERCAPS_FOGRANGE) 
	{ 
		m_pD3DDevice->SetRenderState(D3DRS_RANGEFOGENABLE,TRUE); 
	} 
	float density=0.002; 
	m_pD3DDevice->SetRenderState(D3DRS_FOGDENSITY,*(DWORD*)&density); 
	m_pD3DDevice->SetRenderState(D3DRS_FOGTABLEMODE,D3DFOG_EXP); 
} 
void CGame::RenderText() 
{   char buffer[200]; 
	DWORD dwDuration=(timeGetTime()-m_dwStartTime)/1000; 
	//DWORD fps; 
	//fps=(m_dwFrame/dwDuration); 
	if(dwDuration<1) 
	{ 
		sprintf(buffer,"Calculating..."); 
	} 
	else 
	{ 
		//sprintf(buffer,"Duration:%d second, Frame:%3d, FPS:%d",dwDuration,m_dwFrame,(m_dwFrame/dwDuration)); 
	         sprintf(buffer,"x:%f second, y:%f, z:%f, FPS:%d",ViewPos.x,ViewPos.y,ViewPos.z,(m_dwFrame/dwDuration)); 
	}     //sprintf(buffer,"x:%f second, y:%f, z:%f, FPS:%d",ViewPos.x,ViewPos.y,ViewPos.z,(m_dwFrame/dwDuration)); 
	m_pFont->DrawText(buffer,0.0f,0.0f); 
} 
void CGame::Render() 
{ 
     
	m_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,200),1.0F,0); 
	m_pD3DDevice->BeginScene(); 
	SetCamera3D(); 
	AI(); 
	Render3D(); 
    GetMouse(); 
	 GetMouse1(); 
    SetCamera2D(); 
  //  if(present==TRUE) 
	//{ 
     Render2D(); 
//	} 
     
	RenderText(); 
	 
	m_pD3DDevice->EndScene(); 
	m_pD3DDevice->Present(NULL,NULL,NULL,NULL); 
	m_dwFrame++; 
 
} 
void CGame::AI() 
{   
	static bool walk=true; 
	static bool follow=false; 
	static bool back=false; 
	static NPOSITION preBossPos=BossPos; 
	static DWORD time=timeGetTime()/1000.0f; 
	DWORD timeNow=timeGetTime()/1000.0F; 
 
	D3DXVECTOR3 BossPoint=D3DXVECTOR3(2417.0F,254.0F,1185.0F); 
    D3DXVECTOR3 BossPointNow=D3DXVECTOR3(BossPos.x,BossPos.y,BossPos.z); 
	D3DXVECTOR3 ViewPosNow=D3DXVECTOR3(ViewPos.x,ViewPos.y,ViewPos.z); 
    float distance=D3DXVec3Length(&(BossPointNow-ViewPosNow)); 
	float original=D3DXVec3Length(&(BossPoint-BossPointNow)); 
	if((follow==false)&(back==false)) 
	{ 
		walk=true; 
	} 
    if((distance<=300)&(walk==true)&(back==false)) 
	{ 
		follow=true; 
		walk=false; 
		back=false; 
	} 
	if((distance>=400)&(follow==true)) 
	{ 
		walk=false; 
		follow=false; 
		back=true; 
	} 
	if((original<=50)&(back==true)) 
	{ 
		walk=true; 
		follow=false; 
		back=false; 
	} 
 
 
 
 
	if(walk==true) 
	{ 
     m_pSBoss->SetAnimationName("walk"); 
	if(timeNow-time>=4) 
	{ 
	BossPos.a+=rand()%360; 
     while((BossPos.a>180)|(BossPos.a<=-180)) 
		{ 
              if(BossPos.a>180) 
				  BossPos.a-=360; 
			  if(BossPos.a<=-180) 
				  BossPos.a+=360; 
 
		}      
	time=timeNow; 
	} 
	BossPos.x+=0.5*cos(D3DX_PI/180*BossPos.a); 
	BossPos.z+=0.5*sin(D3DX_PI/180*BossPos.a); 
	BossPos.y=m_pTerrain->GetHeight(BossPos.x,BossPos.z); 
	BossPointNow=D3DXVECTOR3(BossPos.x,BossPos.y,BossPos.z); 
	float length=D3DXVec3Length(&(BossPointNow-BossPoint)); 
	if(length>=500) 
	{ 
		BossPos=preBossPos; 
	} 
	else 
	{ 
		preBossPos=BossPos; 
	} 
	} 
	  
 
 
	if(follow==true) 
	{ 
        if(distance<=40) 
		{ 
			 static int dongzuo=rand()%2; 
			 if(timeNow-time>=0.8f) 
			 { 
				 dongzuo=rand()%2; 
				 time=timeNow; 
			 } 
			 
			switch(dongzuo) 
			{ 
			case 0: 
                m_pSBoss->SetAnimationName("skill1"); 
				break; 
			case 1: 
                m_pSBoss->SetAnimationName("skill2"); 
				break; 
			} 
		} 
		else 
		{ 
        m_pSBoss->SetAnimationName("run"); 
		} 
 
        D3DXVECTOR3 Distance; 
		D3DXVECTOR3 Dir; 
		 
		D3DXVec3Normalize(&Dir,&D3DXVECTOR3(2*cos(D3DX_PI/180*BossPos.a),0,2*sin(D3DX_PI/180*BossPos.a))); 
		D3DXVec3Normalize(&Distance,&(D3DXVECTOR3(ViewPos.x,0,ViewPos.z)-D3DXVECTOR3(BossPos.x,0,BossPos.z))); 
		 
		static int preangle=0; 
		 float god=acosf(D3DXVec3Dot(&Dir,&Distance)); 
		  
		 int angle=(int)god/(D3DX_PI/180); 
		  
	   if(abs(preangle-angle)<=1) 
	   { 
          angle=preangle; 
	   } 
	   else 
	   { 
          preangle=angle; 
	   } 
	    
        BossPos.a+=angle; 
		 while((BossPos.a>180)|(BossPos.a<=-180)) 
		{ 
              if(BossPos.a>180) 
				  BossPos.a-=360; 
			  if(BossPos.a<=-180) 
				  BossPos.a+=360; 
 
		}      
		if(distance>=30) 
		{ 
		 
        BossPos.x+=1.5*cos(D3DX_PI/180*BossPos.a); 
	    BossPos.z+=1.5*sin(D3DX_PI/180*BossPos.a); 
	    BossPos.y=m_pTerrain->GetHeight(BossPos.x,BossPos.z); 
		} 
	} 
 
 
 
 
	if(back==true) 
	{ 
        m_pSBoss->SetAnimationName("run"); 
        D3DXVECTOR3 Distance; 
		D3DXVECTOR3 Dir; 
		 
		D3DXVec3Normalize(&Dir,&D3DXVECTOR3(2*cos(D3DX_PI/180*BossPos.a),0,2*sin(D3DX_PI/180*BossPos.a))); 
		D3DXVec3Normalize(&Distance,&(D3DXVECTOR3(BossPoint.x,0,BossPoint.z)-D3DXVECTOR3(BossPos.x,0,BossPos.z))); 
		 
		static int preangle1=0; 
		 float god=acosf(D3DXVec3Dot(&Dir,&Distance)); 
		  
		 int angle=(int)god/(D3DX_PI/180); 
		  
	   if(abs(preangle1-angle)<=1) 
	   { 
          angle=preangle1; 
	   } 
	   else 
	   { 
          preangle1=angle; 
	   } 
	    
        BossPos.a+=angle; 
		 while((BossPos.a>180)|(BossPos.a<=-180)) 
		{ 
              if(BossPos.a>180) 
				  BossPos.a-=360; 
			  if(BossPos.a<=-180) 
				  BossPos.a+=360; 
 
		}      
        BossPos.x+=2*cos(D3DX_PI/180*BossPos.a); 
	    BossPos.z+=2*sin(D3DX_PI/180*BossPos.a); 
	    BossPos.y=m_pTerrain->GetHeight(BossPos.x,BossPos.z); 
	} 
 
	 
} 
 
void CGame::RoleAction() 
{   static bool attack=false; 
	static int Preflash=0; 
    static int record=0; 
    static DWORD time=timeGetTime()/1000.0f; 
	DWORD timeNow=timeGetTime()/1000.0F; 
	static DWORD time_1=0.0f; 
	DWORD timeNow_1=timeGetTime()/1000.0f; 
    if(Preflash!=flash) 
	{ 
     m_pSkinMesh->SetAnimationName("idle");record=0; 
	if((PreViewPos.a!=ViewPos.a)|(PreViewPos.b!=ViewPos.b)) 
	{ 
            m_pSkinMesh->SetAnimationName("walk"); 
			record=1; 
	} 
	if((PreViewPos.x!=ViewPos.x)|(PreViewPos.z!=ViewPos.z)) 
	{ 
           m_pSkinMesh->SetAnimationName("run"); 
		   record=2; 
	} 
    D3DXVECTOR3 BossPointNow=D3DXVECTOR3(BossPos.x,BossPos.y,BossPos.z); 
	D3DXVECTOR3 ViewPosNow=D3DXVECTOR3(ViewPos.x,ViewPos.y,ViewPos.z); 
    float distance=D3DXVec3Length(&(BossPointNow-ViewPosNow)); 
      D3DXVECTOR3 Distance; 
	  D3DXVECTOR3 Dir; 
		 
	  D3DXVec3Normalize(&Dir,&D3DXVECTOR3(2*cos(D3DX_PI/180*ViewPos.a),0,2*sin(D3DX_PI/180*ViewPos.a))); 
	  D3DXVec3Normalize(&Distance,&(D3DXVECTOR3(BossPos.x,0,BossPos.z)-D3DXVECTOR3(ViewPos.x,0,ViewPos.z))); 
		 
	  static int preangle=0; 
	  float god=acosf(D3DXVec3Dot(&Dir,&Distance)); 
		  
	  int angle=(int)god/(D3DX_PI/180); 
		  
	   if(abs(preangle-angle)<=1) 
	   { 
          angle=preangle; 
	   } 
	   else 
	   { 
          preangle=angle; 
	   } 
        while((angle>180)|(angle<=-180)) 
		{ 
              if(angle>180) 
				  angle-=360; 
			  if(angle<=-180) 
				 angle+=360; 
 
		} 
        
	if((distance<=40)&(present==true))//人物和npc距离小于40,且鼠标右键被按下 
	{ 
        if((angle<=80)&(angle>=-80)) 
		{ 
          m_pSkinMesh->SetAnimationName("skill1"); 
           record=3; 
		    
		} 
		else 
		{ 
             time=timeNow;	  
		} 
	} 
       
	 
   
	Preflash=flash; 
	} 
	else 
	{ 
		switch(record) 
		{ 
		case 0: 
              m_pSkinMesh->SetAnimationName("idle"); 
			  break; 
		case 1: 
			  m_pSkinMesh->SetAnimationName("walk"); 
			  break; 
		case 2: 
			  m_pSkinMesh->SetAnimationName("run"); 
			  break; 
		case 3: 
			  m_pSkinMesh->SetAnimationName("skill1"); 
			  break; 
		} 
	} 
	if(present==true) 
	{ 
	if((timeNow-time)<=3) 
	{ 
             char buffer[200]; 
	         sprintf(buffer,"You must correct your direction"); 
	         m_pWrong->DrawText(buffer,250.0f,200.0f); 
	} 
	} 
	if(nomoney==true) 
	{ 
		time_1=timeNow_1; 
	} 
	if(timeNow_1-time_1<=3) 
	{ 
         char buffer[200]; 
	     sprintf(buffer,"It's a demo.So....."); 
	     m_pWrong->DrawText_1(buffer,250.0f,470.0f); 
	} 
      
} 
 
bool CGame::Collipe(COLLIPE col) 
{ 
    D3DXVECTOR3 RolePoint=D3DXVECTOR3(ViewPos.x,ViewPos.y,ViewPos.z); 
	D3DXVECTOR3 dest=D3DXVECTOR3(col.x,col.y,col.z); 
    float distance=D3DXVec3Length(&(dest-RolePoint)); 
	if(distance<=col.dis) 
	{ 
     return true; 
	} 
	else 
	{ 
     return false; 
	} 
} 
void CGame::Render3D() 
{  
	 
	 
    m_pTerrain->Translate(); 
	m_pTerrain->RenerTerrain(); 
    m_pSky->Translate(ViewPos); 
	m_pSky->RenderSky(); 
     
	m_pMesh->Translate(ViewPos); 
	m_pMesh->RenderMesh(); 
	m_pBoss->Translation(BossPos); 
	m_pBoss->RenderMesh(); 
    /////////////// 
	//渲染模型和模型定位的地方 
	//////////// 
	//静态模型的定位,参数分别是X,Y,Z,旋转角度,放大倍数 
	//静态模型渲染 
   
	//静态模型的定位,参数分别是X,Y,Z,旋转角度,放大倍数 
	m_pTree_1_1->Translation(1662,254,3729,0,5);//0 
	m_pTree_1_1->RenderNpc();//静态模型渲染 
    m_pTree_1_2->Translation(2009,253,3679,180,4.3);//1 
    m_pTree_1_2->RenderNpc(); 
    m_pTree_1_3->Translation(2294,253,3693,90,4);//2 
    m_pTree_1_3->RenderNpc(); 
	m_pTree_1_4->Translation(2605,253,3671,45,8);//3 
    m_pTree_1_4->RenderNpc(); 
	m_pTree_1_5->Translation(3292,253,2558,0,6);//4 
    m_pTree_1_5->RenderNpc(); 
	m_pTree_1_6->Translation(3619,253,2353,180,6);//5 
    m_pTree_1_6->RenderNpc(); 
	m_pTree_1_7->Translation(3609,253,2254,90,5);//6 
    m_pTree_1_7->RenderNpc(); 
	m_pTree_1_8->Translation(3686,253,1992,45,4);//7 
    m_pTree_1_8->RenderNpc(); 
	m_pTree_1_9->Translation(3699,253,1873,270,5);//8 
    m_pTree_1_9->RenderNpc(); 
	m_pTree_1_10->Translation(3660,253,1653,0,6);//9 
    m_pTree_1_10->RenderNpc(); 
	m_pTree_1_11->Translation(141,253,3216,90,6);//10 
    m_pTree_1_11->RenderNpc(); 
	m_pTree_1_12->Translation(155,253,2950,90,3);//11 
    m_pTree_1_12->RenderNpc(); 
	m_pTree_1_13->Translation(2568,253,2574,270,6);//12 
    m_pTree_1_13->RenderNpc(); 
	m_pTree_1_14->Translation(1851,253,3599,270,5);//13 
    m_pTree_1_14->RenderNpc(); 
	m_pTree_1_15->Translation(2184,253,3570,270,3);//14 
    m_pTree_1_15->RenderNpc(); 
	m_pTree_1_16->Translation(3637,253,2109,90,4);//15 
    m_pTree_1_16->RenderNpc(); 
	m_pTree_1_17->Translation(3448,253,2465,180,6);//16 
    m_pTree_1_17->RenderNpc(); 
	m_pTree_1_18->Translation(2083,303,2568,90,3);//17 
    m_pTree_1_18->RenderNpc(); 
	m_pTree_1_19->Translation(2458,253,3598,180,3);//18 
    m_pTree_1_19->RenderNpc(); 
	m_pTree_1_20->Translation(2180,303,2567,270,3);//19 
    m_pTree_1_20->RenderNpc(); 
	m_pTree_1_21->Translation(2773,310,2569,0,3);//20 
    m_pTree_1_21->RenderNpc(); 
    m_pTree_u_1->Translation(3135,255,2665,0,2);//21 
    m_pTree_u_1->RenderNpc(); 
	m_pTree_u_2->Translation(2293,315,2573,90,2.5);//22 
    m_pTree_u_2->RenderNpc(); 
	m_pTree_u_3->Translation(2409,315,2566,270,1.8);//23 
    m_pTree_u_3->RenderNpc(); 
	m_pTree_u_4->Translation(2539,268,3503,0,1);//24 
    m_pTree_u_4->RenderNpc(); 
	m_pTree_u_5->Translation(2330,293,3586,270,1.8);//25 
    m_pTree_u_5->RenderNpc(); 
	m_pDead_cow_1->Translation(2975,220,345,180,3);//26 
    m_pDead_cow_1->RenderNpc(); 
	m_pRock_1_1->Translation(2885,295,2566,0,3);//27 
    m_pRock_1_1->RenderNpc(); 
	m_pRock_1_2->Translation(3010,315,2575,180,3);//28 
    m_pRock_1_2->RenderNpc(); 
	m_pRock_1_3->Translation(3185,305,2581,270,3);//29 
    m_pRock_1_3->RenderNpc(); 
    m_pRock_1_6->Translation(3056,295,2474,90,3);//30 
    m_pRock_1_6->RenderNpc(); 
	m_pRock_1_5->Translation(3010,295,2635,0,3);//31 
    m_pRock_1_5->RenderNpc(); 
	m_pRock_1_4->Translation(3185,305,2521,180,3);//32 
    m_pRock_1_4->RenderNpc(); 
	m_pRock_2_1->Translation(2925,295,2560,0,3);//33 
    m_pRock_2_1->RenderNpc(); 
	m_pRock_2_2->Translation(2955,295,2570,180,3);//34 
    m_pRock_2_2->RenderNpc(); 
	m_pRock_2_3->Translation(3060,315,2570,90,3);//35 
    m_pRock_2_3->RenderNpc(); 
	m_pRock_2_6->Translation(2925,295,2610,270,3);//36 
    m_pRock_2_6->RenderNpc(); 
	m_pRock_2_5->Translation(2955,295,2620,0,3);//37 
    m_pRock_2_5->RenderNpc(); 
	m_pRock_2_4->Translation(3060,305,2620,180,3);//38 
    m_pRock_2_4->RenderNpc(); 
	m_pRock_3_1->Translation(420,200,3340,180,3);//39 
    m_pRock_3_1->RenderNpc(); 
	m_pRock_4_1->Translation(163,300,2711,0,3);//40 
    m_pRock_4_1->RenderNpc(); 
	m_pTree_2_1->Translation(1166,250,814,0,12);//41 
	m_pTree_2_1->RenderNpc(); 
	m_pTree_2_1->Translation(3357,200,409,270,8);//42 
	m_pTree_2_1->RenderNpc(); 
	m_pHole->Translation(3638,254,3252,180,5);//43 
	m_pHole->RenderNpc(); 
	 
	m_pBridge->Translation(780,-80,3000,100,3.5); 
	m_pBridge->RenderNpc(); 
	 
 
    static	float timeStart=timeGetTime()/1000.0f; 
	static	float timeNow=timeGetTime()/1000.0f; 
	float tFrameTime=timeNow; 
	timeNow=timeGetTime()/1000.0f; 
	tFrameTime=timeNow-tFrameTime; 
      
	/*switch (((long)floor(timeNow/2))%5) 
	{ 
	case 0: m_pSkinMesh->SetAnimationName("idle");break; 
	case 1: m_pSkinMesh->SetAnimationName("walk");break; 
	case 2: m_pSkinMesh->SetAnimationName("run");break; 
	case 3: m_pSkinMesh->SetAnimationName("skill1");break; 
	case 4: m_pSkinMesh->SetAnimationName("skill2");break; 
	 
	}*/ 
    
	RoleAction(); 
    
	//m_pSkinMesh->Translation(ViewPos); 
	/////////////////// 
	//动态模型定位和渲染 
	//////////////// 
	//第一个参数不用管,复制就行,D3DXVECTOR3中代表X,Y,Z坐标,旋转角度,放大倍数 
    
	m_pSkinMesh->Render(tFrameTime,D3DXVECTOR3(ViewPos.x,ViewPos.y,ViewPos.z),-D3DX_PI/180*(ViewPos.a+90.0f));//D3DXVECTOR3(ViewPos.x,ViewPos.y+65.0f,ViewPos.z),-D3DX_PI/180*(ViewPos.a),5.0f); 
    PreViewPos=ViewPos; 
   // m_pSBoss->SetAnimationName("walk"); 
	m_pSBoss->Render(tFrameTime,D3DXVECTOR3(BossPos.x,BossPos.y,BossPos.z),-D3DX_PI/180*(BossPos.a+90.0f),1); 
	m_pWater->Translate(); 
	m_pWater->RenerWater(cy); 
 
 
	//m_pSnow->MoveSnow(DirWorld,OriginWorld); 
   // m_pSnow->RenderSnow(); 
	 
} 
 
void CGame::Render2D() 
{  
	m_pPanel->Translate(-400,+300); 
	m_pPanel->RenderPanel(); 
	if(present==true) 
	{ 
		m_pPanel->Render(); 
	} 
} 
void CGame::SetCamera3D() 
{ 
	 
	D3DXMATRIX matView,matPers; 
	 
    D3DXVECTOR3 ViewVec=D3DXVECTOR3((ViewPos.x+ViewPos.cc*cos(D3DX_PI/180*ViewPos.cb)*cos(D3DX_PI/180*ViewPos.ca)), 
		                                 (ViewPos.y+ViewPos.cc*sin(D3DX_PI/180*ViewPos.cb)), 
										 (ViewPos.z+ViewPos.cc*cos(D3DX_PI/180*ViewPos.cb)*sin(D3DX_PI/180*ViewPos.ca))); 
    static D3DXVECTOR3 PreViewVec1=ViewVec; 
	if((ViewVec.x<10)|(ViewVec.z<10)|(ViewVec.x>128*30)|(ViewVec.z>128*30)) 
	{ 
		ViewVec=PreViewVec1; 
	} 
	else 
	{ 
		PreViewVec1=ViewVec; 
	} 
	D3DXVECTOR3 ViewVec1=D3DXVECTOR3(ViewPos.x,ViewPos.y+25.0f,ViewPos.z); 
	D3DXVECTOR3 PreViewVec=ViewVec; 
     
	float ViewMinHeight=m_pTerrain->GetHeight(ViewVec.x,ViewVec.z)+10.0f; 
	if(ViewVec.y<=ViewMinHeight) 
	{ 
		 
		ViewVec.y=ViewMinHeight; 
         
		ViewFlag=true;//可移动视点 
	} 
	else 
	{ 
		ViewFlag=false;//可移动摄像机 
	} 
	 
	if(ViewFlag==false) 
	{ 
		 
	D3DXMatrixLookAtLH(&matView,&ViewVec,&D3DXVECTOR3(ViewPos.x,ViewPos.y+25.0f,ViewPos.z),&D3DXVECTOR3(0.0F,1.0F,0.0F)); 
	} 
	else 
	{ 
        ViewVec.y=ViewMinHeight; 
		D3DXVECTOR3 axis,Nsub;D3DXMATRIX matRo; 
    D3DXVECTOR3 sub=ViewVec1-ViewVec; 
	 
      
	 
	D3DXVec3Normalize(&Nsub,&sub); 
    D3DXVec3Normalize(&vecUp,&vecUp); 
	D3DXVec3Cross(&axis,&vecUp,&Nsub); 
	if(sub.y>0) 
	D3DXMatrixRotationAxis(&matRo,&axis,D3DX_PI/180*fUp); 
	else 
	D3DXMatrixRotationAxis(&matRo,&axis,-D3DX_PI/180*fUp); 
	D3DXVec3TransformCoord(&sub,&sub,&matRo); 
	 
	 
 
	sub=sub+ViewVec; 
    D3DXMatrixLookAtLH(&matView,&ViewVec,&sub,&D3DXVECTOR3(0.0F,1.0F,0.0F)); 
	} 
	 
	PreViewVec=ViewVec; 
	cy=ViewVec.y; 
	if(ViewVec.y<=m_pWater->y) 
	{ 
		m_pD3DDevice->SetRenderState(D3DRS_FOGENABLE,FALSE); 
		SetWaterFog(); 
	} 
	else 
	{ 
        m_pD3DDevice->SetRenderState(D3DRS_FOGENABLE,FALSE); 
		SetFog(); 
	} 
 
	m_pD3DDevice->SetTransform(D3DTS_VIEW,&matView); 
	D3DXMatrixPerspectiveFovLH(&matPers,D3DX_PI/4,1.25f,1.0F,10000.0F); 
    
	m_pD3DDevice->SetTransform(D3DTS_PROJECTION,&matPers); 
	matProj=matView; 
    m_pD3DDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE); 
	m_pD3DDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESS); 
	m_pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE,TRUE); 
	 
	m_pD3DDevice->SetRenderState(D3DRS_LIGHTING,true); 
    
} 
 
void CGame::SetCamera2D() 
{ 
	D3DXMATRIX matPers,matView; 
 
	D3DXMatrixOrthoLH(&matPers,(float)m_nScreenWidth,(float)m_nScreenHeight,0.0f,1.0f); 
	D3DXMatrixIdentity(&matView); 
	m_pD3DDevice->SetTransform(D3DTS_PROJECTION,&matPers); 
	m_pD3DDevice->SetTransform(D3DTS_WORLD,&matView); 
	m_pD3DDevice->SetTransform(D3DTS_VIEW,&matView); 
	m_pD3DDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_FALSE); 
	m_pD3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE); 
} 
void CGame::GameLoop() 
{ 
	MSG msg; 
	BOOL bmessage; 
	PeekMessage(&msg,NULL,0U,0U,PM_NOREMOVE); 
	while(msg.message!=WM_QUIT) 
	{ 
		bmessage=PeekMessage(&msg,NULL,0U,0U,PM_REMOVE); 
		if(bmessage) 
		{ 
			TranslateMessage(&msg); 
			DispatchMessage(&msg); 
		} 
		else 
		{ 
			 
			Render(); 
		} 
	} 
} 
HRESULT CGame::InitialD3D(HWND hWnd) 
{ 
	m_pD3D=Direct3DCreate9(D3D_SDK_VERSION); 
	if(m_pD3D==NULL) 
	{ 
		E_FAIL; 
	} 
	D3DDISPLAYMODE d3ddm; 
	m_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm); 
	if(d3ddm.Format!=D3DFMT_UNKNOWN) 
	{ 
		d3ddm.Width=800; 
		d3ddm.Height=600; 
	} 
	m_nScreenWidth=d3ddm.Width; 
	m_nScreenHeight=d3ddm.Height; 
	D3DPRESENT_PARAMETERS d3dpp; 
	ZeroMemory(&d3dpp,sizeof(d3dpp)); 
	d3dpp.Windowed=true; 
	d3dpp.BackBufferCount=1; 
	d3dpp.BackBufferFormat=d3ddm.Format; 
	d3dpp.BackBufferHeight=d3ddm.Height; 
	d3dpp.BackBufferWidth=d3ddm.Width; 
	d3dpp.hDeviceWindow=hWnd; 
	d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD; 
	d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT; 
	d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_ONE; 
	if(SUCCEEDED(m_pD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,d3ddm.Format,D3DUSAGE_DEPTHSTENCIL,D3DRTYPE_SURFACE,D3DFMT_D32))) 
	{ 
		d3dpp.AutoDepthStencilFormat=D3DFMT_D32; 
		d3dpp.EnableAutoDepthStencil=true; 
	} 
	else if(SUCCEEDED(m_pD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,d3ddm.Format,D3DUSAGE_DEPTHSTENCIL,D3DRTYPE_SURFACE,D3DFMT_D24X8))) 
	{ 
		d3dpp.AutoDepthStencilFormat=D3DFMT_D24X8; 
		d3dpp.EnableAutoDepthStencil=true; 
	} 
	else if(SUCCEEDED(m_pD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,d3ddm.Format,D3DUSAGE_DEPTHSTENCIL,D3DRTYPE_SURFACE,D3DFMT_D16))) 
	{ 
		d3dpp.AutoDepthStencilFormat=D3DFMT_D16; 
		d3dpp.EnableAutoDepthStencil=true; 
	} 
	else 
	{ 
		d3dpp.EnableAutoDepthStencil=false; 
	} 
	if(FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&m_pD3DDevice))) 
	{ 
		return E_FAIL; 
	} 
 
	if(FAILED(m_pD3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW))) 
	{ 
		return E_FAIL; 
	} 
	if(FAILED(m_pD3DDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE))) 
	{ 
		return E_FAIL; 
	} 
	if(FAILED(m_pD3DDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID)))  
	//if(FAILED(m_pD3DDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME))) 
	{ 
        return E_FAIL; 
	} 
 
	if(FAILED(m_pD3DDevice->SetRenderState(D3DRS_NORMALIZENORMALS,TRUE))) 
	{ 
		return E_FAIL; 
	} 
 
	m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE); 
    m_pD3DDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA); 
	m_pD3DDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA); 
    m_pD3DDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE ); 
    m_pD3DDevice->SetRenderState( D3DRS_ALPHAREF,        0x0f); 
    m_pD3DDevice->SetRenderState( D3DRS_ALPHAFUNC,D3DCMP_GREATEREQUAL ); 
    m_pD3DDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE); 
	m_pD3DDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESS); 
	m_pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE,TRUE); 
    GetWindowRect(hWnd,&m_Rect); 
	return S_OK; 
} 
 
HRESULT CGame::InitialLight() 
{ 
	 
	ZeroMemory(&d3dLight,sizeof(D3DLIGHT9)); 
 
	d3dLight.Type=D3DLIGHT_POINT; 
	d3dLight.Position.x=1922;//ViewPos.x-500.0f; 
	d3dLight.Position.y=1000.0f; 
	d3dLight.Position.z=2229;//ViewPos.z-500.0f; 
 
	d3dLight.Attenuation0=1.0F; 
	d3dLight.Attenuation1=0.0f; 
	d3dLight.Attenuation2=0.0f; 
 
	d3dLight.Range=5000.0f; 
 
	d3dLight.Diffuse.r=1.0f; 
	d3dLight.Diffuse.g=1.0f; 
	d3dLight.Diffuse.b=1.0f; 
 
	d3dLight.Ambient.r=0.0f; 
	d3dLight.Ambient.g=0.0f; 
	d3dLight.Ambient.b=0.0f; 
 
	d3dLight.Specular.r=1.0f; 
	d3dLight.Specular.g=1.0f; 
	d3dLight.Specular.b=1.0f; 
 
	if(FAILED(m_pD3DDevice->SetLight(0,&d3dLight))) 
	{ 
		E_FAIL; 
	} 
	if(FAILED(m_pD3DDevice->LightEnable(0,true))) 
	{ 
		E_FAIL; 
	} 
	if(FAILED(m_pD3DDevice->SetRenderState(D3DRS_LIGHTING,TRUE))) 
	{ 
		E_FAIL; 
	} 
	if(FAILED(m_pD3DDevice->SetRenderState(D3DRS_AMBIENT,D3DCOLOR_XRGB(60,60,60)))) 
	{ 
		E_FAIL; 
	} 
	return S_OK; 
 
} 
COpen *g_pOpen=NULL; 
CGame * g_pGame=NULL; 
bool * bOpen; 
bool bOpenGame; 
int APIENTRY _tWinMain(HINSTANCE hInstance, 
                     HINSTANCE hPrevInstance, 
                     LPTSTR    lpCmdLine, 
                     int       nCmdShow) 
{ 
	hInst=hInstance; 
	WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,WndProc,0,0,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,"place",NULL}; 
	RegisterClassEx(&wc); 
	HWND hWnd=CreateWindow("place","placekk",WS_DLGFRAME,0,0,800,600,NULL,NULL,wc.hInstance,NULL);//WS_OVERLAPPEDWINDOW 
    bOpen=new bool[2]; 
	for(int i=0;i<2;i++) 
	{ 
		bOpen[i]=true; 
	} 
	bOpenGame=false; 
	g_pOpen=new COpen(hInst,hWnd); 
    ShowWindow(hWnd,SW_SHOWDEFAULT); 
	UpdateWindow(hWnd); 
	g_pOpen->OpenLoop(); 
    SafeDelete(g_pOpen); 
    if(bOpen[0]==false) 
	{ 
	  
	g_pGame=new CGame(hInst,hWnd); 
	if(SUCCEEDED(g_pGame->InitialD3D(hWnd))) 
	{ 
        g_pGame->InitialTools(); 
	    g_pGame->InitialLight(); 
		 
	 
	ShowWindow(hWnd,SW_SHOWDEFAULT); 
	UpdateWindow(hWnd); 
    bOpenGame=true; 
	g_pGame->GameLoop(); 
	} 
	SafeDelete(g_pGame); 
	} 
	UnregisterClass("place",wc.hInstance); 
	return 0; 
} 
 
 
 
// 
//  函数: MyRegisterClass() 
// 
//  目的: 注册窗口类。 
// 
//  注释:  
// 
//    仅当希望在已添加到 Windows 95 的 
//    “RegisterClassEx”函数之前此代码与 Win32 系统兼容时, 
//    才需要此函数及其用法。调用此函数 
//    十分重要,这样应用程序就可以获得关联的 
//   “格式正确的”小图标。 
// 
ATOM MyRegisterClass(HINSTANCE hInstance) 
{ 
	WNDCLASSEX wcex; 
 
	wcex.cbSize = sizeof(WNDCLASSEX);  
 
	wcex.style			= CS_HREDRAW | CS_VREDRAW; 
	wcex.lpfnWndProc	= (WNDPROC)WndProc; 
	wcex.cbClsExtra		= 0; 
	wcex.cbWndExtra		= 0; 
	wcex.hInstance		= hInstance; 
	wcex.hIcon			= LoadIcon(hInstance, (LPCTSTR)IDI_GAME); 
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW); 
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1); 
	wcex.lpszMenuName	= (LPCTSTR)IDC_GAME; 
	wcex.lpszClassName	= szWindowClass; 
	wcex.hIconSm		= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); 
 
	return RegisterClassEx(&wcex); 
} 
 
// 
//   函数: InitInstance(HANDLE, int) 
// 
//   目的: 保存实例句柄并创建主窗口 
// 
//   注释:  
// 
//        在此函数中,我们在全局变量中保存实例句柄并 
//        创建和显示主程序窗口。 
// 
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 
{ 
   HWND hWnd; 
 
   hInst = hInstance; // 将实例句柄存储在全局变量中 
 
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 
 
   if (!hWnd) 
   { 
      return FALSE; 
   } 
 
   ShowWindow(hWnd, nCmdShow); 
   UpdateWindow(hWnd); 
 
   return TRUE; 
} 
 
// 
//  函数: WndProc(HWND, unsigned, WORD, LONG) 
// 
//  目的: 处理主窗口的消息。 
// 
//  WM_COMMAND	- 处理应用程序菜单 
//  WM_PAINT	- 绘制主窗口 
//  WM_DESTROY	- 发送退出消息并返回 
// 
// 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
	/*int wmId, wmEvent; 
	PAINTSTRUCT ps; 
	HDC hdc; 
 
	switch (message)  
	{ 
	case WM_COMMAND: 
		wmId    = LOWORD(wParam);  
		wmEvent = HIWORD(wParam);  
		// 分析菜单选择: 
		switch (wmId) 
		{ 
		case IDM_ABOUT: 
			DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); 
			break; 
		case IDM_EXIT: 
			DestroyWindow(hWnd); 
			break; 
		default: 
			return DefWindowProc(hWnd, message, wParam, lParam); 
		} 
		break; 
	case WM_PAINT: 
		hdc = BeginPaint(hWnd, &ps); 
		// TODO: 在此添加任意绘图代码... 
		EndPaint(hWnd, &ps); 
		break; 
	case WM_DESTROY: 
		PostQuitMessage(0); 
		break; 
	default: 
		return DefWindowProc(hWnd, message, wParam, lParam); 
	} 
	return 0;*/ 
 
	switch(message) 
	{ 
	case WM_DESTROY: 
		PostQuitMessage(0); 
		break; 
		return 0; 
	case WM_KEYUP: 
		switch(wParam) 
		{ 
		case VK_ESCAPE: 
			if((bOpen[0]==false)&(bOpenGame==true)) 
				g_pGame->m_pInput->run=false; 
			break; 
			 
		case VK_F1: 
			KillTimer(hWnd,1); 
            //bOpen=false; 
			if(g_pOpen!=NULL) 
			g_pOpen->bOpen=false; 
			DestroyWindow(hWnd); 
			 
			break; 
            return 0; 
		} 
		break; 
	case WM_CREATE: 
		 
         SetTimer(hWnd,1,20,NULL); 
		  
		break; 
	case WM_TIMER: 
		if(bOpen[0]==true) 
		g_pOpen->Update(); 
		 
		if((bOpen[0]==false)&(bOpenGame==true)) 
		 
			g_pGame->m_pInput->Update(); 
		 
		switch(wParam) 
		{ 
		case 1: 
			 
			   if(bOpen[0]==true) 
			   { 
				   g_pOpen->Control(bOpen); 
				   g_pOpen->bOpen=bOpen[0]; 
			   } 
			   if(bOpen[1]==false) 
			   { 
				   bOpen[1]=true; 
				   DestroyWindow(hWnd); 
			   } 
			   if((bOpen[0]==false)&(bOpenGame==true)) 
			   { 
			   g_pGame->m_pInput->Control(&g_pGame->ViewFlag,&g_pGame->vecUp,&g_pGame->fUp,&g_pGame->shoot, 
				                                           g_pGame->m_pPanel->NumOfPos,g_pGame->m_pPanel->CallPress 
														   ,g_pGame->m_pPanel->ButtonPress,g_pGame->m_pPanel->Result, 
														   &g_pGame->ViewPos,g_pGame->object,g_pGame->m_pTerrain, 
														   &g_pGame->BossPos,&g_pGame->nomoney); 
		 
			   g_pGame->flash++; 
			   if(g_pGame->flash==100) 
			   { 
				   g_pGame->flash=0; 
			   } 
			    
			   if(g_pGame->m_pPanel->Result[1]==true) 
			    
			   { KillTimer(hWnd,1); 
            
			 
			       DestroyWindow(hWnd); 
			   } 
			   } 
			 
			 
		break; 
		} 
		 
		break; 
	} 
	return DefWindowProc(hWnd,message,wParam,lParam); 
} 
 
// “关于”框的消息处理程序。 
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
	switch (message) 
	{ 
	case WM_INITDIALOG: 
		return TRUE; 
 
	case WM_COMMAND: 
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)  
		{ 
			EndDialog(hDlg, LOWORD(wParam)); 
			return TRUE; 
		} 
		break; 
	} 
	return FALSE; 
}