[原][译][lua][luabridge]一个简单的luabridge与c++例子结合例子
参考:https://eliasdaler.wordpress.com/tag/luabridge/
https://eliasdaler.wordpress.com/2015/08/10/using-lua-and-cpp-in-practice/
1. ECS和基本原理介绍
本译文主要说明以下几点:
实体的创建和其他基本的东西(你正在阅读这篇文章了)
如何实现实体的创建
Lua状态管理和清理
脚本状态机
事件和回调
先看看c++代码创建实体:
Entity e;
auto gc = new GraphicsComponent;
gc->setSprite(entitySprite);
... // setting component properties
e.addComponent(gc);
...
再看看lua脚本的例子:

注意,该脚本不会创建一个实体。它只是用来获取数据设置不同的元件参数,然后在C++中创建实体。我创建使用脚本模板的信息实体,然后创建该实体类的实例通过复制。这里就是的实体创建的正常方式:
当加载模板实体:
从脚本中获取实体列表
获取列表关键值组
创建的每个组件,通过相应的表格组件的构造函数
创建这种类型的其他实体时
复制每一组件模板实体
分配这个实体的独特的性质(位置、状态等)
为什么我没有暴露的组件类Lua?
很容易地创建Lua luabridge C++对象:
someObject = SomeClass()
所以为什么我用表和创建C++而不是创造了他们在Lua的成分?有很多原因:
这样看起来简单的脚本
想象一下,如果脚本看起来像这样:
tree = function()
gc = GraphicsComponent()
gc.setFilename("res/images/tree.png")
gc.setZ()
gc.setAnimated(false)
gc.setFrame(, , , ) cc = CollisionComponent()
cc.setType("Solid")
cc.setBoundingBox(, , , ) tree = Entity()
tree.addComponent(gc)
tree.addComponent(cc)
return tree
end
我不认为这个剧本看起来比我之前更容易。它可能很难阅读,理解和改变非程序员。
没有必要对Lua在都知道组件。这是更好地隐藏实现细节在C++
这里的一个例子,我怎么能在我的游戏脚本设置动画:
setAnimation(entity, "some_animation")
这个调用这个函数,在C++:
void setAnimation(Entity* e, const std::string& animationName) {
    auto gc = e->get<GraphicsComponent>();
    if(gc) {
        gc->setAnimation(animationName);
    } else {
        ... // write about error in a log!
    }
}
想象一下,如果我不得不这样做在Lua,每次我想设置一些动画:
gc = entity.get("GraphicsComponent")
if(gc ~= nil) then
    gc.setAnimation("some_animation")
else
    ... -- print about error
end
不那么容易了。我在Lua做错误检查。我觉得好了很多,在C++做隐藏实现细节有。有些功能可能更复杂的C++但看在Lua很简单。写作错误检查在Lua会使脚本混淆和容易出错的。
你可以通过移动一些实体声明为JSON、XML、二进制文件优化实体创作
你可能注意到Lua表提出之前没有的信息,不能存储JSON或XML。这是真的。如果你在C++中创建每个组件和实体,你可以移动实体的描述从Lua到JSON或XML加快速度容易。
所以使用Lua还有什么意义呢?Lua是用于实体添加不同的功能使得脚本非常愉快,让我把很多代码在Lua而不是C++。这是很可怕的,因为它让我轻易改变实体的行为没有重新编译和铁杆少了很多。我甚至可以改变实体的属性和功能,而游戏仍在运行!这难道不好吗?
用lua实现实体行为的脚本:
这里有一个例子当Lua函数用于提供不同的实体的行为。例如,不同的企业有不同的反应,碰撞。假如我想创造一个可爱的鬼,脸红时,一些实体碰撞(它也破坏了它。这是荒谬的,但是,嘿,这只是一个例子!)。这里是看它如何在脚本:

它的工作原理是:当CollisionSystem发现了一个碰撞的两个实体之间的碰撞,它调用一个函数存储在实体的collisioncomponent。并通过两个参数的函数:这–指针的类型,这个函数属于实体,二–指向实体相撞点(这是一个名字一变我用的,不是一个Lua关键词!)
[原][译][lua][luabridge]一个简单的luabridge与c++例子结合例子的更多相关文章
- 使用lua实现一个简单的事件派发器
		
设计一个简单的事件派发器,个人觉得最重要的一点就是如何保证事件派发过程中,添加或删除同类事件,不影响事件迭代顺序和结果,只要解决这一点,其它都好办. 为了使用pairs遍历函数,重写了pairs(lu ...
 - lua定义一个简单的类
		
classA.lua: classA = { a = , b = , --__index = classA; }; classA.__index = classA; function classA:n ...
 - 【原】shell编写一个简单的jmeter自动化压测脚本
		
在公司做压力测试也挺长时间了,每次测试前环境数据准备都需要话费较长时间,所以一直在考虑能不能将整个过程实现自动化进行,于是就抽空写了一个自动化脚本,当然这个脚本目前功能十分简陋,代码也不完善,很有很多 ...
 - 写了一个简单的NodeJS实现的进程间通信的例子
		
1. cluster介绍 大家都知道nodejs是一个单进程单线程的服务器引擎,不管有多么的强大硬件,只能利用到单个CPU进行计算.所以,有人开发了第三方的cluster,让node可以利用多核CPU ...
 - 【Linux】一个简单的线程创建和同步的例子
		
最近很多精力在Linux上,今天简单看了一下Linux上的线程和同步,其实不管windows还是Linux,OS层面的很多原理和概念都是相同的,很多windows之上的经验和概念完全可以移植到Linu ...
 - 一个简单的安卓+Servlet图片上传例子
		
例子比较 简单,服务端为Java Web Servlet,doPost方法中接收图片并保存,然后将保存的图片名返回给客户端,关键代码: @SuppressWarnings("deprecat ...
 - 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
		
原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...
 - 基础项目构建,引入web模块,完成一个简单的RESTful API 转载来自翟永超
		
简介 在您第一次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复粘贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot ...
 - 如何创建一个简单的C++同步锁框架(译)
		
翻译自codeproject上面的一篇文章,题目是:如何创建一个简单的c++同步锁框架 目录 介绍 背景 临界区 & 互斥 & 信号 临界区 互斥 信号 更多信息 建立锁框架的目的 B ...
 
随机推荐
- JAVA 实现XML与JSON 相互转换
			
原文地址https://blog.csdn.net/congcong68/article/details/39029907 在工作中,经常碰到XML转为JSON或者JSON转为XML,在这过程中有时嵌 ...
 - cocos代码研究(5)Action学习笔记
			
理论部分 Action类也是cocos核心基础类之一,在游戏中起着非常重要的作用,继承自Ref,被 FiniteTimeAction(有限时间动作), Follow , 以及 Speed 继承. 有限 ...
 - Integer类之equals与hashCode
			
一.源码. 1.equals源码.可以看出,比较的是两者的类型相同且内容相同.即是否有相等的int类型的value值. ######################################## ...
 - VS2010中如何实现自定义MFC控件
			
本文简要讲解在VS2010中怎样实现自定义MFC控件的知识,以下是分步骤说明. 一.自定义一个空白控件 1.先创建一个MFC工程 NEW Project-->MFC-->MFC Appl ...
 - git参考文档
			
==================================================================================================== ...
 - Python: Flask框架简单介绍
			
接触Python之后我第一次听说Flask,我就根据自己搜罗的知识尽可能简洁的说出来.如果不准确的地方还请指正,谢谢. Flask是什么? Flask是基于Python编写的微 ...
 - 页面点击,不是a标签也会刷新原因
			
页面点击,不是a标签也会刷新原因 点击事件冒泡,触发了a链接导致整个页面刷新了.直接阻止 事件冒泡即可 例子: $("tr .am-text-danger").click(func ...
 - Linux基础命令---ziinfo
			
zipinfo 在不解压的情况下,获取zip压缩文件的的详细信息.zipinfo列出了ZIP档案中有关文件的技术信息,最常见的是在MS-DOS系统上.这些信息包括文件访问权限.加密状态.压缩类型.版本 ...
 - python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL
			
python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...
 - cojs 二分图计数问题1-3 题解报告
			
OwO 良心的FFT练手题,包含了所有的多项式基本运算呢 其中一部分解法参考了myy的uoj的blog 二分图计数 1: 实际是求所有图的二分图染色方案和 我们不妨枚举这个图中有多少个黑点 在n个点中 ...