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

📄 game.cpp

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

ship_desc cd_ship;
turret_desc cd_turret;
robot_desc cd_robot;
powerup_desc cd_powerup;
container_desc cd_container;

void init_scene();
void mp_message(int from,mp_msg *msg);

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 5;
}

__declspec( dllexport ) 
class_desc *get_class_desc(int i) 
{
	switch(i) 
	{
	case 0: return &cd_powerup;
	case 1: return &cd_ship;
	case 2: return &cd_turret;
	case 3: return &cd_robot;
	case 4: return &cd_container;
	default: return 0;
	}
}

__declspec( dllexport )
int fly_message(int msg,int param,void *data)
{
	switch(msg)
	{
	case FLYM_DRAWSCENE:
	if (directx->mpmode!=FLYMP_SERVER)
		{
		ship *s=(ship *)(flyengine->cam);
		if (s->flag2)
			{
			vector dir=s->expcam.pos-s->pos;
			dir.normalize();
			s->expcam.pos=s->expcam.pos;
			s->expcam.rotate(s->expcam.Z,dir);
			flyengine->set_camera(&s->expcam);
			flyengine->draw_bsp();
			flyengine->set_camera(s);
			}
		else 
			{
			flyengine->set_camera(s);
			flyengine->draw_bsp();
			}
		}
		break;
	case FLYM_DRAWTEXT:
		((ship *)(flyengine->cam))->draw_game_status();
		break;
	case FLYM_MPUPDATE:
		((ship *)(flyengine->cam))->mp_send_pos(
			FLYMP_MSG_POS,
			0xf|
			((ship *)(flyengine->cam))->flag|
			(((ship *)(flyengine->cam))->points<<16));
		return 0;
	case FLYM_MPMESSAGE:
		mp_message(param,(mp_msg *)data);
		return 0;
	case FLYM_INITSCENE:
		init_scene();
		break;
	case FLYM_CLOSESCENE:
		break;
	}
	return 1;
}

void mp_message(int from,mp_msg *msg)
{	
	switch( msg->type )
		{
		case FLYMP_MSG_POS:
			{
				mp_data *data=(mp_data *)&msg->type;
				ship *s=(ship *)directx->players[from].data;
				if (from>0)
					{
					s->remove_from_bsp();
					s->pos=data->pos;
					s->vel=data->vel;
					s->Y=data->Y;
					s->Z=data->Z;
					s->X.cross(s->Y,s->Z);
					s->flag=data->flag&0xffff;
					s->points=data->flag>>16;
					s->update_mat();
					s->add_to_bsp();
					}
				if (from>=0 && ((data->flag&0xf)!=0xf))
					{
					if (s->g[data->flag&0xf])
						s->g[data->flag&0xf]->fire(s,from);
					if (data->flag&0x10)
						s->speedboost=s->speedboost0;
					else s->speedboost=0;
					}
			}
			break;
		case FLYMP_MSG_DAMAGE:
			{
				mp_data2 *data=(mp_data2 *)&msg->type;
				ship *s=(ship *)directx->players[from].data;
				s->force+=data->v;
				s->shield-=data->f;
				s->lasthittime=flyengine->cur_time;
				s->lasthitfrom=from;
				if (from==0)
					flyengine->filter.x+=data->f>1.0f?1.0f:data->f;
			}
			break;
		case FLYMP_MSG_KILL:
			{
				mp_data *data=(mp_data *)&msg->type;
				ship *s=(ship *)directx->players[from].data;
				s->flag2=s->exptime;
				s->expcam.pos=s->pos;
				s->expcam.node=s->node;
				*((local_system *)&s->expcam)=*((local_system *)s);
				int i;
				for( i=0;i<directx->nplayers;i++ )
					if (directx->players[i].dpid==data->flag)
						break;
				if (from==i)
					if (i==0)
						{
						flyengine->set_status_msg("YOU COMMITTED SUICIDE",directx->players[i].name);
						((ship *)flyengine->cam)->points--;
						}
					else
						flyengine->set_status_msg("%s COMMITTED SUICIDE",directx->players[i].name);
				else
					if (i==0)
						{
						((ship *)flyengine->cam)->points++;
						flyengine->set_status_msg("YOU KILLED %s",directx->players[from].name);
						}
					else 
					if (from==0)
						flyengine->set_status_msg("%s KILLED YOU",directx->players[i].name);
					else 
						flyengine->set_status_msg("%s KILLED %s",directx->players[i].name,directx->players[from].name);
			}
			break;
		case FLYMP_MSG_EXPLODE:
			{
				mp_data *data=(mp_data *)&msg->type;
				ship *s=(ship *)directx->players[from].data;
				if (s->exp) 
					s->exp->do_explode(data->pos,data->Z,from);
				s->flag2--;
				s->remove_from_bsp();
			}
			break;
		case FLYMP_MSG_JOIN:
			{
				player_data *data=(player_data *)&msg->type;
				ship *s=(ship *)flyengine->cam->clone();
				s->pos.null(); s->vel.null(); s->force.null();
				s->player=directx->add_player(data->name,data->dpid,s);
				flyengine->set_status_msg("%s HAS JOINED THE GAME",data->name);
				flyengine->activate(s,(directx->mpmode==FLYMP_SERVER));
				if (directx->mpmode==FLYMP_SERVER)
				{
					powerup *p=0;
					while( p=(powerup *)flyengine->get_next_active_object(p,TYPE_POWERUP) )
					{
						static mp_data d;
						d.type=FLYMP_MSG_POWERUPMOVE;
						d.dpid=DPID_SERVERPLAYER;
						d.flag=p->valuetype;
						d.pos=p->pos;
						directx->send_message((mp_msg *)&d,sizeof(mp_data),data->dpid);
					}
				}
			}
			break;
		case FLYMP_MSG_QUIT:
			{
				player_data *data=(player_data *)&msg->type;
				if (from<directx->nplayers)
					{
					flyengine->set_status_msg("%s HAS LEFT THE GAME",directx->players[from].name);
					bsp_object *obj=(bsp_object *)directx->remove_player(from);
					for( int i=from;i<directx->nplayers;i++ )
						((ship *)directx->players[i].data)->player=i;
					if (obj) obj->life=-1;
					}
			}
			break;
		case FLYMP_MSG_POWERUPMOVE:
			{
				mp_data *data=(mp_data *)&msg->type;
				powerup *p=0;
				while(p=(powerup *)flyengine->get_next_active_object(p,TYPE_POWERUP))
					if (p->valuetype==(int)data->flag)
						break;
				if (p)
					{
					p->pos=data->pos;
					p->life=p->source->life;
					}
			}
			break;
		case FLYMP_MSG_POWERUPGET:
			{
				mp_data *data=(mp_data *)&msg->type;
				powerup *p=0;
				while(p=(powerup *)flyengine->get_next_active_object(p,TYPE_POWERUP))
					if (p->valuetype==(int)data->flag)
						break;
				if (p)
					p->powerup_get((ship *)directx->players[from].data);
			}
			break;
		}
}

void missile_find(void *data,bsp_object *e)
{
	static vector v,hitip;
	static float f;
	static int hitface;
	missile *t=(missile *)data;

	if (e->type==TYPE_SHIP || (e->type==TYPE_ROBOT && t->player!=-1))
		{
		if (e->type==TYPE_SHIP && t->player==((ship *)e)->player)
			return;
		v=e->pos-t->pos;
		f=v.length();
		if (f<t->lookrange && f<t->enemydist)
			{
			v/=f;
			if (vec_dot(v,t->Z)<t->lookangle)
				return;
			
			if (flyengine->collision_test(flyengine->bsp,t->pos,e->pos,TYPE_STATIC_MESH))
				return;

			t->enemydist=f;
			t->enemy=e;
			}
		}
}

void mine_find(void *data,bsp_object *e)
{
	static vector v,hitip;
	static float f;
	static int hitface;
	mine *t=(mine *)data;

	if (e->type==TYPE_SHIP || (e->type==TYPE_ROBOT && t->player!=-1) )
		{
		v=e->pos-t->pos;
		f=v.length();
		if (f<t->lookrange && f<t->enemydist)
			{
			v/=f;
			if (flyengine->collision_test(flyengine->bsp,t->pos,e->pos,TYPE_STATIC_MESH))
				{
				flyengine->excludecollision=0;
				return;
				}

			t->enemydist=f;
			t->enemy=e;
			}
		}
}

void init_scene()
{
	bsp_object *obj;

	obj=0;
	while( obj=flyengine->get_next_stock_object(obj,TYPE_MINE) )
		if (((mine *)obj)->lookrange!=0.0f)
			((mine *)obj)->mine_find=mine_find;
	obj=0;
	while( obj=flyengine->get_next_stock_object(obj,TYPE_MISSILE) )
		if (((missile *)obj)->lookrange!=0.0f)
			((missile *)obj)->missile_find=missile_find;
}

⌨️ 快捷键说明

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