- 最后登录
- 2021-9-15
- 注册时间
- 2011-7-15
- 阅读权限
- 100
- 积分
- 50625
- 纳金币
- 53202
- 精华
- 32
|
用VC++6.0来写Buliding Blocks的方法
使用Virtools的朋友都知道,Building Blocks是很重要的.在VT中提供了几百个BB供我们来使用.使用Virtools的SDK,我们可以开发出自己需要的Buliding Blocks,利用它很容易对我们的Virtools供能进行扩展.在这里我写一篇教程,来介绍一下用Virtools SDK和VC++6.0来写Building Blocks的过程和方法.
这里要用到一些Win32和API编程的方法,不会的赶快恶补一下了,否则看不懂可别怪我在这个实例中,我们要开发一个这样的Building Blocks.它可以完成以下三个功能:
1:可以把当前系统的时间以不同格式在Virtools中显示;
2:它可以是你的Building Blocks对应的主窗口永远处于最上层;
3:通过关闭进程的方法,它可以关闭你想要关闭程序和进程.
要先完成准备工作,在SDK中提供给我们了一个开发Building Blocks的向导文件Virtools Behaviors AppWizard.awx,位于SDKUtils目录下。你把它拷贝到你的Microsoft Visual StudioCommonMSDev98Template目录下。完成以后启动的VC++,执行File-->New...,在Project中可以看到Virtools BB新建这一项,选中它。
在Project Name中填入你的名称,比如"My Building Blocks",同时要设置好你的项目保存路径.如图
单击OK进入下一步.
勾选"Behavior"和"Manager"这两个选项。
说明:开发Buliding Blocks,"Behavior"选项一定要选择的,否则不能继续了。
由于我们在这个实例中要用到Enum类型变量,也就是枚举类型的变量.在Behavior中要用到你自己声明的新类型变量,必须要在CKERROR InitInstance(CKContext* context)接口中先注册,才能使用.所以我们要用到ParameterManager,必须勾选"Manager"这一项。按下Next,继续。
在这个窗口中填入你的Buliding Blocks的名字,要注意,这个名字不要和你的先前Project名字相同,否则编译时会报错。实现的类名称,我们不错修改,Next,继续。
在这个窗口中,我们在Behavior栏目中输入你的BB的类别名称“MyBBs”描述中填入你的描述“Show time Set Windows Always Top Exit Your proceeding”为了简化我们Code,在Behavior Flags中我们不作勾选,需要的时侯我们自己加上代码来实现。这个实例中我们不用到Behavior的回调函数,所以CallBacks也不选择。Next,继续。
填入你的Manager的名字,其他的选项不作勾选。Next,继续。用这个方法完全可以实现你的目的。在这个窗口设置你的SDK目录和VT程序目录,插件名称等。单击Finish,完成。
执行Build--->Rebuild all。即可生成你的Buliding Blocks,它已经自动编译到你你的VirtoolsBuildingBlocks目录中。你启动你的Virtools,在BulidingBlocks列表中可以看到MyBBs这一项,里边已经有了我们编写的Time_Top_Exit BB了。
你在Vritools写一段小程序或用VC写一个BB,很容易实现你的要求。在你的项目文件中可以看到一些接口函数。我们先声明一个枚举变量,然后注册它。用它来做我们的Time Type下拉列表(4个选项)。打开你的MyBB.h文件,在顶部加入以下Code:
typedef enum SHOWTIMETYPENUM
{
OSTIME =0x00000000, //24小时显示时间
OSDATE =0x00000001, //显示当前日期
UNIX_TIME_AND_DATE= 0x00000002,//完整显示日期,时间
HOUR_TIME_12= 0x00000003,//以12小时方式显示
}Enumeration;
这里有四个枚举值。然后用define宏来设置这个变量:
#define GUID_SHOWTIMETYPENUM MyBBGUID
在CKERROR InitInstance(CKContext* context)接口中加入注册新类型变量的Code:
CKParameterManager* pm = context->GetParameterManager();
pm->RegisterNewEnum(GUID_SHOWTIMETYPENUM,"SHOWTIMETYPENUM","OSTIME =0x00000000,OSDATE =0x00000001,UNIX_TIME_AND_DATE= 0x00000002,HOUR_TIME_12= 0x00000003");
//注册新的变量类型。接口原型请参见SDK。
pm->ChangeEnumDeclaration(GUID_SHOWTIMETYPENUM,"OSTIME,OSDATE,UNIX_TIME_AND_DATE,HOUR_TIME_12");
//设置可以枚举的变量范围
找到你的CKERROR CreateTime_Top_ExitProto(CKBehaviorPrototype** pproto)接口函数:在这里进行InPut,Out,InputParameter和OutParameter等参数的声明.
这两行代码保留:
proto->DeclareInput("In0");
proto->DeclareOutput("Out0");
在他的下边加入我们的LoopIn和LoopOut声明。
proto->DeclareInput("LoopIn");
proto->DeclareOutput("LoopOut");
还是在这个接口函数中,我们把
proto->DeclareInParameter("InP0",CKPGUID_INT);
proto->DeclareOutParameter("OutP0",CKPGUID_INT);
这两行注释掉
加入我们的输入参数列表Code,并且初始化它:
proto->DeclareInParameter("Show Time Type",GUID_SHOWTIMETYPENUM,"OSTIME");
//第一个型参,是一个enum类型的,以下拉List来实现用户的选择
proto->DeclareInParameter("window always top?",CKPGUID_BOOL,"FALSE");
//第二个型参,布尔类型.用户勾选则执行window always top
proto->DeclareInParameter("Exit Virtools?",CKPGUID_BOOL,"FALSE");
//第三个型参,布尔类型.用户勾选则执行Exit Virtools.
填加实现BB的输出参数:
proto->DeclareOutParameter("Out Time String",CKPGUID_STRING);
//输出一个字符串
在这个文件的顶部包入头文件,加入这行Code:
#include "MyBB.h"
现在你可以编译的DLL,应该编译通过.打开你的Virtools Dev,把我们刚编写的Show_Top_Exit,放到你的Level Script,编辑他的参数列表,应该如图所示:
在int Time_Top_Exit(const CKBehaviorContext& BehContext)接口中来实现我们要完成的功能:
在这个文件顶部加入Code,来实现包含API和Time头文件。
#include "windows.h"
#include "time.h"
加入这三行Code,初始化BB:
CKBehavior *beh = BehContext.Behavior;//取得BB的上下文举柄
beh->ActivateInput(0,FALSE);//
beh->ActivateOutput(0);//初始化输入输出流状态
完成第一个功能:
声明我们要用到的表述时间的变量:
char tmpbuf[128], ampm[] = "AM";
char *tempstr=NULL;
s***ct tm *today,*newtime;
long lTime;
刷新当前的时间环境变量:
_tzset();
根据Loop的状态来设置相应的输入输出状态:
if( beh->IsInputActive(0) )
{
beh->ActivateInput(0,FALSE);
}
else {
beh->ActivateInput(1,FALSE);
beh->GetOutputParameterValue(0,&elapsedTime);
}
声明我们要用到的枚举值,取得当前用户选择的ID
SHOWTIMETYPENUM type;
beh->GetInputParameterValue(0,&type);
根据枚举值,进行判断:
switch(type)
{
case OSTIME:
_strtime(tmpbuf);
break;
case OSDATE:
_strdate(tmpbuf);
break;
case UNIX_TIME_AND_DATE:
time(&lTime);
newtime=localtime(&lTime);
strcpy(tmpbuf,asctime(newtime));
tmpbuf[24]=' ';
tmpbuf[25]=0;
break;
case HOUR_TIME_12:
time(&lTime);
today = localtime( &lTime);
if( today->tm_hour > 12 )
{
strcpy( ampm, "M" );
today->tm_hour -= 12;
}
if( today->tm_hour == 0 ) today->tm_hour = 12;
sprintf(tmpbuf," %.8s %s",asctime(today)+11,ampm); break;
}
输出字符串到我们的第一个输出参数中并激活循环:
beh->SetOutputParameterValue(0,tmpbuf);
beh->ActivateOutput(1,TRUE);
到现在位置,我们的第一个功能已经实现了.编译你的Dll,在Virtools中进行测试:另外两个功能的实现,现在对你来说,是不是也不难实现了?自己动手试试吧,有问题在这里提出来这是生成的Dll和场景文件.(只实现了一个ShowTime的功能).(更多3D教程尽在web3D纳金网http://www.narkii.com/) |
|