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

📄 main.cpp

📁 我们数据结构课的课程设计
💻 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 + -