📄 observer.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 + -