nutildef.h中主要定义了运行Nebula2程序所需要的最小依赖以及简化声明和使用Nebula2对象的工具宏,代码如下:
/****************************************************************************/
/*Nebula2-TutorialUtils*/
/*nKernelInfo-Nebula2实用工具宏及静态库*/
/*author:happykevins*/
/****************************************************************************/
#pragmaonce
///----------------------------------------------------------------------------
///+必要的链接库
#ifdefKS_STATICLINK_NEBULA2
#pragmacomment(lib,"wsock32.lib")
#pragmacomment(lib,"dxguid.lib")
#pragmacomment(lib,"dxerr9.lib")
#pragmacomment(lib,"d3d9.lib")
#pragmacomment(lib,"d3dx9d.lib")
#pragmacomment(lib,"dinput8.lib")
#pragmacomment(lib,"ogg_d.lib")
#pragmacomment(lib,"theora_d.lib")
#pragmacomment(lib,"sqlite_d.lib")
#pragmacomment(lib,"d_microtcl.lib")
#pragmacomment(lib,"d_nkernel.lib")
#pragmacomment(lib,"d_nnebula.lib")
#pragmacomment(lib,"d_ntoollib.lib")
#pragmacomment(lib,"d_ngui.lib")
#pragmacomment(lib,"d_ndinput8.lib")
#pragmacomment(lib,"d_ndirect3d9.lib")
#endif
///-必要的链接库
///----------------------------------------------------------------------------
///----------------------------------------------------------------------------
///+声明Nebula2对象工具宏
///声明使用指定的Module
#definenNebulaUseModule(MODULE)
externvoid*n_new_##MODULE(void);
externbooln_init_##MODULE(nClass*,nKernelServer*);
///将指定Module添加到KernelServer
#definenNebulaAddModule(MODULE)
nKernelServer::Instance()->AddModule(#MODULE,
n_init_##MODULE,n_new_##MODULE);
///声明为Nebula2Module
#definenNebulaModule(CLASS,MODULE,BASEMODULENAME)
externbooln_init_##MODULE(nClass*clazz,nKernelServer*kernelServer);
externvoid*n_new_##MODULE();
booln_init_##MODULE(nClass*clazz,nKernelServer*kernelServer){
clazz->SetProperName(#MODULE);
clazz->SetInstanceSize(sizeof(CLASS));
kernelServer->AddClass(BASEMODULENAME,clazz);
returntrue;
};
void*n_new_##MODULE(){returnn_new(CLASS());};
///命令初始化函数名
#definenNebulaScriptInitCmds(MODULE)n_initcmds_##MODULE
///声明为Nebula2脚本Module
#definenNebulaScriptModule(CLASS,MODULE,BASEMODULENAME)
externbooln_init_##MODULE(nClass*clazz,nKernelServer*kernelServer);
externvoid*n_new_##MODULE();
externvoidn_initcmds_##MODULE(nClass*);
booln_init_##MODULE(nClass*clazz,nKernelServer*kernelServer){
clazz->SetProperName(#MODULE);
clazz->SetInstanceSize(sizeof(CLASS));
kernelServer->AddClass(BASEMODULENAME,clazz);
n_initcmds_##MODULE(clazz);
returntrue;
};
void*n_new_##MODULE(){returnn_new(CLASS());};
///-声明Nebula2对象工具宏
///----------------------------------------------------------------------------
/*Nebula2-TutorialUtils*/
/*nKernelInfo-Nebula2实用工具宏及静态库*/
/*author:happykevins*/
/****************************************************************************/
#pragmaonce
///----------------------------------------------------------------------------
///+必要的链接库
#ifdefKS_STATICLINK_NEBULA2
#pragmacomment(lib,"wsock32.lib")
#pragmacomment(lib,"dxguid.lib")
#pragmacomment(lib,"dxerr9.lib")
#pragmacomment(lib,"d3d9.lib")
#pragmacomment(lib,"d3dx9d.lib")
#pragmacomment(lib,"dinput8.lib")
#pragmacomment(lib,"ogg_d.lib")
#pragmacomment(lib,"theora_d.lib")
#pragmacomment(lib,"sqlite_d.lib")
#pragmacomment(lib,"d_microtcl.lib")
#pragmacomment(lib,"d_nkernel.lib")
#pragmacomment(lib,"d_nnebula.lib")
#pragmacomment(lib,"d_ntoollib.lib")
#pragmacomment(lib,"d_ngui.lib")
#pragmacomment(lib,"d_ndinput8.lib")
#pragmacomment(lib,"d_ndirect3d9.lib")
#endif
///-必要的链接库
///----------------------------------------------------------------------------
///----------------------------------------------------------------------------
///+声明Nebula2对象工具宏
///声明使用指定的Module
#definenNebulaUseModule(MODULE)
externvoid*n_new_##MODULE(void);
externbooln_init_##MODULE(nClass*,nKernelServer*);
///将指定Module添加到KernelServer
#definenNebulaAddModule(MODULE)
nKernelServer::Instance()->AddModule(#MODULE,
n_init_##MODULE,n_new_##MODULE);
///声明为Nebula2Module
#definenNebulaModule(CLASS,MODULE,BASEMODULENAME)
externbooln_init_##MODULE(nClass*clazz,nKernelServer*kernelServer);
externvoid*n_new_##MODULE();
booln_init_##MODULE(nClass*clazz,nKernelServer*kernelServer){
clazz->SetProperName(#MODULE);
clazz->SetInstanceSize(sizeof(CLASS));
kernelServer->AddClass(BASEMODULENAME,clazz);
returntrue;
};
void*n_new_##MODULE(){returnn_new(CLASS());};
///命令初始化函数名
#definenNebulaScriptInitCmds(MODULE)n_initcmds_##MODULE
///声明为Nebula2脚本Module
#definenNebulaScriptModule(CLASS,MODULE,BASEMODULENAME)
externbooln_init_##MODULE(nClass*clazz,nKernelServer*kernelServer);
externvoid*n_new_##MODULE();
externvoidn_initcmds_##MODULE(nClass*);
booln_init_##MODULE(nClass*clazz,nKernelServer*kernelServer){
clazz->SetProperName(#MODULE);
clazz->SetInstanceSize(sizeof(CLASS));
kernelServer->AddClass(BASEMODULENAME,clazz);
n_initcmds_##MODULE(clazz);
returntrue;
};
void*n_new_##MODULE(){returnn_new(CLASS());};
///-声明Nebula2对象工具宏
///----------------------------------------------------------------------------
nkernelinfo类主要是对第3章代码的整理,目前支持察看Nebula2的Class列表和当前NOH中的对象两项功能。
nkernelinfo.h代码如下:
/****************************************************************************/
/*Nebula2-TutorialUtils*/
/*nKernelInfo-Nebula2内核信息调试器*/
/*author:happykevins*/
/****************************************************************************/
#pragmaonce
#include"kernel/nkernelserver.h"
#include"util/nstack.h"
#include"util/nhashlist.h"
//使用标准输出流(否则输出到Nebula2的日志系统)
#ifdefKS_USE_STDOUT
#defineks_printprintf
#else
#defineks_printn_printf
#endif
classnKernelInfoHelper:publicnRoot
{
public:
///构造nKernelInfoHelper
nKernelInfoHelper(nKernelServer*_ks=nKernelServer::Instance());
///设置KernelServer实例
voidSetKernelServer(nKernelServer*_ks);
///将指定NOH分支的当前信息输出到Nebula日至系统
voidLogNOH(constchar*szRootPath);
///将当前的类列表输出到Nebula日至系统
voidLogCLS();
protected:
nKernelServer*ks;
};
/*Nebula2-TutorialUtils*/
/*nKernelInfo-Nebula2内核信息调试器*/
/*author:happykevins*/
/****************************************************************************/
#pragmaonce
#include"kernel/nkernelserver.h"
#include"util/nstack.h"
#include"util/nhashlist.h"
//使用标准输出流(否则输出到Nebula2的日志系统)
#ifdefKS_USE_STDOUT
#defineks_printprintf
#else
#defineks_printn_printf
#endif
classnKernelInfoHelper:publicnRoot
{
public:
///构造nKernelInfoHelper
nKernelInfoHelper(nKernelServer*_ks=nKernelServer::Instance());
///设置KernelServer实例
voidSetKernelServer(nKernelServer*_ks);
///将指定NOH分支的当前信息输出到Nebula日至系统
voidLogNOH(constchar*szRootPath);
///将当前的类列表输出到Nebula日至系统
voidLogCLS();
protected:
nKernelServer*ks;
};
nkernelinfo.cpp代码如下:
//nkernelinfo.cpp
#pragmawarning(push)
#pragmawarning(disable:42674244)
#include"nkernelinfo.h"
#include"nutildefs.h"
///声明为Nebula2脚本支持类
nNebulaScriptModule(nKernelInfoHelper,nkernelinfohelper,"nroot");
///----------------------------------------------------------------------------
///+CommonSection
///
///构造nKernelInfoHelper
nKernelInfoHelper::nKernelInfoHelper(nKernelServer*_ks)
:ks(_ks)
{
}
///设置KernelServer实例
voidnKernelInfoHelper::SetKernelServer(nKernelServer*_ks)
{
this->ks=_ks;
}
///将指定NOH分支的当前信息输出到Nebula日至系统
voidnKernelInfoHelper::LogNOH(constchar*szRootPath)
{
n_assert(ks);
n_assert(szRootPath);
nRoot*pRoot=ks->Lookup(szRootPath);
if(!pRoot)
{
ks_print("--NONE:%s---- ",szRootPath);
return;
}
//内核加锁
ks->Lock();
//打印根节点NOH名
if(pRoot->GetParent())
{
ks_print("%s ",pRoot->GetFullName().Get());
}
else
{
ks_print("%s ",pRoot->GetName());
}
//打印所有子节点
if(pRoot->GetHead())
{
//层次栈
//在开始时将根节点入栈
nStack<nRoot*>deepStack;
deepStack.Push(pRoot->GetHead());
//遍历树
do
{
//获得当前栈顶元素
nRoot*obj=deepStack.Pop();
//打印该元素NOH名
if(obj->GetParent())
{
ks_print("%s ",obj->GetFullName().Get());
}
else
{
ks_print("%s ",obj->GetName());
}
//兄弟节点入栈
if(obj->IsLinked()&&obj->GetSucc())
{
deepStack.Push(obj->GetSucc());
}
//第一个子节点入栈
if(obj->GetHead())
{
deepStack.Push(obj->GetHead());
}
}while(!deepStack.IsEmpty());
}
//内核解锁
ks->Unlock();
}
///将当前的类列表输出到Nebula日至系统
voidnKernelInfoHelper::LogCLS()
{
n_assert(ks);
//内核加锁
ks->Lock();
//获得Class列表
constnHashList*classList=ks->GetClassList();
nHashNode*node=(nClass*)classList->GetHead();
//遍历输出Class列表
do
{
nClass*cls=(nClass*)node;
ks_print("%s ",cls->GetName());
node=node->GetSucc();
}while(node);
//内核解锁
ks->Unlock();
}
///
///-CommonSection
///----------------------------------------------------------------------------
///----------------------------------------------------------------------------
///+ScriptSection
///
///LogCLS的脚本支持
staticvoidn_logcls(void*slf,nCmd*cmd);
///LogNOH的脚本支持
staticvoidn_lognoh(void*slf,nCmd*cmd);
voidnNebulaScriptInitCmds(nkernelinfohelper)(nClass*cl)
{
cl->BeginCmds();
cl->AddCmd("v_logcls_v",'LCLS',n_logcls);
cl->AddCmd("v_lognoh_s",'LNOH',n_lognoh);
cl->EndCmds();
}
staticvoidn_logcls(void*slf,nCmd*cmd)
{
nKernelInfoHelper*self=(nKernelInfoHelper*)slf;
self->LogCLS();
}
staticvoidn_lognoh(void*slf,nCmd*cmd)
{
nKernelInfoHelper*self=(nKernelInfoHelper*)slf;
constchar*root=cmd->In()->GetS();
self->LogNOH(root);
}
///
///-ScriptSection
///----------------------------------------------------------------------------
#pragmawarning(pop)
#pragmawarning(push)
#pragmawarning(disable:42674244)
#include"nkernelinfo.h"
#include"nutildefs.h"
///声明为Nebula2脚本支持类
nNebulaScriptModule(nKernelInfoHelper,nkernelinfohelper,"nroot");
///----------------------------------------------------------------------------
///+CommonSection
///
///构造nKernelInfoHelper
nKernelInfoHelper::nKernelInfoHelper(nKernelServer*_ks)
:ks(_ks)
{
}
///设置KernelServer实例
voidnKernelInfoHelper::SetKernelServer(nKernelServer*_ks)
{
this->ks=_ks;
}
///将指定NOH分支的当前信息输出到Nebula日至系统
voidnKernelInfoHelper::LogNOH(constchar*szRootPath)
{
n_assert(ks);
n_assert(szRootPath);
nRoot*pRoot=ks->Lookup(szRootPath);
if(!pRoot)
{
ks_print("--NONE:%s---- ",szRootPath);
return;
}
//内核加锁
ks->Lock();
//打印根节点NOH名
if(pRoot->GetParent())
{
ks_print("%s ",pRoot->GetFullName().Get());
}
else
{
ks_print("%s ",pRoot->GetName());
}
//打印所有子节点
if(pRoot->GetHead())
{
//层次栈
//在开始时将根节点入栈
nStack<nRoot*>deepStack;
deepStack.Push(pRoot->GetHead());
//遍历树
do
{
//获得当前栈顶元素
nRoot*obj=deepStack.Pop();
//打印该元素NOH名
if(obj->GetParent())
{
ks_print("%s ",obj->GetFullName().Get());
}
else
{
ks_print("%s ",obj->GetName());
}
//兄弟节点入栈
if(obj->IsLinked()&&obj->GetSucc())
{
deepStack.Push(obj->GetSucc());
}
//第一个子节点入栈
if(obj->GetHead())
{
deepStack.Push(obj->GetHead());
}
}while(!deepStack.IsEmpty());
}
//内核解锁
ks->Unlock();
}
///将当前的类列表输出到Nebula日至系统
voidnKernelInfoHelper::LogCLS()
{
n_assert(ks);
//内核加锁
ks->Lock();
//获得Class列表
constnHashList*classList=ks->GetClassList();
nHashNode*node=(nClass*)classList->GetHead();
//遍历输出Class列表
do
{
nClass*cls=(nClass*)node;
ks_print("%s ",cls->GetName());
node=node->GetSucc();
}while(node);
//内核解锁
ks->Unlock();
}
///
///-CommonSection
///----------------------------------------------------------------------------
///----------------------------------------------------------------------------
///+ScriptSection
///
///LogCLS的脚本支持
staticvoidn_logcls(void*slf,nCmd*cmd);
///LogNOH的脚本支持
staticvoidn_lognoh(void*slf,nCmd*cmd);
voidnNebulaScriptInitCmds(nkernelinfohelper)(nClass*cl)
{
cl->BeginCmds();
cl->AddCmd("v_logcls_v",'LCLS',n_logcls);
cl->AddCmd("v_lognoh_s",'LNOH',n_lognoh);
cl->EndCmds();
}
staticvoidn_logcls(void*slf,nCmd*cmd)
{
nKernelInfoHelper*self=(nKernelInfoHelper*)slf;
self->LogCLS();
}
staticvoidn_lognoh(void*slf,nCmd*cmd)
{
nKernelInfoHelper*self=(nKernelInfoHelper*)slf;
constchar*root=cmd->In()->GetS();
self->LogNOH(root);
}
///
///-ScriptSection
///----------------------------------------------------------------------------
#pragmawarning(pop)