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

📄 car.cpp

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

void mp_message(int from,mp_msg *msg);

camera_desc cd_camera;
car_desc cd_car;
sun_desc cd_sun;

BOOL APIENTRY DllMain(HINSTANCE hModule, 
                      DWORD  ul_reason_for_call, 
                      LPVOID lpReserved)
{    
	switch( ul_reason_for_call ) 
	{
    case DLL_PROCESS_ATTACH:
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}

__declspec( dllexport )
int num_classes()
{
	return 3;
}

__declspec( dllexport )
class_desc *get_class_desc(int i)
{
	switch(i)
	{
	case 0:
		return &cd_camera;
	case 1:
		return &cd_car;
	case 2:
		return &cd_sun;
	default: 
		return 0;
	}
}

__declspec( dllexport )
int fly_message(int msg,int param,void *data)
{
	switch(msg)
	{
	case FLYM_DRAWSCENE:
		if (directx->mpmode!=FLYMP_SERVER)
		{
		// sets view
		flyengine->set_camera(flyengine->cam);
		
		// draws the sun 
		if (flyengine->cam->type==TYPE_CAMERA)
			if (((camera *)flyengine->cam)->s) 
				((camera *)flyengine->cam)->s->draw();

		// draws the scene
		flyengine->draw_bsp(1);

		// draw stencil shadow filter polygon
		if (flyengine->stencil)
			{
			flyengine->start_text_mode();
			glEnable(GL_STENCIL_TEST);
			glStencilFunc(GL_NOTEQUAL,0,~0);
			glColor3fv(&flyengine->shadowcolor.x);
			glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);
			glBlendFunc(GL_ZERO, GL_SRC_COLOR);
			glRecti(0, 0, screen_sx, screen_sy);
			glDisable(GL_STENCIL_TEST);
			}
		}
		break;
	case FLYM_DRAWTEXT:
		if (directx->mpmode!=FLYMP_SERVER)
		{
		static DWORD t=timeGetTime();
		static int frame_rate=0,frame_count=0;
		static char str[256];
		frame_count++;
		if (flyengine->cur_time-t>1000)
			{
			frame_rate=frame_count*1000/(flyengine->cur_time-t);
			t=flyengine->cur_time;
			frame_count=0;
			}
		if (flyengine->cur_time - flyengine->status_msg_time > 2000)
			{
			sprintf(str,"FPS:%i N:%i",frame_rate,flyengine->nodedrawcount);
			flyengine->draw_text( screen_sx-96, 0, str );
			}
		}
		break;
	case FLYM_UPDATESCENE:
		{
		bsp_object *obj=0;
		while(obj=flyengine->get_next_active_object(obj,TYPE_CAR))
			if (obj==flyengine->player)
				((car *)obj)->check_keys(param);
			else if (((car *)obj)->player==0)
					((car *)obj)->check_robot_keys(param);
		}
		break;
	case FLYM_MPUPDATE:
		((car *)flyengine->player)->mp_send_pos(FLYMP_MSG_POS,0);
		return 0;
	case FLYM_MPMESSAGE:
		mp_message(param,(mp_msg *)data);
		return 0;
	}
	return 1;
}

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

int car::get_custom_param_desc(int i,param_desc *pd)
{
	if (pd!=0)
	switch(i)
	{
	case 0:
		pd->type='f';
		pd->data=&maxvel;
		strcpy(pd->name,"maxvel");
		break;
	case 1:
		pd->type='f';
		pd->data=&accel;
		strcpy(pd->name,"accel");
		break;
	case 2:
		pd->type='v';
		pd->data=&veldamp;
		strcpy(pd->name,"veldamp");
		break;
	case 3:
		pd->type='f';
		pd->data=&carwheelrot;
		strcpy(pd->name,"carwheelrot");
		break;
	case 4:
		pd->type='f';
		pd->data=&carheight;
		strcpy(pd->name,"carheight");
		break;
	case 5:
		pd->type='f';
		pd->data=&wheelmaxrot;
		strcpy(pd->name,"wheelmaxrot");
		break;
	case 6:
		pd->type='f';
		pd->data=&wheelrotvel;
		strcpy(pd->name,"wheelrotvel");
		break;
	case 7:
		pd->type='f';
		pd->data=&wheelrotdamp;
		strcpy(pd->name,"wheelrotdamp");
		break;
	case 8:
		pd->type='f';
		pd->data=&wheelradius;
		strcpy(pd->name,"wheelradius");
		break;
	case 9:
		pd->type='f';
		pd->data=&gravity;
		strcpy(pd->name,"gravity");
		break;
	case 10:
		pd->type='3';
		pd->data=&carmesh;
		strcpy(pd->name,"carmesh");
		break;
	case 11:
		pd->type='3';
		pd->data=&wheelmesh;
		strcpy(pd->name,"wheelmesh");
		break;
	case 12:
		pd->type='v';
		pd->data=&wheelposft;
		strcpy(pd->name,"wheelposft");
		break;
	case 13:
		pd->type='v';
		pd->data=&wheelposbk;
		strcpy(pd->name,"wheelposbk");
		break;
	case 14:
		pd->type='z';
		pd->data=&track;
		strcpy(pd->name,"track");
		break;
	case 15:
		pd->type=TYPE_SHADOW;
		pd->data=&carshadow;
		strcpy(pd->name,"carshadow");
		break;
	}
	return 16;
}

void car::init()
{
	static vector delta(0,0,0);
	if (source)
		{
		pos=source->pos+delta;
		delta.z+=1000;
		}
	align_z(vector(0,0,1));
	rotate(rot);

	if (track)
		totaltracktime=(int)(track->length()/maxvel);

	if (wheelmesh && wheelmesh->edges==0)
		wheelmesh->compute_normals(MESH_EDGES);
	if (carmesh && carmesh->edges==0)
		carmesh->compute_normals(MESH_EDGES);
}

void car::draw()
{
	static light_vertex lights;
	static vector viewpos,color,lightpos,v;

	sun *s=0;
	if (flyengine->cam->type==TYPE_CAMERA)
		s=((camera *)flyengine->cam)->s;

	if(carshadow && flyengine->stencil==0)
		{
		carshadow->reposition(this);
		carshadow->draw();
		}

	if (carmesh && wheelmesh)
	{
		lights.nlights=0;
		if (s)
			{
			lightpos=(s->pos-pos)*mat_t;
			color=s->color;
			lights.add_light(lightpos,color,0);
			}
		else 
			{
			lightpos.null();
			color.vec(1,1,1);
			}

		static mat4x4 m1,m2;
		m1.set_rotation(-wheelroll,vector(1,0,0));
		m2.set_rotation(-wheelrot,vector(0,1,0));
		m2=m2*m1;

		viewpos=(flyengine->cam->pos-pos)*mat_t;
		float f=viewpos.length()/flyengine->viewmaxdist;
		if (f<1.0f)
			f=(1.0f-f)*flyengine->cartoonwidth;
		else f=0.0f;

		glPushMatrix();
		glTranslatef(pos.x,pos.y,pos.z);
		glMultMatrixf((float *)&mat);
		carmesh->draw_cartoon(viewpos,color,lights,f);

		v=viewpos*m1;
		lights.pos[0]=lightpos*m1;
		
		glPushMatrix();
		glTranslatef(wheelposbk.x,wheelposbk.y,wheelposbk.z);
		glRotatef(wheelroll,1,0,0);
		wheelmesh->draw_cartoon(v,color,lights,f);
		glPopMatrix();

		glPushMatrix();
		glTranslatef(-wheelposbk.x,wheelposbk.y,wheelposbk.z);
		glRotatef(wheelroll,1,0,0);
		wheelmesh->draw_cartoon(v,color,lights,f);
		glPopMatrix();

		v=viewpos*m2;
		lights.pos[0]=lightpos*m2;

		glPushMatrix();
		glTranslatef(wheelposft.x,wheelposft.y,wheelposft.z);
		glRotatef(wheelrot,0,1,0);
		glRotatef(wheelroll,1,0,0);
		wheelmesh->draw_cartoon(v,color,lights,f);
		glPopMatrix();

		glPushMatrix();
		glTranslatef(-wheelposft.x,wheelposft.y,wheelposft.z);
		glRotatef(wheelrot,0,1,0);
		glRotatef(wheelroll,1,0,0);
		wheelmesh->draw_cartoon(v,color,lights,f);
		glPopMatrix();

		glPopMatrix();
	}
	if (flyengine->stencil && s)
		draw_stencil_shadow(lightpos);
}

void car::draw_stencil_shadow(vector& lightpos)
{
	// compute light direction
	vector lightdir=lightpos-pos;
	lightdir.normalize();
	lightdir*=flyengine->shadowdepth;

	// set current car pos and rotation
	glPushMatrix();
	glTranslatef(pos.x,pos.y,pos.z);
	glMultMatrixf((float *)&mat);

	// draw body shadow
	carmesh->draw_shadow_volume(lightdir);

	// draw back right wheel shadow
	glPushMatrix();
	glTranslatef(wheelposbk.x,wheelposbk.y,wheelposbk.z);
	wheelmesh->draw_shadow_volume(lightdir);
	glPopMatrix();

	// draw back left wheel shadow
	glPushMatrix();
	glTranslatef(-wheelposbk.x,wheelposbk.y,wheelposbk.z);
	wheelmesh->draw_shadow_volume(lightdir);
	glPopMatrix();

	// compute front wheel rotation 
	static mat4x4 m;
	m.set_rotation(-wheelrot,vector(0,1,0));
	lightdir=lightdir*m;

	// draw front right wheel shadow
	glPushMatrix();
	glTranslatef(wheelposft.x,wheelposft.y,wheelposft.z);
	glRotatef(wheelrot,0,1,0);
	wheelmesh->draw_shadow_volume(lightdir);
	glPopMatrix();

	// draw front left wheel shadow
	glPushMatrix();
	glTranslatef(-wheelposft.x,wheelposft.y,wheelposft.z);
	glRotatef(wheelrot,0,1,0);
	wheelmesh->draw_shadow_volume(lightdir);
	glPopMatrix();

	glPopMatrix();
}

int car::step(int dt)
{
	static vector p,v;

	// if no contact, apply gravity
	if (!contactobj)
		vel.z-=gravity*dt;

	// apply damping to the steering
	if (wheelrot>=0.0f)
		{
		wheelrot-=wheelrotdamp*dt;
		if (wheelrot<0.0f)
			wheelrot=0.0f;
		if (wheelrot>wheelmaxrot)
			wheelrot=wheelmaxrot;
		}
	else
		{
		wheelrot+=wheelrotdamp*dt;
		if (wheelrot>0.0f)
			wheelrot=0.0f;
		if (wheelrot<-wheelmaxrot)
			wheelrot=-wheelmaxrot;
		}

	float len=vel.length();
	// if moving
	if (len>0.01f)

⌨️ 快捷键说明

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