CG橙子精彩导航: CG橙子搜索引擎 | 博客 | 动画视频
广告|项目|培训|竞价排名  
86CG > CG教程 > 虚拟现实 > Virtools > 用Virtools SDK+VC++6.0来写Buliding Blocks的方法

用Virtools SDK+VC++6.0来写Buliding Blocks的方法

类型:整理 | 来自:86CG | 时间:2007-11-22 |  点击:

使用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,位于\SDK\Utils\目录下.你把它拷贝到你的\Microsoft Visual Studio\Common\MSDev98\Template目录下.完成以后启动的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,它已经自动编译。到你你的Virtools\BuildingBlocks目录中。你启动你的Virtools,在Buliding Blocks列表中可以看到MyBBs这一项,里边已经有了我们编写的Time_Top_Exit 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的输出参数Code:

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;
struct 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, "PM" );
today->tm_hour -= 12;
}
if( today->tm_hour == 0 ) today->tm_hour = 12;
sprintf(tmpbuf,"\t\t\t\t%.8s %s",asctime(today)+11,ampm); break;
}

输出字符串到我们的第一个输出参数中并激活循环:

beh->SetOutputParameterValue(0,tmpbuf);
beh->ActivateOutput(1,TRUE);

到现在位置,我们的第一个功能已经实现了.编译你的Dll,在Virtools中进行测试:

注:在编译种可能出错error C2091: function returns function,可将void RegisterBehaviorDeclarations(XObjectDeclarationArray *reg)中的RegisterBehavior(reg, FillBehaviorTimeTopExitDecl())改为RegisterBehavior(reg, FillBehaviorTimeTopExitDecl),或者将其改为reg->PushBack(FillBehaviorTime_Top_ExitDecl());便可编译成功,enjoy it!感谢作者media!

(完)
可打印版本 | 文章评论 | 我来纠错

|网友评论

    笔名:

    内容:

        

    iPad售楼系统软件

    国内最好的全景漫游软件任我游

    iHouse售楼系统软件

    谁都可以轻松开发APP(HTML5APP)

    全景视频3D视频视景360

    HTML5移动平台iOS/Android解决方案

    强大的地图引擎ZoomMap

    环物浏览器Object360

    |最新更新

    |热点关注

    关于我们 - 版权隐私 - 友情链接 - 广告服务 - 项目合作 - 网站地图 - 联系方式

    ©Copyright by 86CG.COM, 2006-2013. All rights reserved 京ICP备06059503号