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

脚本模块是游戏设计中争论比较多的话题,那是因为作为脚本本身所带来的利弊。其实这都无关紧要,取舍是人必须学会的一项技能,如果你不会取舍那么就让趋势给你一个满意的答复。自从魔兽世界以及传奇(世界)问世以来,它们都伴随着脚本(LUA)配置,想一想为什么会用到脚本,其根本的原因在于脚本比较方便,改动的时候也无需考虑过多。个人一直坚持使用脚本就在此,另一方面是因其他高级语言,特别是C/C++与它的基本上是无缝的耦合所带来的便利,也成为我选择它的重要原因。

CODE

  文件environment.h

复制代码
/**
 * PAP Engine ( -- )
 * $Id environment.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-19 19:36:10
 * @uses vengine script environment module
 */
#ifndef VENGINE_SCRIPT_ENVIRONMENT_H_
#define VENGINE_SCRIPT_ENVIRONMENT_H_

#include "vengine/config.h"
#include "vengine/kernel/node.h"

/* use luaplus */
namespace LuaPlus {

class LuaState;
class LuaObject;

}; //namespace LuaPlus

namespace vengine_script {

class Environment {

 public:
   virtual const char* getname() const = 0;
   virtual int32_t executescript(const char* filename) = 0;
   virtual void executefunction(const char* functionname, 
                                const char* param = NULL) = 0;
   virtual void executestring(const char* str) = 0;
   virtual LuaPlus::LuaObject* get_luaobject() = 0;

};

}; //namespace vengine_script

#endif //VENGINE_SCRIPT_ENVIRONMENT_H_
复制代码

  文件system.h

复制代码
/**
 * PAP Engine ( -- )
 * $Id system.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-19 19:49:05
 * @uses vengine script system module
 */
#ifndef VENGINE_SCRIPT_SYSTEM_H_
#define VENGINE_SCRIPT_SYSTEM_H_

#include "vengine/config.h"
#include "vengine/kernel/node.h"
#include "vengine/script/environment.h"

/* use luaplus */
namespace LuaPlus {

class LuaState;
class LuaObject;

}; //namespace LuaPlus

namespace vengine_script {

class VENGINE_API System : public vengine_kernel::Node {

VENGINE_KERNEL_DECLARE_DYNAMIC(vengine_script_System);

 public:
   virtual LuaPlus::LuaState* get_luastate() = 0; //获得lua状态
   //创建新的脚本环境
   virtual Environment* newenvironment(const char* name, 
                                       const char* filename) = 0;

   virtual void destroyenvironment(Environment* environment) = 0;
   virtual Environment* getenvironment(const char* name) = 0;

};

}; //namespace vengine_script

#endif //VENGINE_SCRIPT_SCRIPT_H_
复制代码

简述

  什么是环境?为什么要有环境?

  环境是人类赖以生存的地方,环境决定了许多事情,特别是你能做什么。简单一点,如我们生活的环境,你周围的医疗、商场,这些都是环境中的一部分,可是有些地方没有,这就造成了不同的环境,不同的环境你所能做或是你想做的事就会发生了很大的变化。如你想吃一碗拉面,如果你生活的环境中有提供这样的因素,那么你可以吃到,无论是你自己做还是去食店。可是如果你所处的环境,没有提供你所需的这些因素,那么你就吃不上一碗拉面了。

  为了吃上一碗拉面,你必须要具备有吃拉面的环境因素。自然要运行一段脚本代码,你需要有运行该脚本代码的环境才行,当然这个环境需有可能就是你吃不到拉面的环境,因为环境我们可以选择,就像我们为吃一碗拉面,从你生活的地方跑到一个很远的地方一样。

  什么是环境创建?为何要得到环境?

  经过上面的例子,我想大家知道了为什么要得到这样的环境了,而且代码是个虚拟世界,你的环境可以随心创造,是不是感觉比生活如意多了?

总结

  无论是状态机还是运行环境,脚本引擎所能提供给你的只不过是一种执行方法的途径,LUA脚本发展了这么多年,因其小巧出众得到大家的青睐。如果有空的话,我希望各位也看看这方面的知识吧,我在这里就不讲LUA的什么机制了。

posted @   恋月  阅读(1549)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示