📄 main.cpp
字号:
#include "stdafx.h"
#include "d3dutil.h"
#include "glval.h"
#include "scene1.h"
#include "scene2.h"
#include "scene3.h"
TCHAR debug[1024];
int ScreenWidth;
int ScreenHeight;
IDirect3DDevice9* Device;
HMODULE hdll;
unsigned int time_counter;
Camera TheCamera(Camera::LANDOBJECT);
D3DXMATRIX V;
IDirect3DTexture9* Texture_bkgnd;
IDirect3DTexture9* TextureButton[8];
unsigned int maze_width;
unsigned int maze_height;
bool input_width;
bool input_height;
unsigned int scene = 1;
int press_x, press_y;
extern RECT rtNext;
extern RECT rtNew;
extern RECT rtExit;
extern RECT rtSelectLoadFromFile;
extern RECT rtSelect;
extern enum ButtonStatus nextbuttonstatus;
extern enum ButtonStatus exitbuttonstatus;
extern enum ButtonStatus newbuttonstatus;
bool step;
bool bLoadFromFile;
extern IDirect3DTexture9* TextureButton[8];
class CD3DArcBall *m_ArcBall;
HMODULE resDll;
DWORD WINAPI msgbox(LPVOID lParam)
{
MessageBox(0, (TCHAR*)lParam, TEXT("出错啦!"), MB_OK|MB_ICONINFORMATION);
return TRUE;
}
// 初始化函数
bool Setup()
{
HCURSOR hcur = LoadCursor(resDll, MAKEINTRESOURCE(100)); // LoadCursorFromFile(TEXT("arrow.cur"));
if (!hcur)
{
ERMSG("D3DXCreateTextureFromResource(101) - FAILED");
return 0;
}
D3DUtil_SetDeviceCursor(Device, hcur, 0);
DeleteObject(hcur);
//
// 设置灯光
//
Device->SetRenderState(D3DRS_LIGHTING, false);
//
// 设置视图矩阵
//
D3DXVECTOR3 pos(0.0f, 0.0f, -2.0f);
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);
//
// 设置项目矩阵
//
D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(
&proj,
D3DX_PI * 0.5f, // 90 - degree
(float)ScreenWidth / (float)ScreenHeight,
1.0f,
1000.0f);
Device->SetTransform(D3DTS_PROJECTION, &proj);
//
// 加载资源文件
//
// 背景
/*
if (FAILED(D3DXCreateTextureFromFile(
Device,
TEXT("bkgnd.png"),
&Texture_bkgnd)))
{
ERMSG("D3DXCreateTextureFromFile(bkgnd.png) - FAILED");
return false;
}
*/
if (FAILED(D3DXCreateTextureFromResource(
Device,
resDll,
MAKEINTRESOURCE(102),
&Texture_bkgnd)))
{
ERMSG("D3DXCreateTextureFromResource(102) - FAILED");
return false;
}
// next 按钮
/*
if (FAILED(D3DXCreateTextureFromFile(
Device,
TEXT("next_normal.png"),
&TextureButton[0])))
{
ERMSG("D3DXCreateTextureFromFile(next_normal.png) - FAILED");
return false;
}
if (FAILED(D3DXCreateTextureFromFile(
Device,
TEXT("next_moveover.png"),
&TextureButton[1])))
{
ERMSG("D3DXCreateTextureFromFile(next_moveover.png) - FAILED");
return false;
}
*/
if (FAILED(D3DXCreateTextureFromResource(
Device,
resDll,
MAKEINTRESOURCE(103),
&TextureButton[0])))
{
ERMSG("D3DXCreateTextureFromResource(103) - FAILED");
return false;
}
if (FAILED(D3DXCreateTextureFromResource(
Device,
resDll,
MAKEINTRESOURCE(104),
&TextureButton[1])))
{
ERMSG("D3DXCreateTextureFromResource(104) - FAILED");
return false;
}
// select 按钮
/*
if (FAILED(D3DXCreateTextureFromFile(
Device,
TEXT("unselected.png"),
&TextureButton[2])))
{
ERMSG("D3DXCreateTextureFromFile(unselected.png) - FAILED");
return false;
}
if (FAILED(D3DXCreateTextureFromFile(
Device,
TEXT("selected.png"),
&TextureButton[3])))
{
ERMSG("D3DXCreateTextureFromFile(selected.png) - FAILED");
return false;
}
*/
if (FAILED(D3DXCreateTextureFromResource(
Device,
resDll,
MAKEINTRESOURCE(105),
&TextureButton[2])))
{
ERMSG("D3DXCreateTextureFromResource(105) - FAILED");
return false;
}
if (FAILED(D3DXCreateTextureFromResource(
Device,
resDll,
MAKEINTRESOURCE(106),
&TextureButton[3])))
{
ERMSG("D3DXCreateTextureFromResource(106) - FAILED");
return false;
}
// exit 按钮
/*
if (FAILED(D3DXCreateTextureFromFile(
Device,
TEXT("exit_normal.png"),
&TextureButton[4])))
{
ERMSG("D3DXCreateTextureFromFile(exit_normal.png) - FAILED");
return false;
}
if (FAILED(D3DXCreateTextureFromFile(
Device,
TEXT("exit_moveover.png"),
&TextureButton[5])))
{
ERMSG("D3DXCreateTextureFromFile(exit_moveover.png) - FAILED");
return false;
}
*/
if (FAILED(D3DXCreateTextureFromResource(
Device,
resDll,
MAKEINTRESOURCE(107),
&TextureButton[4])))
{
ERMSG("D3DXCreateTextureFromResource(107) - FAILED");
return false;
}
if (FAILED(D3DXCreateTextureFromResource(
Device,
resDll,
MAKEINTRESOURCE(108),
&TextureButton[5])))
{
ERMSG("D3DXCreateTextureFromResource(108) - FAILED");
return false;
}
// new 按钮
/*
if (FAILED(D3DXCreateTextureFromFile(
Device,
TEXT("new_normal.png"),
&TextureButton[6])))
{
ERMSG("D3DXCreateTextureFromFile(new_normal.png) - FAILED");
return false;
}
if (FAILED(D3DXCreateTextureFromFile(
Device,
TEXT("new_moveover.png"),
&TextureButton[7])))
{
ERMSG("D3DXCreateTextureFromFile(new_moveover.png) - FAILED");
return false;
}
*/
if (FAILED(D3DXCreateTextureFromResource(
Device,
resDll,
MAKEINTRESOURCE(109),
&TextureButton[6])))
{
ERMSG("D3DXCreateTextureFromResource(109) - FAILED");
return false;
}
if (FAILED(D3DXCreateTextureFromResource(
Device,
resDll,
MAKEINTRESOURCE(110),
&TextureButton[7])))
{
ERMSG("D3DXCreateTextureFromResource(110) - FAILED");
return false;
}
Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
return true;
}
void Cleanup()
{
d3d::Release(TextureButton[0]);
d3d::Release(TextureButton[1]);
d3d::Release(TextureButton[2]);
d3d::Release(TextureButton[3]);
d3d::Release(TextureButton[4]);
d3d::Release(TextureButton[5]);
d3d::Release(TextureButton[6]);
d3d::Release(TextureButton[7]);
d3d::Release(Texture_bkgnd);
}
//
// 窗口过程
//
LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
POINT pt;
if (scene == 3)
m_ArcBall->HandleMouseMessages( hwnd, msg, wParam, lParam );
switch( msg )
{
case WM_SETCURSOR:
SetCursor(NULL);
Device->ShowCursor(TRUE);
return TRUE;
break;
case WM_DESTROY:
::PostQuitMessage(0);
break;
case UM_SCENE1_ENDED:
scene = 2;
maze_width = maze_height = 8;
bLoadFromFile = false;
TheCamera.reset(Camera::LANDOBJECT);
TheCamera.getViewMatrix(&V);
Device->SetTransform(D3DTS_VIEW, &V);
input_width = true;
input_height = false;
memset(matrix, '1', sizeof(matrix));
LoadScene2();
CleanScene1();
break;
case WM_KEYDOWN:
if (wParam == VK_SPACE)
{
step = !step;
}
if( wParam == VK_ESCAPE )
{
::DestroyWindow(hwnd);
}
if (scene == 2)
{
if (wParam == VK_UP || wParam == VK_DOWN || wParam == VK_RETURN)
{
input_width = !input_width;
input_height = !input_height;
}
}
break;
case WM_CHAR:
if (scene == 2)
{
if (wParam >= '0' && wParam <= '9')
{
if (input_width)
{
maze_width *= 10;
maze_width += (wParam - '0');
}
else if (input_height)
{
maze_height *= 10;
maze_height += (wParam - '0');
}
CleanScene2();
LoadScene2();
}
else if (wParam == VK_BACK)
{
if (input_width)
{
maze_width /= 10;
}
else if (input_height)
{
maze_height /= 10;
}
CleanScene2();
LoadScene2();
}
}
break;
case WM_LBUTTONDOWN:
pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam);
ScreenToClient(hwnd, &pt);
if (scene == 2)
{
RECT rtBorder = {10, 200, 10+squaresize*maze_width, 200+squaresize*maze_height};
if (PtInRect(&rtBorder, pt))
{
int i = (pt.y - rtBorder.top)/squaresize;
int j = (pt.x - rtBorder.left)/squaresize;
press_x = j;
press_y = i;
if (matrix[i][j] == '1')
{
matrix[i][j] = '0';
}
else
{
matrix[i][j] = '1';
}
CleanScene2();
LoadScene2();
}
if (PtInRect(&rtNext, pt))
{
if (bLoadFromFile)
{
LoadFromFile(TEXT("maze.ini"));
}
if (maze_width * maze_height)
{
CleanScene2();
LoadScene2();
LoadScene3();
scene = 3;
}
else
{
CreateThread(0, 0, msgbox, TEXT("迷宫的长或宽不能为0,请重新输入"), 0, 0);
}
}
if (PtInRect(&rtSelectLoadFromFile, pt) || PtInRect(&rtSelect, pt))
{
bLoadFromFile = !bLoadFromFile;
}
if (PtInRect(&rtExit, pt))
{
::DestroyWindow(hwnd);
}
}
else if (scene == 3)
{
if (PtInRect(&rtNext, pt))
{
CleanScene3();
Cleanup();
Setup();
LoadScene2();
scene = 2;
maze_width = maze_height = 8;
}
if (PtInRect(&rtExit, pt))
{
::DestroyWindow(hwnd);
Cleanup();
}
}
break;
case WM_LBUTTONUP:
break;
case WM_MOUSEMOVE:
pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam);
ScreenToClient(hwnd, &pt);
if (scene == 2)
{
if (PtInRect(&rtNext, pt))
{
nextbuttonstatus = ButtonStatus::MOUSEOVER;
}
else
{
nextbuttonstatus = ButtonStatus::NORMAL;
}
if (PtInRect(&rtExit, pt))
{
exitbuttonstatus = ButtonStatus::MOUSEOVER;
}
else
{
exitbuttonstatus = ButtonStatus::NORMAL;
}
}
else if (scene == 3)
{
if (PtInRect(&rtNew, pt))
{
newbuttonstatus = ButtonStatus::MOUSEOVER;
}
else
{
newbuttonstatus = ButtonStatus::NORMAL;
}
if (PtInRect(&rtExit, pt))
{
exitbuttonstatus = ButtonStatus::MOUSEOVER;
}
else
{
exitbuttonstatus = ButtonStatus::NORMAL;
}
}
break;
}
return ::DefWindowProc(hwnd, msg, wParam, lParam);
}
//
// 入口函数
//
int WINAPI WinMain(HINSTANCE hinstance,
HINSTANCE prevInstance,
PSTR cmdLine,
int showCmd)
{
ScreenWidth = 800; // GetSystemMetrics(SM_CXSCREEN);
ScreenHeight = 600; // GetSystemMetrics(SM_CYSCREEN);
if(!d3d::InitD3D(hinstance,
ScreenWidth, ScreenHeight, true, D3DDEVTYPE_HAL, &Device))
{
::MessageBox(0, TEXT("InitD3D() - FAILED"), 0, 0);
return 0;
}
resDll = LoadLibrary(TEXT("resource.dll"));
if (!resDll)
{
::MessageBox(0, TEXT("LoadLibrary() - FAILED"), 0, 0);
return 0;
}
if(!Setup())
{
::MessageBox(0, TEXT("Setup() - FAILED"), 0, 0);
return 0;
}
scene = 1;
LoadScene1();/*
scene = 2;
bLoadFromFile = false;
TheCamera.reset(Camera::LANDOBJECT);
TheCamera.getViewMatrix(&V);
Device->SetTransform(D3DTS_VIEW, &V);
input_width = true;
input_height = false;
memset(matrix, '1', sizeof(matrix));
LoadScene2();
*/
d3d::EnterMsgLoop();
Cleanup();
Device->Release();
FreeLibrary(resDll);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -