zoukankan      html  css  js  c++  java
  • [原][译][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(0)
        gc.setAnimated(false)
        gc.setFrame(64, 0, 64, 74)
         
        cc = CollisionComponent()
        cc.setType("Solid")
        cc.setBoundingBox(14, 60, 32, 10)
         
        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关键词!)

  • 相关阅读:
    Linux效劳器装机安全快速进阶指南(6)
    VLC 0.8.6b
    Mesk:简洁而朴实的音乐播放器
    OpenOffice.org最先支持微软docx等技俩
    Rawstudio-轻松转换 RAW 图片
    Transmission 0.70
    Openoffice3.0: 微软Office的解散者?
    AcetoneISO:Linux 下的“Daemon Tools”
    OpenOffice3将支撑PDF编纂及ac琐屑
    Linux的主动实行措施cron和crontab(1)
  • 原文地址:https://www.cnblogs.com/lyggqm/p/7086155.html
Copyright © 2011-2022 走看看