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

📄 laser.cpp

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

int laser::step(int dt)
{
	if (node==0)
	{
		life=-1;
		return 0;
	}
		
	flyengine->hitobj=0;
	if (player>=0)
		flyengine->excludecollision=(bsp_object *)directx->players[player].data;
	particle::step(dt);
	flyengine->excludecollision=0;

	if (flyengine->hitobj || life<=0)
		{
		life=-1;
		if (flyengine->hitobj==0)
			if (exp)
				exp->do_explode(pos,Z,player);
			else ;
		else
			{
			pos=flyengine->hitip+flyengine->hitmesh->faces[flyengine->hitface]->normal;
			if (hm && flyengine->hitmesh->localfaces==0)
				{
				hitmark *tmp=(hitmark *)hm->clone();
				tmp->pos=pos;
				tmp->mode=0;
				tmp->align_z(flyengine->hitmesh->faces[flyengine->hitface]->normal);
				flyengine->activate(tmp);
				}
			if (exp)
				exp->do_explode(pos,flyengine->hitmesh->faces[flyengine->hitface]->normal,player);
			}
		}

	if (s)
	{
	vector v=pos-startpos;
	float t=v.length();
	if (t-slast>sfact)
		{	
		v/=t;
		int i=(int)(t/sfact);
		int j=(int)(slast/sfact);
		for( ;j<i;j++ )
			{
			sprite_light *tmp=(sprite_light *)s->clone();
			tmp->pos=startpos+v*(sfact*j);
			tmp->align_z(Z);
			flyengine->activate(tmp);
			}
		slast=t;
		}	
	}

	if (l)
		{
		l->pos=pos;
		l->step(dt);
		}

	force.x=force.y=force.z=0;

	return 1;
}

void laser::draw()
{
	if (node==0 || flyengine->cam==this) 
		return;
	static vector v;

	glDepthMask(GL_FALSE);
	glBlendFunc(GL_ONE,GL_ONE);
	glDisable(GL_CULL_FACE);
	glDisable(GL_FOG);
	glColor4f(1,1,1,1);

	if (fronttexture==-1)
		{
		if (sidetexture!=-1)
			{
			tc->use(sidetexture);
			v=pos-flyengine->cam->pos;
			X.cross(v,Z);
			X.normalize();
			glBegin(GL_QUADS);
			glTexCoord2f(1,1);
			glVertex3f(
				startpos.x-sizetexture*X.x,
				startpos.y-sizetexture*X.y,
				startpos.z-sizetexture*X.z);
			glTexCoord2f(0,1);
			glVertex3f(
				startpos.x+sizetexture*X.x,
				startpos.y+sizetexture*X.y,
				startpos.z+sizetexture*X.z);
			glTexCoord2f(0,0);
			glVertex3f(
				pos.x+sizetexture*X.x,
				pos.y+sizetexture*X.y,
				pos.z+sizetexture*X.z);
			glTexCoord2f(1,0);
			glVertex3f(
				pos.x-sizetexture*X.x,
				pos.y-sizetexture*X.y,
				pos.z-sizetexture*X.z);
			glEnd();
			}
		}
	else
		{
		tc->use(fronttexture);
		X=flyengine->cam->X*sizetexture;
		Y=flyengine->cam->Y*sizetexture;
		if (sidetexture!=-1)
			v=Z*sizetexture;
		else v.x=v.y=v.z=0.0f;
		glBegin(GL_QUADS);
		glTexCoord2f(0,0);
		glVertex3f(
			pos.x-Y.x-X.x+v.x,
			pos.y-Y.y-X.y+v.y,
			pos.z-Y.z-X.z+v.z);
		glTexCoord2f(0,1);
		glVertex3f(
			pos.x+Y.x-X.x+v.x,
			pos.y+Y.y-X.y+v.y,
			pos.z+Y.z-X.z+v.z);
		glTexCoord2f(1,1);
		glVertex3f(
			pos.x+Y.x+X.x+v.x,
			pos.y+Y.y+X.y+v.y,
			pos.z+Y.z+X.z+v.z);
		glTexCoord2f(1,0);
		glVertex3f(
			pos.x-Y.x+X.x+v.x,
			pos.y-Y.y+X.y+v.y,
			pos.z-Y.z+X.z+v.z);
		glEnd();

		sizetexture*=2.0f;
		if (sidetexture!=-1)
			{
			v=pos-flyengine->cam->pos;
			X.cross(v,Z);
			X.normalize();
			X.x*=0.5f; X.y*=0.5f; X.z*=0.5f;

			tc->use(sidetexture);

			glBegin(GL_QUADS);
			glTexCoord2f(1,1);
			glVertex3f(
				pos.x-sizetexture*(Z.x+X.x),
				pos.y-sizetexture*(Z.y+X.y),
				pos.z-sizetexture*(Z.z+X.z));
			glTexCoord2f(1,0);
			glVertex3f(
				pos.x+sizetexture*(Z.x-X.x),
				pos.y+sizetexture*(Z.y-X.y),
				pos.z+sizetexture*(Z.z-X.z));
			glTexCoord2f(0,0);
			glVertex3f(
				pos.x+sizetexture*(Z.x+X.x),
				pos.y+sizetexture*(Z.y+X.y),
				pos.z+sizetexture*(Z.z+X.z));
			glTexCoord2f(0,1);
			glVertex3f(
				pos.x-sizetexture*(Z.x-X.x),
				pos.y-sizetexture*(Z.y-X.y),
				pos.z-sizetexture*(Z.z-X.z));
			glEnd();
			}
		sizetexture*=0.5f;
		}

	glDepthMask(GL_TRUE);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	if (flyengine->fog) glEnable(GL_FOG);
	glEnable(GL_CULL_FACE);
	if (l)
		{
		l->pos=pos;
		l->draw();
		}	
}

bsp_object *laser::clone()
{
	laser *tmp=new laser;
	*tmp=*this;
	tmp->source=this;
	return tmp;
}

int laser::get_custom_param_desc(int i,param_desc *pd)
{
	if (pd!=0)
	switch(i)
	{
		case 0:
			pd->type='f';
			pd->data=&sizetexture;
			strcpy(pd->name,"sizetexture");
			break;
		case 1:
			pd->type='p';
			pd->data=&fronttexture;
			strcpy(pd->name,"fronttexture");
			break;
		case 2:
			pd->type='p';
			pd->data=&sidetexture;
			strcpy(pd->name,"sidetexture");
			break;
		case 3:
			pd->type=TYPE_EXPLODE;
			pd->data=&exp;
			strcpy(pd->name,"explode");
			break;
		case 4:
			pd->type=TYPE_LIGHT;
			pd->data=&l;
			strcpy(pd->name,"light");
			break;
		case 5:
			pd->type=TYPE_SPRITE_LIGHT;
			pd->data=&s;
			strcpy(pd->name,"sprite");
			break;
		case 6:
			pd->type='f';
			pd->data=&sfact;
			strcpy(pd->name,"spritefactor");
			break;
		case 7:
			pd->type=TYPE_HITMARK;
			pd->data=&hm;
			strcpy(pd->name,"hitmark");
			break;
		case 8:
			pd->type='f';
			pd->data=&damage;
			strcpy(pd->name,"damage");
			break;
	}
	return 9;
}

void laser::fire(vector& p,vector& dir,float v,int playerid)
{
	laser *m=(laser *)clone();
	m->startpos=m->pos=p;
	m->vel=dir*v;
	m->align_z(dir);
	m->player=playerid;
	flyengine->activate(m);
}

⌨️ 快捷键说明

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