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

📄 observer.cpp

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

observer_desc cd_observer;

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

__declspec( dllexport )
class_desc *get_class_desc(int i)
{
	switch(i)
	{
	case 0:
		return &cd_observer;
	default: return 0;
	}
}

__declspec( dllexport )
int fly_message(int msg,int param,void *data)
{
	switch(msg)
	{
	case FLYM_UPDATESCENE:
		// step plugin (dt in param)
		break;
	case FLYM_DRAWSCENE:
		flyengine->set_camera(flyengine->cam);
		flyengine->draw_bsp();
		break;
	case FLYM_DRAWTEXT:
		{
		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_INITSCENE:
		// draw 2d plugin
		break;
	case FLYM_CLOSESCENE:
		// draw 2d plugin
		break;
	}
	return 1;
}

void observer::init()
{
	if (flyengine->get_random_point(pos,10)==0)
		pos.null();
}

int observer::step(int dt)
{
	if (node==0)
		add_to_bsp();

	check_keys(dt);

	float len=vel.length();
	if (len<0.01f)
		vel.null();
	else
	{
		vel/=len;
		len-=dt*veldamp;
		if (len>maxvel)
			len=maxvel;
		if (len<0.0f)
			len=0.0f;
		vel*=len;
	}

	life=dt;
	return particle::step(dt);
}


void observer::check_keys(int dt)
{
	unsigned char *diks=directx->diks;

	static int lastmouse[2][2]={ { 0,0 },{ 0,0 } },lm=0;
	float mousedx=(directx->dims.lX+lastmouse[0][0]+lastmouse[1][0])/3.0f;
	float mousedy=(directx->dims.lY+lastmouse[0][1]+lastmouse[1][1])/3.0f;
	lastmouse[lm][0]=directx->dims.lX;
	lastmouse[lm][1]=directx->dims.lY;
	lm=!lm;
	
	if (diks[0x38])	// ALT key
		{
		if (diks[0xcb])		// left arrow
			vel-=X*(moveforce*dt);

		if (diks[0xcd])		// right arrow
			vel+=X*(moveforce*dt);

		if (diks[0xc8])		// up arrow
			vel+=Y*(moveforce*dt);

		if (diks[0xd0])		// down arrow
			vel-=Y*(moveforce*dt);

		if (diks[0x1f])		// S key
			vel-=Z*(moveforce*dt);

		if (diks[0x2d])		// X key
			vel+=Z*(moveforce*dt);
		}
	else
		{
		if (diks[0xc8])	// up arrow
			rotate(-dt*rotvel,X);
		
		if (diks[0xd0])	// down arrow
			rotate(dt*rotvel,X);

		if (diks[0xcb])	// left arrow
			rotate(dt*rotvel,Y);

		if (diks[0xcd])	// right arrow
			rotate(-dt*rotvel,Y);

		if (diks[0x10])	// Q key
			vel-=X*(moveforce*dt);

		if (diks[0x12])	// E key
			vel+=X*(moveforce*dt);

		if (diks[0x1f])	// S key
			vel-=Z*(moveforce*dt);

		if (diks[0x2d])	// X key
			vel+=Z*(moveforce*dt);
		}

	if (diks[0x1e])		// A key
		rotate(dt*rotvel,Z);
	if (diks[0x20])		// D key
		rotate(-dt*rotvel,Z);

	if (mousedx)	// mouse X
		rotate(-mousedx*mousevel,Y);

	if (mousedy)	// mouse Y
		rotate(mousedy*mousevel,X);
}

void observer::draw()
{
}

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

int observer::get_custom_param_desc(int i,param_desc *pd)
{
	if (pd!=0)
	switch(i)
	{
	case 0:
		pd->type='f';
		pd->data=&rotvel;
		strcpy(pd->name,"rotvel");
		break;
	case 1:
		pd->type='f';
		pd->data=&mousevel;
		strcpy(pd->name,"mousevel");
		break;
	case 2:
		pd->type='f';
		pd->data=&moveforce;
		strcpy(pd->name,"moveforce");
		break;
	case 3:
		pd->type='f';
		pd->data=&maxvel;
		strcpy(pd->name,"maxvel");
		break;
	case 4:
		pd->type='f';
		pd->data=&veldamp;
		strcpy(pd->name,"veldamp");
		break;
	}
	return 5;
}


⌨️ 快捷键说明

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