查看: 2533|回复: 3
打印 上一主题 下一主题

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

[复制链接]

3795

主题

2

听众

5万

积分

版主

Rank: 7Rank: 7Rank: 7

纳金币
53202
精华
32

活跃会员 优秀版主 推广达人 突出贡献 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2012-10-15 10:21:22 |只看该作者 |倒序浏览
用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/)
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

.    

3797

主题

11

听众

5万

积分

首席设计师

Rank: 8Rank: 8

纳金币
32328
精华
41

活跃会员 优秀版主 荣誉管理 论坛元老

沙发
发表于 2012-11-8 21:21:12 |只看该作者
这是一个好帖子,大家快来围观!!
回复

使用道具 举报

1

主题

0

听众

2

积分

设计初学者

Rank: 1

纳金币
11
精华
0
板凳
发表于 2013-6-24 11:33:53 |只看该作者
确实是个好帖子,顶顶顶!
回复

使用道具 举报

0

主题

1

听众

2286

积分

中级设计师

Rank: 5Rank: 5

纳金币
0
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2013-8-23 19:48:56 |只看该作者
漂亮的贡献
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-10 15:00 , Processed in 0.135012 second(s), 36 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部