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

📄 mine.cpp

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

int mine::step(int dt)
{
	if (delay>0)
		{
		delay-=dt;
		return 0;
		}

	life-=dt;

	if(lookrange&&mine_find)
		{
		enemy=0;
		enemydist=lookrange;
		flyengine->apply_bsp(flyengine->bsp,pos,lookrange,this,mine_find);
		if (enemy)
			life=-1;
		}

	if (life<0 || shield<0)
		{
		life=-1;
		if (exp)
			exp->do_explode(pos,Z,player);
		return 0;
		}

	if ((life%1000)>500)
		factor=(1000-(life%1000))/500.0f;
	else factor=(life%1000)/500.0f;

	if (l)
		{
		l->pos=pos;
		l->illum_radius=lookrange*factor;
		l->step(dt);
		}
	
	if (snd)
		snd->step(dt);
	
	return 0;
}

void mine::draw()
{
	if (flyengine->cam==this) 
		return;

	if (objmesh)
	{
	static float d;
	if ((flyengine->cur_time%1000)>500)
		d=(250-(flyengine->cur_time%500))/500.0f;
	else d=((flyengine->cur_time%500)-250)/500.0f;
	d=(objmesh->bbox.max.z-objmesh->bbox.min.z)*d;
	if (node)
		{
		objmesh->color=node->color+dynlight;
		dynlight.null();
		}
	glPushMatrix();
	glTranslatef(pos.x,pos.y,pos.z);
	glMultMatrixf((float *)&mat);
	objmesh->draw();
	glPopMatrix();
	}

	if (s)
		{
		s->curradius=lookrange*factor;
		s->pos=pos;
		s->draw();
		}

	if (l)
		{
		l->pos=pos;
		l->draw();
		}
}

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

int mine::get_custom_param_desc(int i,param_desc *pd)
{
	if (pd!=0)
	switch(i)
	{
		case 0:
			pd->type='f';
			pd->data=&lookrange;
			strcpy(pd->name,"lookrange");
			break;
		case 1:
			pd->type=TYPE_EXPLODE;
			pd->data=&exp;
			strcpy(pd->name,"explode");
			break;
		case 2:
			pd->type=TYPE_LIGHT;
			pd->data=&l;
			strcpy(pd->name,"light");
			break;
		case 3:
			pd->type=TYPE_SOUND;
			pd->data=&snd;
			strcpy(pd->name,"sound");
			break;
		case 4:
			pd->type='3';
			pd->data=&objmesh;
			strcpy(pd->name,"mesh");
			break;
		case 5:
			pd->type=TYPE_EXP_SPHERE;
			pd->data=&s;
			strcpy(pd->name,"expsphere");
			break;
		case 6:
			pd->type='i';
			pd->data=&delay;
			strcpy(pd->name,"delay");
			break;
		case 7:
			pd->type='f';
			pd->data=&shield;
			strcpy(pd->name,"shield");
			break;
	}
	return 8;
}

void mine::fire(vector& p,vector& dir,float v,int playerid)
{
	mine *m=(mine *)clone();
	m->pos=p;
	m->vel=dir*v;
	m->align_z(dir);
	m->player=playerid;
	if (m->snd)
		{
		m->snd=(dyn_sound *)m->snd->clone();
		m->snd->lockpos=&m->pos;
		m->snd->lockvel=&m->vel;
		m->snd->step(0);
		}
	flyengine->activate(m);
}

mesh *mine::ray_intersect(vector& ro,vector& rd,vector& ip,float& dist,int &facenum,float rad)
{
	if (objmesh==0)
		return 0;
	
	facenum=objmesh->ray_intersect(ro-pos,rd,ip,dist,rad);
	
	if (facenum!=-1)
		{
		if (flyengine->stepobj && 
			(flyengine->stepobj->type==TYPE_LASER || flyengine->stepobj->type==TYPE_MISSILE) 
			&& dist<1.0f && ((gun_projectile *)flyengine->stepobj)->damage>0.0f)
			shield-=((gun_projectile *)flyengine->stepobj)->damage;
		ip=ip+pos;
		return objmesh;
		}
	else 
		return 0;
}

int mine::message(vector& p,float rad,int msg,int param,void *data)
{
	if (msg==FLYOBJM_DAMAGE)
	{
		vector v=pos-p;
		float len=v.length();
		if (len>rad)
			return 0;

		flyengine->excludecollision=this;
		if(flyengine->collision_test(flyengine->bsp, p, pos))
			return 0;
		flyengine->excludecollision=0;
		
		shield-=*((float *)data)*(1-len/rad);
	}
	else
	if (msg==FLYOBJM_ILLUM)
	{
		float fac=(p-pos).length()/rad;
		if (fac<1.0f)
			dynlight+=*((vector *)data)*(1.0f-fac);
	}

	return 0;
}

⌨️ 快捷键说明

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