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

📄 flyconsole.cpp

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

console::console()
{
	memset(buf,0,sizeof(char *)*CONSOLE_MAX_LINES);
	nlines=0;
	cmd_line[0]=0;
	cmd_pos=0;
	mode=0;
	winlines=0;
	time=0;
	linecount=0;
}

console::~console()
{
	int i;
	for( i=0;i<nlines;i++ )
		if (buf[i])
			delete buf[i];
}

void console::step(int dt)
{
	time-=dt;
	if (time<0)
	{
		time=20;
		if (mode>0)
		{
			if (winlines<CONSOLE_LIN/3)
				winlines++;
		}
		else if (mode<0)
		{
			if (winlines>0)
				winlines--;
			if (winlines==0)
			{
				mode=0;
				flyengine->noinput=0;
			}
		}
	}
}

void console::show()
{
	mode=1;
	flyengine->noinput=1;
	cmd_line[cmd_pos=0]=0;
}

void console::hide()
{
	mode=-1;
	cmd_line[cmd_pos=0]=0;
}

void console::add_string(char *fmt, ...)
{
    static char str[256];

    va_list va;
    va_start( va, fmt );
    wvsprintf( str, fmt, va );
    va_end( va );
	strupr( str );

	if (nlines==CONSOLE_MAX_LINES)
		delete buf[--nlines];
	memmove(&buf[1],&buf[0],sizeof(char *)*nlines);
	int len=strlen(str);
	buf[0]=new char[len+1];
	memcpy(buf[0],str,len+1);
	nlines++;
	linecount++;
}

void console::draw()
{
	int i;
	float f1,f2;

	dx=(float)screen_sx/CONSOLE_COL;
	dy=(float)screen_sy/CONSOLE_LIN;

	f1=CONSOLE_LIN/3*dy;
	f2=winlines*dy;

	glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
	tc->use(flyengine->consolepic);
	glBegin(GL_QUADS);
		glTexCoord2f(1,0);
		glVertex2f((float)screen_sx,screen_sy+(f1-f2));
		glTexCoord2f(0,0);
		glVertex2f(0,screen_sy+(f1-f2));
		glTexCoord2f(0,1);
		glVertex2f(0,screen_sy-f2-4);
		glTexCoord2f(1,1);
		glVertex2f((float)screen_sx,screen_sy-f2-4);
	glEnd();

	glBlendFunc(GL_ONE,GL_ONE);
	tc->use(flyengine->fontspic);
	for( i=0;i<winlines-1;i++ )
		if (winlines-i-2<nlines)
			draw_text(dx,i*dy,buf[winlines-i-2]);

	f1=(float)draw_text(dx,i*dy,cmd_line)+1;

	tc->use(-1);
	unsigned char uc=abs((flyengine->cur_time%500)-250);
	glColor3ub(uc,uc,uc);
	glBegin(GL_QUADS);
		glVertex2f(f1,screen_sy-i*dy-dy);
		glVertex2f(f1+dx/8,screen_sy-i*dy-dy);
		glVertex2f(f1+dx/8,screen_sy-i*dy);
		glVertex2f(f1,screen_sy-i*dy);
	glEnd();
}

float console::draw_text(float x,float y,char *text)
{
	int len=strlen(text),i;
	float xx,yy,xy=1.0f/FONTS_NUM;

	y=screen_sy-y-dy;

	for( i=0;i<len;i++ )
		if (text[i]>=32 && text[i]<96)
		{
		xx=((text[i]-32)%FONTS_NUM)*xy;
		yy=((text[i]-32)/FONTS_NUM)*xy;

		glBegin(GL_QUADS);
		glTexCoord2f(xx+xy,yy+xy);
		glVertex2f(x+dx,y);

		glTexCoord2f(xx+xy,yy);
		glVertex2f(x+dx,y+dy);

		glTexCoord2f(xx,yy);
		glVertex2f(x,y+dy);

		glTexCoord2f(xx,yy+xy);
		glVertex2f(x,y);
		glEnd();

		x+=flyengine->fonts_width[text[i]-32]*dx/FONTS_SIZE;
		}
	
	return x;
}

void console::key_press(int key)
{
	if (key==VK_ESCAPE)
		if (mode==0)
			show();
		else hide();
	else 
	if (key==VK_RETURN)
		{
			command_exec(cmd_line);
			cmd_line[0]=0;
			cmd_pos=0;
		}
	else
	if (key==8)
		{
			if (cmd_pos>0)
				cmd_line[--cmd_pos]=0;
		}
	else
	if (mode)
	{
		if (key>='a' && key<='z')
			key-='a'-'A';
		if (key>=32 && key<96 && cmd_pos<80) 
		{
			cmd_line[cmd_pos++]=key;
			cmd_line[cmd_pos]=0;
		}
	}
}

int console::command_tokens(char *str,char **token)
{
	int ntoken=0;

	do
	{
	while( *str==' ' )
		*(str++)=0;
	if (*str==0)
		break;
	token[ntoken]=str;

	str=strchr(str,' ');
	if (token[ntoken][0]=='(')
		{
		token[ntoken]++;
		str=strchr(token[ntoken],')');
		if (str)
			*(str++)=0;
		}
	if (token[ntoken][0]=='\"')
		{
		token[ntoken]++;
		str=strchr(token[ntoken],'\"');
		if (str)
			*(str++)=0;
		}

	ntoken++;
	}while(str);

	return ntoken;
}

void console::command_exec(char *str) 
{
	char *token[256],buf[256];
	int ntoken;
	int i,j,k;

	strcpy(buf,">");
	strcat(buf,str);
	add_string(buf);
	strlwr(buf);

	ntoken=command_tokens(&buf[1],token);

	if (ntoken==0)
		{
		add_string("Invalid command!");
		return;
		}

	if (!strcmp(token[0],"help") || token[0][0]=='?')
		{
		add_string("commands:");
		add_string(" get [ varname | objname.objparam ]");
		add_string(" set [ varname | objname.objparam ] val");
		add_string(" map [ path/level.fly ]");
		add_string(" connect");
		add_string(" save");
		add_string(" reinit");
		add_string(" list [ \"plugins\" | \"classes\" | classname | objname ]");
		add_string(" create classname objname");
		add_string(" destroy objname");
		add_string(" activate objname");
		add_string(" insert plugin.dll");
		add_string(" remove plugin.dll");
		add_string(" exec commandline");
		add_string(" quit");
		}
	else
	if (!strcmp(token[0],"map"))
	{
		if (ntoken==1)
			add_string("map: %s",flyengine->flyfile[0]==0?"(none)":flyengine->flyfile);
		else
			{
			flyengine->close_multiplayer();
			flyengine->open_fly_file(token[1]);
			add_string("map: %s",flyengine->flyfile[0]==0?"(none)":flyengine->flyfile);
			}
	}
	else
	if (!strcmp(token[0],"quit"))
		{
		DestroyWindow(hFlyWnd);
		}
	else
	if (!strcmp(token[0],"exec"))
		{
		char c[256];
		strcpy(c,flyengine->flysdkpath);
		strcat(c,token[1]);
		WinExec(c,SW_SHOW);
		}
	else
	if (!strcmp(token[0],"connect"))
		{
		flyengine->join_multiplayer();
		add_string("map: %s",flyengine->flyfile[0]==0?"(none)":flyengine->flyfile);
		}
	else
	if (!strcmp(token[0],"insert"))
		{
		if (ntoken==1)
			add_string("Missing parameters!");
		else
		{
			i=flyengine->dll.add_dll(token[1]);
			if (i==-1)
				add_string("Invalid plugin dll!");
			else flyengine->dll.load_classes(i,0);
		}
	}
	else
	if (!strcmp(token[0],"remove"))
		{
		if (ntoken==1)
			add_string("Missing parameters!");
		else
			if (flyengine->dll.delete_dll(token[1])==0)
				add_string("Invalid plugin dll!");
		}
	else
	if (!strcmp(token[0],"create"))
		{
		if (ntoken<3)
			add_string("Missing parameters!");
		else
			{
			bsp_object *obj=flyengine->dll.add_class(token[1]);
			if (obj==0)
				add_string("Invalid class name!");
			else
				{
				strcpy(obj->long_name,token[2]);
				obj->name[0]=0;
				}
			}
		}
	else
	if (!strcmp(token[0],"destroy"))
		{
		if (ntoken<2)
			add_string("Missing parameters!");
		else
			{
			bsp_object *o=flyengine->active_obj0;
			while(o)
				{
				if (!stricmp(o->long_name,token[1]))
					break;
				o=(bsp_object *)o->next_obj;
				}
			if (o==0)
				add_string("Invalid class name!");
			else 
				o->life=-1;
			}
		}
	else
	if (!strcmp(token[0],"list"))
		{
		char s[256]="";
		if (ntoken==1)
		{
			param_desc pd;
			j=flyengine->get_global_param_desc(0,0);
			for( k=0;k<j;k++ )
				{
				flyengine->get_global_param_desc(k,&pd);
				strcpy(s,pd.name);
				strcat(s,"=");
				strcat(s,pd.get_string());
				add_string(s);
				}
		}
		else
		if (!strcmp(token[1],"plugins"))
			{
			for( i=0;i<flyengine->dll.ndll;i++ )
				add_string(flyengine->dll.dll[i]->dll_filename);
			}
		else
		if (!strcmp(token[1],"classes"))
			{
			for( i=0;i<flyengine->dll.ncd;i++ )
				add_string(flyengine->dll.cd[i]->get_name());
			}
		else
		if (strchr(token[1],'.'))
			{
			char *c=strchr(token[1],'.');
			*c=0;
			bsp_object *o=flyengine->stock_obj0;
			while(o)
				{
				if (!stricmp(o->long_name,token[1]))
					break;
				o=(bsp_object *)o->next_obj;
				}
			if (o)
				{
				param_desc pd;
				j=o->get_param_desc(0,0);
				for( k=0;k<j;k++ )
					{
					o->get_param_desc(k,&pd);
					if (!stricmp(c+1,pd.name))
						{
						strcpy(s,pd.name);
						strcat(s,"=");
						strcat(s,pd.get_string());
						add_string(s);
						break;
						}
					}
				if (k==j)
					add_string("Invalid object parameter!");
				}
			else add_string("Invalid object name!");
			}
		else
			{
			for( i=0;i<flyengine->dll.ncd;i++ )
				if (!strcmp(token[1],flyengine->dll.cd[i]->get_name()))
					break;
			if (i<flyengine->dll.ncd)
				{
				j=flyengine->dll.cd[i]->get_type();
				bsp_object *o=flyengine->stock_obj0;;
				while(o)
					{
					if (o->type==j)
						add_string(o->long_name);
					o=(bsp_object *)o->next_obj;
					}
				}
			else
				{
				bsp_object *o=flyengine->stock_obj0;
				while(o)
					{
					if (!stricmp(o->long_name,token[1]))
						break;
					o=(bsp_object *)o->next_obj;
					}
				if (o==0)
					add_string("Invalid class/object name!");
				else 
					{
					param_desc pd;
					j=o->get_param_desc(0,0);
					for( k=0;k<j;k++ )
						{
						o->get_param_desc(k,&pd);
						strcpy(s,pd.name);
						strcat(s,"=");
						strcat(s,pd.get_string());
						add_string(s);
						}
					}
				}
			}
		}
	else
	if (!strcmp(token[0],"save"))
		{
		flyengine->save_fly_file(flyengine->flyfile);
		add_string("Saved!");
		return;
		}
	else
	if (!strcmp(token[0],"set"))
	{
		if (ntoken<3)
		{
			add_string("Missing parameters!");
			return;
		}

		if (strchr(token[1],'.'))
		{
			char *c=strchr(token[1],'.');
			*c=0;
			i=flyengine->set_obj_param(token[1],c+1,token[2]);
			if (i==1)
				add_string("Invalid object name!");
			else if (i==2) 
				add_string("Invalid object parameter!");
			else if (i==3) 
				add_string("Unsuported parameter type!");
			return;
		}

		if (flyengine->set_global_param(token[1],token[2])==0)
			add_string("Invalid parameter name!");
	}
	else if (!strcmp(token[0],"activate"))
	{
		bsp_object *o=flyengine->stock_obj0;
		while(o)
		{
			if (!stricmp(token[1],o->long_name))
				break;
			o=(bsp_object *)o->next_obj;
		}
		if (o)
			flyengine->activate(o->clone());
		else add_string("Invalid object name!");
	}
	else if (!strcmp(token[0],"get"))
	{
		char s[256]="";
		if (!strncmp(token[1],"obj(",4))
		{
			char *objname=&token[1][4];
			char *objparam=strchr(token[1],'.');
			char *c=strchr(objname,')');
			if (c==0 || objparam==0)
				{
				add_string("Invalid sintax!");
				return;
				}
			*c=0;
			i=flyengine->get_obj_param(objname,objparam+1,s);
			if (i)
			{
			if (i==1)
				add_string("Invalid object name!");
			else if (i==2) 
				add_string("Invalid object parameter!");
			else if (i==3) 
				add_string("Unsuported parameter type!!");
			return;
			}
		}
		else
		{
			i=flyengine->get_global_param_desc(0,0);
			param_desc pd;
			for( j=0;j<i;j++ )
				{
				flyengine->get_global_param_desc(j,&pd);
				if (!stricmp(token[1],pd.name))
					break;
				}
			if (j==i)
				{
				add_string("Invalid variable name!!");
				return;
				}
			else strcpy(s,pd.get_string());
		}
		add_string(s);
	}
	else 
		add_string("Invalid command!!");
}

⌨️ 快捷键说明

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