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

📄 flyengine.cpp

📁 是3D游戏一书中所讲的游戏引擎fly3D 包括fly3D引擎的源码及应用此引擎开发出来的游戏实例 有fly3D引擎的教程,易于step by step跟学
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		{
		picture *p=new picture;
		char name[256];
		strcpy(name,flydatapath);
		strcat(name,"maps\\");
		strcat(name,file);
		if (p->LoadPIC(name))
			{
			piclib[npiclib]=p;
			strcpy(piclib[npiclib]->name,file);
			return npiclib++;
			}
		else
			{
			delete p;
			return -1;
			}
		}

	return j;
}

int flyEngine::load_pictures(char *namef)
{
	fly_pak fp;
	int i,n;
	char name[256],str[256];

	if(!fp.open(namef))
		return 0;

	n=fp.get_int();
	fp.get_string(str);
	for(i=0;i<n;i++)
		{
		fp.get_string(str);
		piclib[i]=new picture;
		strcpy(name,flydatapath);
		strcat(name,"maps\\");
		strcat(name,str);
		piclib[npiclib+i]->LoadPIC(name);
		strcpy(piclib[npiclib+i]->name,str);
		}
	npiclib+=n;

	return 1;
}

int flyEngine::load_bsp(char *file) 
{
	unsigned char uc;
	int w[3];
	int i,nv;

	fly_pak fp;

	if (!fp.open(file))
		return 0;

	fp.read(&nv,sizeof(int));
	nvert=abs(nv);
	
	vert=new vector[nvert];

	for( i=0;i<nvert;i++ )
		fp.read(&vert[i],3*sizeof(float));
	if (nv<0)
	{
	vertcolor=new vector[nvert];
	for( i=0;i<nvert;i++ )
		{
		fp.read(&uc,1);
		vertcolor[i].x=uc/255.0f;
		fp.read(&uc,1);
		vertcolor[i].y=uc/255.0f;
		fp.read(&uc,1);
		vertcolor[i].z=uc/255.0f;
		fp.read(&uc,1);
		vertcolor[i].w=1.0f;
		}
	}

	fp.read(&nfaces,sizeof(int));
	faces=new face[nfaces];
	facedraw=new int[nfaces];
	facedrawtransp=new int[nfaces];
	for( i=0;i<nfaces;i++ )
		{
		fp.read(w,sizeof(int)*3);
		faces[i].vert[0]=&vert[w[0]];
		faces[i].vert[1]=&vert[w[1]];
		faces[i].vert[2]=&vert[w[2]];
		fp.read(&faces[i].texpic,sizeof(int));
		fp.read(&faces[i].emmradius,sizeof(float));
		fp.read(faces[i].uv,sizeof(float)*6);
		fp.read(&uc,1);
		faces[i].color.x=uc/255.0f;
		fp.read(&uc,1);
		faces[i].color.y=uc/255.0f;
		fp.read(&uc,1);
		faces[i].color.z=uc/255.0f;
		fp.read(&uc,1);
		faces[i].color.w=uc/255.0f;
		faces[i].indx=i;
		}

	load_bsp(&bsp,&fp);
	fp.close();

	compute_normals();

	return 1;
}

void flyEngine::load_bsp(bsp_node **n,fly_pak *fp)
{
	char c;
	int f,i;
	int w;

	fp->read(&c,1);
	if (c==0)
		return;

	*n=new bsp_node;

	fp->read(&(*n)->leaf,sizeof(int));

	fp->read(&(*n)->normal,3*sizeof(float));
	fp->read(&(*n)->d0,sizeof(float));

	fp->read(&f,sizeof(int));
	if (f)
		{
		static_mesh *so=new static_mesh;
		so->objmesh->pivotpos.null();
		so->objmesh->nf=f;
		so->objmesh->faces=new face *[so->objmesh->nf];
		for( i=0;i<so->objmesh->nf;i++ )
			{
			fp->read(&w,sizeof(int));
			so->objmesh->faces[i]=&faces[w];
			so->objmesh->faces[i]->lastdraw=0;
			}
		so->objmesh->compute_normals(MESH_FACENORM|MESH_VERTNORM|MESH_BBOX);
		so->next_elem=(*n)->elem;
		(*n)->elem=so;
		(*n)->last_elem=&so->next_elem;
		}

	load_bsp(&(*n)->child[0],fp);
	load_bsp(&(*n)->child[1],fp);
}

void flyEngine::save_bsp(bsp_node *n,FILE *fp)
{
	char c;
	int i;
	int w;

	if (n==0)
		{
		c=0;
		fwrite(&c,1,1,fp);
		return;
		}

	c=1;
	fwrite(&c,1,1,fp);

	fwrite(&n->leaf,1,sizeof(int),fp);

	fwrite(&n->normal, 3, sizeof(float), fp);
	fwrite(&n->d0, 1, sizeof(float), fp);

	bsp_object *e=n->elem;
	while(e)
		{
		if (e->type==TYPE_STATIC_MESH)
			break;
		e=e->next_elem;
		}
	static_mesh *so=(static_mesh *)e;
	if (so)
		{
		fwrite(&so->objmesh->nf,1,sizeof(int),fp);
		for( i=0;i<so->objmesh->nf;i++ )
			{
			w=so->objmesh->faces[i]->indx;
			fwrite(&w,1,sizeof(int),fp);
			}
		}
	else 
		{
		i=0;
		fwrite(&i,1,sizeof(int),fp);
		}

	save_bsp(n->child[0],fp);
	save_bsp(n->child[1],fp);
}

int flyEngine::save_bsp(char *file)
{
	if (bsp==0)
		return 0;

	FILE *fp;
	unsigned char uc;
	int w[3];
	int i,nv;

	fp=fopen(file,"wb");
	if (!fp)
		return 0;

	if (vertcolor)
		nv=-nvert;
	else nv=nvert;

	fwrite(&nv,1,sizeof(int),fp);

	for( i=0;i<nvert;i++ )
		fwrite(&vert[i],3,sizeof(float),fp);
	if (nv<0)
	for( i=0;i<nvert;i++ )
	{
		uc=(unsigned char)(vertcolor[i].x*255);
		fwrite(&uc,1,1,fp);
		uc=(unsigned char)(vertcolor[i].y*255);
		fwrite(&uc,1,1,fp);
		uc=(unsigned char)(vertcolor[i].z*255);
		fwrite(&uc,1,1,fp);
		uc=255;
		fwrite(&uc,1,1,fp);
	}

	fwrite(&nfaces,1,sizeof(int),fp);
	for( i=0;i<nfaces;i++ )
		{
		faces[i].indx=i;

		w[0]=(int)(faces[i].vert[0]-vert);
		w[1]=(int)(faces[i].vert[1]-vert);
		w[2]=(int)(faces[i].vert[2]-vert);
		fwrite(w,sizeof(int),3,fp);
		fwrite(&faces[i].texpic,sizeof(int),1,fp);
		fwrite(&faces[i].emmradius,sizeof(float),1,fp);
		
		fwrite(faces[i].uv,sizeof(float),6,fp);

		uc=(unsigned char)(faces[i].color.x*255);
		fwrite(&uc,1,1,fp);
		uc=(unsigned char)(faces[i].color.y*255);
		fwrite(&uc,1,1,fp);
		uc=(unsigned char)(faces[i].color.z*255);
		fwrite(&uc,1,1,fp);
		uc=(unsigned char)(faces[i].color.w*255);
		fwrite(&uc,1,1,fp);
		}

	save_bsp(bsp,fp);

	fclose(fp);

	return 1;
}

int flyEngine::load_lightmaps(char *file)
{
	if (nfaces==0)
		return 0;
	int i,x,y,sx,sy,f,p;
	fly_pak fp;
	
	if (!fp.open(file)) return 0;

	fp.read(&i,sizeof(int));
	if (i!=nfaces) 
	{ fp.close(); return 0;};
	
	for( i=0;i<nfaces;i++ )
		{
		fp.read(&faces[i].lm,sizeof(int));
		fp.read(&faces[i].lmuv,sizeof(float)*6);
		}

	fp.read(&nlmpic,sizeof(int));
	for( i=0;i<nlmpic;i++ )
		{
		fp.read(&sx,sizeof(int));
		fp.read(&sy,sizeof(int));
		lmpic[i]=new light_map_pic(sx,sy);
		fp.read(lmpic[i]->bmp,lmpic[i]->bytesxy);
		}

	fp.read(&nlm,sizeof(int));
	for( i=0;i<nlm;i++ )
	{
		fp.read(&f,sizeof(int));
		fp.read(&p,sizeof(int));
		fp.read(&x,sizeof(int));
		fp.read(&y,sizeof(int));
		fp.read(&sx,sizeof(int));
		fp.read(&sy,sizeof(int));
		lm[i]=new light_map(f,p,x,y,sx,sy,3);
		lm[i]->load(lmpic[p]);
	}

	fp.close();

	for( i=0;i<nlmpic;i++ )
	{
		fmpic[i]=new light_map_pic(lmpic[i]->sizex,lmpic[i]->sizey,4);
		memset(fmpic[i]->bmp,0,fmpic[i]->bytesxy);
	}
	for( i=0;i<nlm;i++ )
	{
		fm[i]=new light_map(lm[i]->facenum,lm[i]->pic,lm[i]->offsetx,lm[i]->offsety,lm[i]->sizex,lm[i]->sizey,4);
		memset(fm[i]->bmp,0,fm[i]->bytesxy);
		if (lm[i]->facenum!=-1)
			lm[i]->set_base(&faces[lm[i]->facenum],lmpic[lm[i]->pic]);
		if (fm[i]->facenum!=-1)
			fm[i]->set_base(&faces[fm[i]->facenum],fmpic[fm[i]->pic]);
	}

	return 1;
}
int flyEngine::save_lightmaps(char *file)
{
	if (nfaces==0)
		return 0;
	FILE *fp;
	int i;
	
	fp=fopen(file,"wb");
	if (fp==0) return 0;

	fwrite(&nfaces,1,sizeof(int),fp);
	
	for (i=0;i<nfaces;i++ )
		{
		fwrite(&faces[i].lm,sizeof(int),1,fp);
		fwrite(&faces[i].lmuv,sizeof(int),6,fp);
		}

	fwrite(&nlmpic,1,sizeof(int),fp);
	for( i=0;i<nlmpic;i++ )
	{
		fwrite(&lmpic[i]->sizex,sizeof(int),1,fp);
		fwrite(&lmpic[i]->sizey,sizeof(int),1,fp);
		fwrite(lmpic[i]->bmp,lmpic[i]->bytesxy,1,fp);
	}

	fwrite(&nlm,1,sizeof(int),fp);
	for( i=0;i<nlm;i++ )
		{
		fwrite(&lm[i]->facenum,sizeof(int),1,fp);
		fwrite(&lm[i]->pic,sizeof(int),1,fp);
		fwrite(&lm[i]->offsetx,sizeof(int),2,fp);
		fwrite(&lm[i]->sizex,sizeof(int),2,fp);
		}

	fclose(fp);
	return 1;
}

int flyEngine::load_pvs(char *file)
{
	int i;
	fly_pak fp;

	alloc_pvs((char)255);
	if (pvssize==0) return 0;

	if (!fp.open(file)) return 0;

	fp.read(&i,sizeof(int));
	if (i==nleaf)
		fp.read(pvs,pvssize);
	
	fp.close();

	for( i=0;i<nleaf;i++ )
		if (leaf[i]->leaf!=i)
			break;

	return 1;
}

int flyEngine::save_pvs(char *file)
{
	FILE *fp;
	if (pvssize==0) return 0;
	fp=fopen(file,"wb");
	if (fp==0) return 0;
	fwrite(&nleaf,1,sizeof(int),fp);
	fwrite(pvs,pvssize,1,fp);
	fclose(fp);
	return 1;
}

void WriteProfileInt(char *sec,char *key,int value)
{
	char str[256];
	sprintf(str,"%i",value);
	WriteProfileString(sec,key,str);
}

int GetProfileInt(char *sec,char *key,int value)
{
	char str[256];
	GetProfileString(sec,key,"",str,128);
	if (str[0]!=0)
		sscanf(str,"%i",&value);
	
	return value;
}

bsp_object *flyEngine::get_active_object(char *name)
{
	bsp_object *o=active_obj0;
	
	while(o)
		{
		if (!stricmp(name,o->name))
			break;
		o=(bsp_object *)o->next_obj;
		}
	
	return o;
}

bsp_object *flyEngine::get_stock_object(char *name)
{
	if (name[0]==0) return 0;
	bsp_object *o=stock_obj0;
	while(o)
		{
		if (!stricmp(name,o->name))
			break;
		o=(bsp_object *)o->next_obj;
		}

	return o;
}

bezier_curve *flyEngine::get_bezier_curve(char *name)
{
	if (name[0]==0) return 0;
	bezier_curve *o=bezier_curve0;
	while(o)
		{
		if (!stricmp(name,o->name))
			break;
		o=(bezier_curve *)o->next_obj;
		}

	if (o==0)
		{
		char tmp[256];
		o=new bezier_curve;
		strcpy(o->name,name);
		strcpy(o->long_name,name);
		strcpy(tmp,flydatapath);
		strcat(tmp,"objects\\");
		strcat(tmp,name);
		if (o->load_bez(tmp)==0)
			{
			delete o;
			return 0;
			}
		o->next_obj=bezier_curve0;
		bezier_curve0=o;
		}

	return o;
}

bezier_patch *flyEngine::get_bezier_patch(char *name)
{
	if (name[0]==0) return 0;
	bezier_patch *o=bezier_patch0;
	while(o)
		{
		if (!stricmp(name,o->name))
			break;
		o=(bezier_patch *)o->next_obj;
		}

	if (o==0)
		{
		char tmp[256];
		o=new bezier_patch;
		strcpy(o->name,name);
		strcpy(o->long_name,name);
		strcpy(tmp,flydatapath);
		strcat(tmp,"objects\\");
		strcat(tmp,name);
		if (o->load_pch(tmp)==0)
			{
			delete o;
			return 0;
			}
		o->next_obj=bezier_patch0;
		bezier_patch0=o;
		}

	return o;
}

mesh *flyEngine::get_model_object(char *name)
{
	if (name[0]==0) return 0;
	mesh *o=model_obj0;
	while(o)
		{
		if (!stricmp(name,o->name))
			break;
		o=(mesh *)o->next_obj;
		}

	if (o==0)
		{
		if (strrchr(name,'.'))
			if (!stricmp(strrchr(name,'.'),".3ds"))
			{
			char tmp[256];
			o=new mesh;
			strcpy(o->name,name);
			strcpy(o->long_name,name);
			strcpy(tmp,flydatapath);
			strcat(tmp,"objects\\");
			strcat(tmp,name);
			if (o->load_3ds(tmp)==0)
				{
				delete o;
				return 0;
				}
			o->next_obj=model_obj0;
			model_obj0=o;
			}
			else
			if (!stricmp(strrchr(name,'.'),".fao"))
			{
			char tmp[256];
			o=new anim_mesh;
			strcpy(o->name,name);
			strcpy(o->long_name,name);
			strcpy(tmp,flydatapath);
			strcat(tmp,"objects\\");
			strcat(tmp,name);
			if (((anim_mesh *)o)->load_fao(tmp)==0)
				{
				delete o;
				return 0;
				}
			o->next_obj=model_obj0;
			model_obj0=o;
			}
		}

	return o;
}

sound *flyEngine::get_sound_object(char *name)
{
	if (name[0]==0) return 0;
	sound *s=sound_obj0;
	while(s)
		{
		if (!stricmp(name,s->name))
			break;
		s=(sound *)s->next_obj;
		}

	if (s==0)
		{
		if (strrchr(name,'.'))
			if (!stricmp(strrchr(name,'.'),".wav"))
			{
			char tmp[256];
			s=new sound;
			strcpy(s->name,name);
			strcpy(s->long_name,name);
			strcpy(tmp,flydatapath);
			strcat(tmp,"sounds\\");
			strcat(tmp,name);
			if (s->load_wav(tmp)==0)
				{
				delete s;
				return 0;
				}
			s->next_obj=sound_obj0;
			sound_obj0=s;
			}
		}

	return s;
}

bsp_object *flyEngine::get_next_stock_object(bsp_object *o,int type)
{
	if (o==0) 
		o=stock_obj0;
	else o=(bsp_object *)o->next_obj;

	while(o)
		{
		if (type==0 || type==o->type)
			break;
		o=(bsp_object *)o->next_obj;
		}
	
	return o;
}

bsp_object *flyEngine::get_next_active_object(bsp_object *o,int type)
{
	if (o==0) 
		o=active_obj0;
	else o=(bsp_object *)o->next_obj;
	
	while(o)
		{

⌨️ 快捷键说明

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