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!

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

|网友评论

    笔名:

    内容:

        

    |最新更新

    |热点关注

    新歌 白狐 左边 拉拉爱 校园网 自由飞翔 感恩的心 边做边爱 为你写诗 北京欢迎你 范跑跑之歌 遇上你是我的缘 坏女人 N81 星星 火花 放生 不值得 手机网 分手那天 忘不掉的伤 电子杂志 网上展会 天使 城府 爱死了昨天 BT电影下载 N70 最后一次的温柔 小小 承诺 有没有人告诉你 N73 光荣 葬爱 大海 日不落 有缘人 躲避的爱 香水有毒 一定要爱你 求佛 爱在离别时 北极星的眼泪 假如 flash 歌曲 启示录 那滋味 独家记忆 放手去爱 丁香花 会呼吸的痛 音乐排行榜 爱上别人的人 对不起我爱你 N70 6300 会有天使替我爱你 DJ 爱上你是我的错 不要在我寂寞的时候说爱我 爱上你是一个错 爱你爱的好疲惫 怎么会狠心伤害我 MP3 音乐手机 拍照手机 智能手机 CDMA手机 怒放的生命 老人与海 等爱的玫瑰 爱情里没有谁对谁错 做你的爱人 感动天感动地 做我老婆好不好 你的承诺 王子 心碎 舍不得 摇啊摇 泪的告白 寂寞才说爱 擦肩而过 阿里阿里 中国基金网 新不了情 小情歌 离歌

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

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