一个接口需要统一的派生接口,这样做的好处在于能够统一的进行管理。我所知的脚本语言中,接口有多重接口,也还有所谓的虚基类,这些都是方便类的管理。在vengine(微引擎)中,统一的的接口管理为kernel模块,类的管理采取了节点管理的模式,就是所有类对象使用一个实例进行管理。那么什么是节点,什么是树?这里的核心就相当于树,所有子类都是树中的一个节点。这种做法已经成为了一种模式,如果大家想要深入了解的话可以去查询一些相关的资料,我在这里也没有必要再强调这个模式了。接下来我们看看,所有模块的基类以及管理节点是如何实现的。

CODE

模块kernel 文件base.h

/**
* PAP Engine ( -- )
* $Id config.h
* @link -- for the canonical source repository
* @copyright Copyright (c) 2013-2014 viticm( viticm@126.com )
* @license
* @user viticm<viticm@126.com/viticm.ti@gmail.com>
* @date 2014-3-12 11:15:08
* @uses the vengine kernel base class
*/
#ifndef PAP_VENGINE_KERNEL_BASE_H_
#define PAP_VENGINE_KERNEL_BASE_H_
#include "vengine/config.h"
#include "vengine/kernel/node.h" //插件必须导出一个名为DllMagicCode的U32整数,
//值等于 VENGINE_DLL_MAGIC_CODE|VENGINE_KERNEL_VERSION
#define VENGINE_DLL_MAGIC_CODE (static_cast<uint32_t>(0XC0DE0000)) namespace vengine_kernel { //for plugin
typedef void (__stdcall* function_dllinit)(void*);
typedef void (__stdcall* function_dllrelease)(void); class VENGINE_API Base { public:
Base();
virtual ~Base(); public:
//某个类注册到全局类检索表函数
void registerclass(class_t* newclass);
//检查两个类是否具有继承关系
bool isinheritance(const class_t* thisclass, const class_t* baseclass) const;
//根据类名获得定义类
class_t* getclass(const char* name); //node operator
public:
virtual Node* newnode(const char* classname,
const char* position,
const char* nodename);
virtual Node* newnode(const char* classname,
Node* parentnode,
const char* nodename);
//get node by node name, sample: getnode("bin\\data")
virtual Node* getnode(const char* name); //plugin
public:
bool loadplugin(const char* name, void* param);
void shutdown(); //kernel close public:
static Base* getself();
static void* get_userdata();
static void set_userdata(void* data); protected:
static Base* self_;
static void* userdata_;
std::map<STRING, class_t*> classmap_; //is a map not a list
class_t* firstclass_inmap_;
Node noderoot_; protected:
struct plugininfo_t {
HMODULE hmodule;
STRING pluginfile;
function_dllinit dllinit_pointer;
function_dllrelease dllrelease_pointer;
};
void free_allplugin();
std::vector<plugininfo_t> pluginlist_; //all plugin in a vector
}; }; //namespace vengine_kernel
#endif //PAP_VENGINE_KERNEL_BASE_H_

模块kernel 文件class.h

/**
* PAP Engine ( -- )
* $Id class.h
* @link -- for the canonical source repository
* @copyright Copyright (c) 2013-2014 viticm( viticm@126.com )
* @license
* @user viticm<viticm@126.com/viticm.ti@gmail.com>
* @date 2014-3-17 16:28:41
* @uses vengine kernel class module
*/
#ifndef VENGINE_KERNEL_CLASS_H_
#define VENGINE_KERNEL_CLASS_H_ #include "vengine/config.h"
#include "vengine/exception/base.h" namespace vengine_kernel { class Node; struct VENGINE_API class_t {
const char* name; //class name
int32_t objectsize; //class size
Node* (__stdcall* newobject_pointer)(); //函数指针,用于生成一个Node类实例
class_t* baseclass; //基类
class_t* nextclass; //下一个类
Node* newobject(const char* name); //生成对象方法
}; }; //namespace vengine_kernel //variableflag 为命名空间准备的变量标识,
//如name1::name2::class1 则此值在函数中为name1_name2_class1
//如果不是命名空间直接填写类名即可 //据类名取得定义类
#define VENGINE_KERNEL_GETCLASS(classname, variableflag) (&classname::class_##variableflag##_) //定义声明宏
#define VENGINE_KERNEL_DECLARE_DYNAMIC(variableflag) \
public: \
static vengine_kernel::class_t class_##variableflag##_; \
virtual const vengine_kernel::class_t* getclass() const; \
static vengine_kernel::Node* __stdcall newobject(); //定义实现宏
#define VENGINE_KERNEL_IMPLEMENT_DYNAMIC(classname, baseclass, variableflag) \
static char name_##variableflag[] = #classname; \
vengine_kernel::class_t classname::class_##variableflag##_ = { \
name_##variableflag, sizeof(classname), classname::newobject, baseclass, NULL \
}; \
const vengine_kernel::class_t* classname::getclass() const { \
return &classname::class_##variableflag##_; \
}; \
vengine_kernel::Node* classname::newobject() { \
return new classname; \
} //纯虚类类定义实现宏
#define VENGINE_KERNEL_IMPLEMENT_VIRTUAL_DYNAMIC(classname, baseclass, variableflag) \
static char name_##variableflag[] = #classname; \
vengine_kernel::class_t classname::class_##variableflag##_ = { \
name_##variableflag, sizeof(classname), classname::newobject, baseclass, NULL \
}; \
const vengine_kernel::class_t* classname::getclass() const { \
return &classname::class_##variableflag##_; \
}; \
vengine_kernel::Node* classname::newobject() { \
VENGINE_SHOW("pure a virtual class"); \
return NULL; \
} #define VENGINE_KERNEL_DECLARE_LOGICAL(havelogical) \
public: \
virtual inline bool is_havelogical() { return havelogical; } #endif //VENGINE_KERNEL_CLASS_H_

模块kernel 文件node.h

/**
* PAP Engine ( -- )
* $Id node.h
* @link -- for the canonical source repository
* @copyright Copyright (c) 2013-2014 viticm( viticm@126.com )
* @license
* @user viticm<viticm@126.com/viticm.ti@gmail.com>
* @date 2014-3-12 11:15:08
* @uses vengine kernel node class module
*/
#ifndef VENGINE_KERNEL_NODE_H_
#define VENGINE_KERNEL_NODE_H_ #include "vengine/config.h"
#include "vengine/kernel/class.h" namespace vengine_kernel { class VENGINE_API Node {
public:
Node();
Node(const char* name);
virtual ~Node();
//返回子节点数目
int32_t get_childnumber() const;
//获得子节点名称
virtual const STRING& getname() const;
//获得子节点列表
virtual std::list<Node*>& get_childlist();
//返回父节点
virtual Node* getparent() const;
//初始化节点
virtual void init(void*) {}; //空指针,子类可以用这个继承这个指针初始化
//逻辑轮循环
virtual void tick(); public:
//查找子节点,如果没有找到,返回NULL
virtual Node* lookup_child(const char* name);
//添加子节点
virtual void addchild(Node* node);
//删除子节点,如果该子节点存在则返回true,否则为false
virtual bool removechild(Node* node);
//删除所有子节点
virtual void remove_allchild();
//释放资源
virtual void release(); VENGINE_KERNEL_DECLARE_DYNAMIC(vengine_kernel_Node); //类节点自动定义实现 protected:
typedef std::list<Node*> childlist;
STRING name_; //节点名
childlist childlist_; //子节点列表
Node* parent_; //父节点指针
friend struct class_t; }; }; //namespace vengine_kernel #endif //VENGINE_KERNEL_NODE_H_

总结

其实如果一个代码有足够的注释,则不必过多的解释,否则会造成读者的困惑。不过这里面需要注意的是,几个实现的宏VENGINE_KERNEL_*,希望大家仔细去理解一下它实现的原理。这里的核心实现也是依赖于此宏来实现,如果你将这些宏弄清楚了则核心模块的原理也就掌握了。下一节讲的是客户端的游戏模块,是提供给游戏实现的基础接口,比较多,同时希望大家不会错过。

MMORPG大型游戏设计与开发(客户端架构 part15 of vegine)的更多相关文章

  1. MMORPG大型游戏设计与开发(客户端架构 part8 of vegine)

    脚本模块是游戏设计中争论比较多的话题,那是因为作为脚本本身所带来的利弊.其实这都无关紧要,取舍是人必须学会的一项技能,如果你不会取舍那么就让趋势给你一个满意的答复.自从魔兽世界以及传奇(世界)问世以来 ...

  2. MMORPG大型游戏设计与开发(概述)updated

    1.定义 MMORPG,是英文Massive(或Massively)Multiplayer Online Role-PlayingGame的缩写,即大型多人在线角色扮演游戏. 2.技术与知识 在这系列 ...

  3. MMORPG大型游戏设计与开发(UI SYSTEM SHOW)

    接下来一段时间,这些文件可能不再更新,期间我会学习和掌握一些前端知识.虽然我非常欣赏剑侠网络版叁和九阴真经的画面,但是那是一个庞大的游戏引擎,一般人是无法窥伺的,除非你是天才而且要拥有机器毫无中断的毅 ...

  4. MMORPG大型游戏设计与开发(服务器 游戏场景 核心详述)

    核心这个词来的是多么的高深,可能我们也因为这个字眼望而却步,也就很难去掌握这部分的知识.之所以将核心放在最前面讲解,也可以看出它真的很重要,希望朋友们不会错过这个一直以来让大家不熟悉的知识,同我一起进 ...

  5. MMORPG大型游戏设计与开发(游戏服务器 游戏场景 概述 updated)

    我们在玩游戏的时候,我们进入游戏后第一眼往往都是看到游戏世界中的场景,当然除了个别例外,因为那些游戏将游戏场景隐藏了起来,如文字游戏中的地点一样.既然我们接触了游戏世界的核心,那么作为核心的场景又包括 ...

  6. MMORPG大型游戏设计与开发(客户端架构 part12 of vegine)

    在游戏中的交互过程中输入是一个必不可少的过程,比如登陆的时候需要用户输入用户名与密码,就算是单机游戏很多时候也要求用户输入一个用户名作为存档的依据.网络游戏中没有了输入,只用鼠标来交互是不切实际的,因 ...

  7. MMORPG大型游戏设计与开发(客户端架构 part2 of vgui)

    这一节我将讲解vgui的基础系统部分,也是该库提供给外部使用的一些重要接口.作为UI部分比较重要的部分,该节有着至关重要的部分,如果没有看到上一节内容,请留意下面的连接.我们现在可以猜想一下在客户端U ...

  8. MMORPG大型游戏设计与开发(客户端架构 part16 of vegine)

    由于近来比较忙碌和有些困倦的原因,所以关于这部分的文章没有及时更新,一句话:让朋友们久等了!今天所讲的是客户端vengine(微引擎)中最后一个部分,就像上节所说,这一部分的内容比较多.可能有些朋友看 ...

  9. MMORPG大型游戏设计与开发(客户端架构 part9 of vegine)

    时间在人们的生活中是多么重要的东西,如果打乱了时间,不知道这个时间会成什么样子.在客户端中,自然也有时间模块,因为不同的时间可能会处理不同的事情,特别是在追求高度自由化的同时,时间也成为了一个很重要的 ...

  10. MMORPG大型游戏设计与开发(客户端架构)

    首先为所有等待的朋友说一声歉意,实在让大家等的太久.客户端的设计本来就是一个大的工程,而且工作的关系,也没有太多时间在这方面做研究.不过在私下有空的时间,我还是继续着这方面的研究,很遗憾没有用期望的o ...

随机推荐

  1. Salvattore:CSS 驱动的 jQuery Masonry 插件

    Salvattore 是一个 jQuery 砌体的替代,使用 CSS 驱动的配置.Salvattore 根据您指定的列数组织你的 HTML 元素.容器中的每一个项目会一个接一个被放置在列内,只需要简单 ...

  2. Hybrid框架UI重构之路:五、前端那点事儿(HTML、CSS)

    上文回顾 :Hybird框架UI重构之路:四.分而治之 这里讲述在开发的过程中,一些HTML.CSS的关键点. 单页模式的页面结构 在单页模式中,弱化HTML的概念,把HTML当成一个容器,BODY中 ...

  3. 微信网页授权(OAuth2.0) PHP 源码简单实现

    提要: 1. 建议对OAuth2.0协议做一个学习. 2. 微信官方文档和微信官网工具要得到充分利用. 比较简单,直接帖源代码了.其中“xxxxxxxxxx”部分,是需要依据自己环境做替换的 /** ...

  4. 学习zepto.js(Hello World)

    Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与jquery有着类似的api. 如果你会用jquery,那么你也会用zepto. 昨天听说了zepto.js,正好最近也比较闲 ...

  5. APP One Link ,android and ios qrcode merge as One QRCode and one short link

    Adroid and ios qrcode merge as One QRCode and one short link is publish , the web site is www.appone ...

  6. iOS中sqlite版本号

    https://github.com/yapstudios/YapDatabase/wiki/SQLite-version-(bundled-with-OS) https://github.com/y ...

  7. WIFI热点

    1.wifi热点是指把手机的接收GPRS.3G或4G信号转化为wifi信号再发出去,这样手机就成了一个WIFI热点. 2.手机必须有无线AP功能,才能当做热点.有些系统自带建热点这个功能比如IOS(比 ...

  8. CoreLocation 定位

    前言: 本章会使用OC和Swift分别进行实现,需要了解Swift的小伙伴可以翻一下之前的博文 LBS和SoloMo(索罗门) LBS:基于位置的服务,根据定位展示周边美食.景点等信息(全称:Loca ...

  9. Android 使用SoundPool播放音效

    在Android开发中我们经常使用MediaPlayer来播放音频文件,但是MediaPlayer存在一些不足,例如:资源占用量较高.延迟时间较长.不支持多个音频同时播放等.这些缺点决定了MediaP ...

  10. Facebook开源动画库 POP-POPSpringAnimation运用

    POPSpringAnimation也许是大多数人使用POP的理由 其提供一个类似弹簧一般的动画效果:实例源代码已经上传至gitHub,地址:https://github.com/wujunyang/ ...