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

📄 flylight.cpp

📁 是3D游戏一书中所讲的游戏引擎fly3D 包括fly3D引擎的源码及应用此引擎开发出来的游戏实例 有fly3D引擎的教程,易于step by step跟学
💻 CPP
字号:
#include "../../lib/Fly3D.h"
#include "lightengine.h"
#include "resource.h"
#include "time.h"
#include <commctrl.h>

#define MAXLMPIXELSIZE 100

HINSTANCE hInst;
HWND hWndHC,hWndProgress,hWndStatus;
int lightvalue=-1,shadows=2,connectivity=1,ambient=32;
float lmpixelsize=50.0;
int mapsize=128;

float lightradius=0.0f;
char fly_file_name[256]="";

void MyGetProfile(LPTSTR section, LPTSTR key, LPBYTE lpData, DWORD cbData)
{
	HKEY key1,key2,key3,key4;

	if (ERROR_SUCCESS==RegOpenKeyEx(HKEY_CURRENT_USER,"Software",0,KEY_READ,&key1))
	{
		if (ERROR_SUCCESS==RegOpenKeyEx(key1,"Paralelo",0,KEY_READ,&key2))
		{
			if (ERROR_SUCCESS==RegOpenKeyEx(key2,"Fly3D",0,KEY_READ,&key3))
			{
				if (ERROR_SUCCESS==RegOpenKeyEx(key3,section,0,KEY_READ,&key4))
				{
					RegQueryValueEx(key4, key, 0, 0, lpData, &cbData);
					RegCloseKey(key4);
				}
				RegCloseKey(key3);
			}
			RegCloseKey(key2);
		}
		RegCloseKey(key1);
	}
}

void MyWriteProfile(LPTSTR section, LPCTSTR key, DWORD dwType, CONST BYTE *lpData, DWORD cbData)
{
	HKEY key1,key2,key3,key4;
	DWORD d;

	if (ERROR_SUCCESS==RegOpenKeyEx(HKEY_CURRENT_USER,"Software",0,KEY_READ,&key1))
	{
		if (ERROR_SUCCESS==RegCreateKeyEx(key1,"Paralelo",0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,&key2,&d))
		{
			if (ERROR_SUCCESS==RegCreateKeyEx(key2,"Fly3D",0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,&key3,&d))
			{
				if (ERROR_SUCCESS==RegCreateKeyEx(key3, section,0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,&key4,&d))
				{
					RegSetValueEx(key4, key, 0, dwType, lpData, cbData);
					RegCloseKey(key4);
				}
				RegCloseKey(key3);
			}
			RegCloseKey(key2);
		}
		RegCloseKey(key1);
	}
}

int OpenBspFileDialog(HWND hWnd,char *file)
{
	OPENFILENAME ofn;
	HINSTANCE hInstance;

	hInstance=(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);
	
	memset(&ofn,0,sizeof(OPENFILENAME));
	char filename[256]="";
	strcpy(filename,fly_file_name);

	ofn.lStructSize=sizeof(OPENFILENAME);
	ofn.hwndOwner=hWnd;
	ofn.hInstance=hInstance;
	ofn.lpstrFilter="Fly scene (*.fly)\0*.fly\0";
	ofn.lpstrDefExt="fly";
	ofn.lpstrFile=filename;
	ofn.nMaxFile=255;
	ofn.lpstrTitle="Open Fly3D Scene";
	ofn.Flags=OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;
	
	if (GetOpenFileName(&ofn))
	{
		strcpy(file,filename);
		if (filename[0])
			return 1;
	}
	return 0;
}

BOOL FAR PASCAL lightbspProc(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uiMsg)
	{
	case WM_INITDIALOG:
		hWndStatus=GetDlgItem(hWnd,IDC_STATUS);
		hWndProgress=GetDlgItem(hWnd,IDC_PROGRESS);
		EnableWindow(GetDlgItem(hWnd,IDOK),0);
		if (lightradius!=0.0f)
			{
			SetDlgItemInt(hWnd,IDC_LIGHTRADIUSEDIT,(int)lightradius,1);
			EnableWindow(GetDlgItem(hWnd,IDC_LIGHTRADIUSEDIT),1);
			}
		else EnableWindow(GetDlgItem(hWnd,IDC_LIGHTRADIUSEDIT),0);

		CheckDlgButton(hWnd,IDC_SHADOWS,shadows?1:0);
		CheckDlgButton(hWnd,IDC_CONNECTIVITY,connectivity?1:0);
		
		if (lightvalue!=-1)
			{
			SetDlgItemInt(hWnd,IDC_LIGHTVALUEEDIT,lightvalue,1);
			EnableWindow(GetDlgItem(hWnd,IDC_LIGHTVALUEEDIT),1);
			}
		else EnableWindow(GetDlgItem(hWnd,IDC_LIGHTVALUEEDIT),0);

		SetWindowText(GetDlgItem(hWnd,IDC_BSPFILE),fly_file_name);
		if (fly_file_name[0])
			EnableWindow(GetDlgItem(hWnd,IDOK),1);
		else EnableWindow(GetDlgItem(hWnd,IDOK),0);

		{
		char str[256];
		GetPrivateProfileString("fly", "amblight", "", str, 255, fly_file_name);
		sscanf(str, "%i", &ambient);
		GetPrivateProfileString("fly", "lmpxsize", "", str, 255, fly_file_name);
		sscanf(str, "%f", &lmpixelsize);
		GetPrivateProfileString("fly", "mapsize", "", str, 255, fly_file_name);
		sscanf(str, "%i", &mapsize);
		SetDlgItemInt(hWnd,IDC_AMBLIGHT,ambient,1);
		sprintf(str,"%.2f",lmpixelsize/10.0f);
		SetDlgItemText(hWnd,IDC_LMPIXELSIZE,str);
		SetDlgItemInt(hWnd,IDC_MAPSIZE,mapsize,1);
		}
		break;

	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDC_BROWSE:
			if (OpenBspFileDialog(hWnd,fly_file_name))
				if (fly_file_name[0])
				{
					char str[256];

					GetPrivateProfileString("fly", "amblight", "", str, 255, fly_file_name);
					sscanf(str, "%i", &ambient);
					GetPrivateProfileString("fly", "lmpxsize", "", str, 255, fly_file_name);
					sscanf(str, "%f", &lmpixelsize);
					GetPrivateProfileString("fly", "mapsize", "", str, 255, fly_file_name);
					sscanf(str, "%i", &mapsize);

					SetDlgItemInt(hWnd,IDC_AMBLIGHT,ambient,1);
					sprintf(str,"%.2f",lmpixelsize/10.0f);
					SetDlgItemText(hWnd,IDC_LMPIXELSIZE,str);
					SetDlgItemInt(hWnd,IDC_MAPSIZE,mapsize,1);
				
					EnableWindow(GetDlgItem(hWnd,IDOK),1);
				SetDlgItemText(hWnd,IDC_BSPFILE,fly_file_name);
				}
			else EnableWindow(GetDlgItem(hWnd,IDOK),0);
			break;
		case IDOK:
			{
			char str[256];
			int i;

			shadows=IsDlgButtonChecked(hWnd,IDC_SHADOWS)*2;
			connectivity=IsDlgButtonChecked(hWnd,IDC_CONNECTIVITY);

			if (IsDlgButtonChecked(hWnd,IDC_LIGHTRADIUS))
				{
				i=GetDlgItemInt(hWnd,IDC_LIGHTRADIUSEDIT,0,1);
				lightradius=(float)(i<0?0:i);
				SetDlgItemInt(hWnd,IDC_LIGHTRADIUSEDIT,(int)lightradius,1);
				}
			else lightradius=0.0f;
			if (IsDlgButtonChecked(hWnd,IDC_LIGHTVALUE))
				{
				i=GetDlgItemInt(hWnd,IDC_LIGHTVALUEEDIT,0,1);
				lightvalue=(i<0?0:i>255?255:i);
				SetDlgItemInt(hWnd,IDC_LIGHTVALUEEDIT,lightvalue,1);
				}
			else lightvalue=-1;
			
			i=GetDlgItemInt(hWnd,IDC_AMBLIGHT,0,1);
			ambient=(i<0?0:i>255?255:i);

			mapsize=GetDlgItemInt(hWnd,IDC_MAPSIZE,0,1);
			
			GetDlgItemText(hWnd,IDC_LMPIXELSIZE,str,255);
			sscanf(str,"%f",&lmpixelsize);
			lmpixelsize*=10.0f;
			
			EnableWindow(GetDlgItem(hWnd,IDOK),0);
			
			set_engine(new lightEngine,hWnd,hInst,FLYAPPID_LIGHTBSP);
			init_directx();
			flyengine->shadows=shadows;
			((lightEngine *)flyengine)->light(fly_file_name);
			free_engine();
			free_directx();

			EnableWindow(GetDlgItem(hWnd,IDOK),1);
			}
			break;
		case IDC_LIGHTRADIUS:
			if (IsDlgButtonChecked(hWnd,IDC_LIGHTRADIUS))
				EnableWindow(GetDlgItem(hWnd,IDC_LIGHTRADIUSEDIT),1);
			else EnableWindow(GetDlgItem(hWnd,IDC_LIGHTRADIUSEDIT),0);
			break;
		case IDC_LIGHTVALUE:
			if (IsDlgButtonChecked(hWnd,IDC_LIGHTVALUE))
				EnableWindow(GetDlgItem(hWnd,IDC_LIGHTVALUEEDIT),1);
			else EnableWindow(GetDlgItem(hWnd,IDC_LIGHTVALUEEDIT),0);
			break;
		case IDCANCEL:
			EndDialog (hWnd, IDCANCEL);
			break;
		}
		break;
	}
	return FALSE;
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
	hInst=hInstance;

	MyGetProfile("lightbsp","filename", (unsigned char *)&fly_file_name, 256);

	DialogBox(hInst,MAKEINTRESOURCE(IDD_LIGHTBSP),0,(DLGPROC)lightbspProc);

	MyWriteProfile("lightbsp","filename", REG_SZ, (unsigned char *)&fly_file_name, sizeof(char)*strlen(fly_file_name)+1);

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -