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

📄 flyengine.cpp

📁 是3D游戏一书中所讲的游戏引擎fly3D 包括fly3D引擎的源码及应用此引擎开发出来的游戏实例 有fly3D引擎的教程,易于step by step跟学
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		if (type==0 || type==o->type)
			break;
		o=(bsp_object *)o->next_obj;
		}
	
	return o;
}

void flyEngine::compute_node_light()
{
	int i,x,y;
	unsigned char *uc;
	vector point;
	bsp_node *node;
	light_map_pic *lmp;

	if (nlm==0)
	{
	for( i=0;i<nleaf;i++ )
		leaf[i]->color.vec(1,1,1,1);
	return;
	}

	for( i=0;i<nleaf;i++ )
		{
		leaf[i]->color.null();
		leaf[i]->leaf=0;
		}

	for( i=0;i<nlm;i++ )
	{
	lmp=lmpic[lm[i]->pic];
	for( y=0;y<lm[i]->sizey;y++ )
		{
		uc=&lmp->bmp[(y+lm[i]->offsety)*lmp->bytesx+lm[i]->offsetx];
		for( x=0;x<lm[i]->sizex;x++ )
			{
			lm[i]->map_point((float)x/lm[i]->sizex+1.0f/(lm[i]->sizex*2),(float)y/lm[i]->sizey+1.0f/(lm[i]->sizey*2),point);
			node=find_node(bsp,point,0);
			if (node)
				{
				node->color.x+=*(uc++);
				node->color.y+=*(uc++);
				node->color.z+=*(uc++);
				node->leaf++;
				}
			else uc+=3;
			}
		}
	}

	for( i=0;i<nleaf;i++ )
		{
		if (leaf[i]->leaf)
			leaf[i]->color/=leaf[i]->leaf*255.0f;
		leaf[i]->color.w=1.0f;
		leaf[i]->leaf=i;
		}
}

void flyEngine::load_level()
{
	char str[256];

	strcpy(str,flydatapath);
	strcat(str,bspfile);
	strcat(str,".tex");
	load_pictures(str);

	strcpy(str,flydatapath);
	strcat(str,bspfile);
	strcat(str,".bsp");
	load_bsp(str);

	strcpy(str,flydatapath);
	strcat(str,bspfile);
	strcat(str,".pvs");
	load_pvs(str);

	strcpy(str,flydatapath);
	strcat(str,bspfile);
	strcat(str,".lmp");
	load_lightmaps(str);
}

int flyEngine::load_data()
{
	char ret[256],str[256];
	int i,j;
	param_desc pd;

	fly_pak fly_file;
	if (!fly_file.open(flyfilename))
		return 0;

	fly_file.get_profile_string("fly", "bspfile", bspfile);

	load_level();

	j=get_global_param_desc(0,0);
	for( i=0;i<j;i++ )
	{
	get_global_param_desc(i,&pd);
	fly_file.get_profile_string("fly",pd.name,ret);
	pd.set_string(ret);
	}

	if (fontspic!=-1)
		{
		strcpy(str,flydatapath);
		strcat(str,"maps\\");
		strcat(str,piclib[fontspic]->name);
		if (strrchr(str,'.'))
			*strrchr(str,'.')=0;
		strcat(str,".txt");
		fly_pak fp;
		if (fp.open(str))
			for( int i=0;i<64;i++ )
				fonts_width[i]=fp.get_int();
		else 
			for( int i=0;i<64;i++ )
				fonts_width[i]=FONTS_SIZE/2;
		}

	i=0;
	while(1)
		{
		sprintf(str,"dll%i",i++);
		fly_file.get_profile_string("classes",str,ret);
		if (ret[0]==0) break;
		dll.add_dll(ret);
		}

	dll.load_all_classes(&fly_file);
	bsp_object *o=active_obj0;
	while(o)
		{
		o->load_params(&fly_file,o->name);
		o=(bsp_object *)o->next_obj;
		}
	o=stock_obj0;
	while(o)
		{
		o->load_params(&fly_file,o->name);
		o=(bsp_object *)o->next_obj;
		}

	fly_file.get_profile_string("fly","camera",ret);
	cam=get_active_object(ret);
	fly_file.get_profile_string("fly","player",ret);
	player=get_active_object(ret);
	
	if (directx)
		directx->players[0].data=player;

	bsp_object *s=0,*n;
	o=stock_obj0;
	while(o)
		{
		n=(bsp_object *)o->next_obj;
		o->next_obj=s;
		s=o;
		o=n;
		}
		
	stock_obj0=s;

	o=stock_obj0;
	while(o)
		{
		cur_step++;
		o->init();
		o=(bsp_object *)o->next_obj;
		}
	o=active_obj0;
	while(o)
		{
		cur_step++;
		o->init();
		o->add_to_bsp();
		o=(bsp_object *)o->next_obj;
		}

	compute_node_light();

	dll.send_message(FLYM_INITSCENE,0,0);

	return 1;
}

int flyEngine::add_lightmap(int sx,int sy)
{
	int x=0,y=0,i,j;
	int sizes[]={ 1,2,4,8,16,32,64,128,256 };
	for( i=0,j=256;i<9;i++ )
		if (abs(sizes[i]-sx)<j)
			{
			j=abs(sizes[i]-sx);
			x=i;
			}
	for( i=0,j=256;i<9;i++ )
		if (abs(sizes[i]-sy)<j)
			{
			j=abs(sizes[i]-sy);
			y=i;
			}

	lmpic[nlmpic]=new light_map_pic(sizes[x],sizes[y],3);
	fmpic[nlmpic]=new light_map_pic(sizes[x],sizes[y],4);
	lm[nlm]=new light_map(-1,nlmpic,0,0,sizes[x],sizes[y],3);
	fm[nlm]=new light_map(-1,nlmpic,0,0,sizes[x],sizes[y],4);

	nlmpic++;
	return nlm++;
}

int flyEngine::get_obj_param(char *objname,char *param,char *value)
{
	value[0]=0;
	bsp_object *obj;
	obj=active_obj0;
	while(obj)
		{
		if (!stricmp(objname,obj->long_name))
			break;
		obj=(bsp_object *)obj->next_obj;
		}
	if (obj==0)
		{
		obj=stock_obj0;
		while(obj)
			{
			if (!stricmp(objname,obj->long_name))
				break;
			obj=(bsp_object *)obj->next_obj;
			}
		}
	if (obj==0) return 1;
	int i,n;
	param_desc pd;
	n=obj->get_param_desc(0,0);
	for( i=0;i<n;i++ )
		{
		obj->get_param_desc(i,&pd);
		if (!stricmp(pd.name,param))
			break;
		}
	if (i==n)
		return 2;

	strcpy(value,pd.get_string());

	return 0;
}

int flyEngine::set_global_param(char *name,char *value)
{
	param_desc pd;
	int i,n;

	n=get_global_param_desc(0,0);
	for( i=0;i<n;i++ )
		{
		get_global_param_desc(i,&pd);
		if (!stricmp(name,pd.name))
			break;
		}
	if (i==n)
		return 0;
	
	pd.set_string(value);
	if (pd.type=='p' || pd.type=='3' || pd.type=='m')
	{
		close_texture_cache();
		init_texture_cache();
	}

	bsp_object *obj;
	obj=stock_obj0;
	while(obj)
	{
		obj->message(vector(0,0,0),0,FLYOBJM_CHANGEPARAM,-i-1,&pd);
		obj=(bsp_object *)obj->next_obj;
	}
	obj=active_obj0;
	while(obj)
	{
		obj->message(vector(0,0,0),0,FLYOBJM_CHANGEPARAM,-i-1,&pd);
		obj=(bsp_object *)obj->next_obj;
	}

	return 1;
}

int flyEngine::set_obj_param(char *objname,char *param,char *value)
{
	bsp_object *obj=stock_obj0;
	int ret=0;
	while(obj)
		{
		if (!stricmp(objname,obj->long_name))
			break;
		obj=(bsp_object *)obj->next_obj;
		}
	if (obj==0) return 1;

	param_desc pd;
	int i,j,n;
	n=obj->get_param_desc(0,0);
	for( i=0;i<n;i++ )
		{
		obj->get_param_desc(i,&pd);
		if (!stricmp(pd.name,param))
			break;
		}
	if (i==n)
		return 2;

	j=4;
	if (pd.type=='d' || pd.type<-255)
	{
		bsp_object *o=active_obj0;
		while(o)
		{
			if (!stricmp(o->long_name,value))
				break;
			o=(bsp_object *)o->next_obj;
		}
		*((bsp_object **)pd.data)=o;
	}
	else
	if (pd.type=='o' || pd.type>255)
	{
		bsp_object *o=stock_obj0;
		while(o)
		{
			if (!stricmp(o->long_name,value))
				break;
			o=(bsp_object *)o->next_obj;
		}
		*((bsp_object **)pd.data)=o;
	}
	else pd.set_string(value);

	switch(pd.type)
	{
	case 'i':
	case 'f':
	case 'a':
	case 'w':
	case 'd':
	case 'o':
	case 'z':
	case 'h':
		break;
	case 'v':
	case 'c':
		j=12;
		break;
	case 's':
		j=strlen(value)+1;
		break;
	case 'p':
	case '3':
	case 'm':
		close_texture_cache();
		init_texture_cache();
		break;
	default:
		return 3;
	}

	obj->message(vector(0,0,0),0,FLYOBJM_CHANGEPARAM,0,0);
	char *data=(char *)pd.data;
	obj=active_obj0;
	while(obj)
		{
		if (!stricmp(objname,obj->long_name))
			{
			obj->get_param_desc(i,&pd);
			memcpy(pd.data,data,j);
			obj->message(vector(0,0,0),0,FLYOBJM_CHANGEPARAM,i,&pd);
			}
		obj=(bsp_object *)obj->next_obj;
		}
	
	return ret;
}

int flyEngine::get_global_param_desc(int i,param_desc *pd)
{
	if (pd!=0)
	switch(i)
	{
		case 0:
			pd->type='c';
			pd->data=&background;
			strcpy(pd->name,"background");
			break;
		case 1:
			pd->type='b';
			pd->data=&bspfile;
			strcpy(pd->name,"bspfile");
			break;
		case 2:
			pd->type='f';
			pd->data=&viewmindist;
			strcpy(pd->name,"viewmindist");
			break;
		case 3:
			pd->type='f';
			pd->data=&viewmaxdist;
			strcpy(pd->name,"viewmaxdist");
			break;
		case 4:
			pd->type='f';
			pd->data=&camangle;
			strcpy(pd->name,"camangle");
			break;
		case 5:
			pd->type='d';
			pd->data=&cam;
			strcpy(pd->name,"camera");
			break;
		case 6:
			pd->type='d';
			pd->data=&player;
			strcpy(pd->name,"player");
			break;

		case 7:
			pd->type=' ';
			pd->data=0;
			strcpy(pd->name,"");
			break;

		case 8:
			pd->type='i';
			pd->data=&amblight;
			strcpy(pd->name,"amblight");
			break;
		case 9:
			pd->type='f';
			pd->data=&curveerr;
			strcpy(pd->name,"curveerr");
			break;
		case 10:
			pd->type='f';
			pd->data=&geomdetail;
			strcpy(pd->name,"geomdetail");
			break;
		case 11:
			pd->type='f';
			pd->data=&lmpxsize;
			strcpy(pd->name,"lmpxsize");
			break;
		case 12:
			pd->type='i';
			pd->data=&mapmode;
			strcpy(pd->name,"mapmode");
			break;
		case 13:
			pd->type='i';
			pd->data=&mpdelay;
			strcpy(pd->name,"mpdelay");
			break;
		case 14:
			pd->type='c';
			pd->data=&shadowcolor;
			strcpy(pd->name,"shadowcolor");
			break;
		case 15:
			pd->type='f';
			pd->data=&shadowdepth;
			strcpy(pd->name,"shadowdepth");
			break;

		case 16:
			pd->type=' ';
			pd->data=0;
			strcpy(pd->name,"");
			break;

		case 17:
			pd->type='p';
			pd->data=&consolepic;
			strcpy(pd->name,"consolepic");
			break;
		case 18:
			pd->type='p';
			pd->data=&fontspic;
			strcpy(pd->name,"fontspic");
			break;
		case 19:
			pd->type='p';
			pd->data=&intropic;
			strcpy(pd->name,"intropic");
			break;
		case 20:
			pd->type='p';
			pd->data=&crosshairpic;
			strcpy(pd->name,"crosshairpic");
			break;
		case 21:
			pd->type='i';
			pd->data=&crosshairsize;
			strcpy(pd->name,"crosshairsize");
			break;
		case 22:
			pd->type='p';
			pd->data=&cartoonpicbsp;
			strcpy(pd->name,"cartoonpicbsp");
			break;
		case 23:
			pd->type='p';
			pd->data=&cartoonpic;
			strcpy(pd->name,"cartoonpic");
			break;
		case 24:
			pd->type='c';
			pd->data=&cartooncolor;
			strcpy(pd->name,"cartooncolor");
			break;
		case 25:
			pd->type='f';
			pd->data=&cartoonwidth;
			strcpy(pd->name,"cartoonwidth");
			break;
		case 26:
			pd->type='p';
			pd->data=&detailpic;
			strcpy(pd->name,"detailpic");
			break;
		case 27:
			pd->type='f';
			pd->data=&detailtile;
			strcpy(pd->name,"detailtile");
			break;

		case 28:
			pd->type=' ';
			pd->data=0;
			strcpy(pd->name,"");
			break;

		case 29:
			pd->type='i';
			pd->data=&antialias;
			strcpy(pd->name,"antialias");
			break;
		case 30:
			pd->type='i';
			pd->data=&clearbk;
			strcpy(pd->name,"clearbk");
			break;
		case 31:
			pd->type='i';
			pd->data=&fog;
			strcpy(pd->name,"fog");
			break;
		case 32:
			pd->type='i';
			pd->data=&hwlights;
			strcpy(pd->name,"hwlights");
			break;
		case 33:
			pd->type='i';
			pd->data=&mouse;
			strcpy(pd->name,"mouse");
			break;
		case 34:
			pd->type='i';
			pd->data=&mipmap;
			strcpy(pd->name,"mipmap");
			break;
		case 35:
			pd->type='i';
			pd->data=&multitexture;
			strcpy(pd->name,"multitexture");
			break;
		case 36:
			pd->type='i';
			pd->data=&mute;
			strcpy(pd->name,"mute");
			break;
		case 37:
			pd->type='i';
			pd->data=&nodeonly;
			strcpy(pd->name,"nodeonly");
			break;
		case 38:
			pd->type='i';
			pd->data=&pvsoff;
			strcpy(pd->name,"pvsoff");
			break;
		case 39:
			pd->type='i';
			pd->data=&shadows;
			strcpy(pd->name,"shadows");
			break;
		case 40:
			pd->type='i';
			pd->data=&status;
			strcpy(pd->name,"status");
			break;
		case 41:
			pd->type='i';
			pd->data=&stencil;
			strcpy(pd->name,"stencil");
			break;
		case 42:
			pd->type='i';
			pd->data=&textfilter;
			strcpy(pd->name,"textfilter");
			break;
		case 43:
			pd->type='i';
			pd->data=&wireframe;
			strcpy(pd->name,"wireframe");
			break;
	}
	return 44;
}

⌨️ 快捷键说明

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