绘图循环和Lua (Luabridge)

我目前遇到了一些问题,不知道该如何解决。

我开始使用SFML进行渲染和Lua作为我的脚本语言来制作一个简单的2D引擎,Lua代码加载之前先显示一个启动页面...

我的问题是我不知道如何为我的Lua对象编写一个"良好"的绘图循环。 也许当我们看一下我的代码时,您会明白:

Main.cpp:

...

int draw_stuff()
{
    sf::RenderWindow window(sf::VideoMode(640, 480), TITLE);

    while (window.isOpen()) {

        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

    window.clear();

    if (!success) {
        window.draw(sp_splash_screen);
    }

    if (clock.getElapsedTime().asSeconds() > 2) {

        for (static bool first = true; first; first = false)
        {
            std::thread thr(&lua_module);
            thr.detach();

            success = true;
        }
    }

    for (sf::CircleShape obj : CircleDrawList) {
        window.draw(obj);
        //window.draw(CircleDrawList.front());
    }

    }

    return 0;
}

我的Lua圆形形状包装类:

/////shapes.h

extern std::list<sf::CircleShape> CircleDrawList;

class Circle
{
public:

    Circle();

         ...

    void draw();

private:
    sf::CircleShape circleShape;

protected:
    //~Circle();();
};

/////shapes.cpp

std::list<sf::CircleShape> CircleDrawList;

 ...

void Circle::draw()
{
    //std::cout << "DRAW IN LIST" << std::endl;

    CircleDrawList.push_front(circleShape);
    //if (drawableList.size() == 4)
        //drawableList.pop_front();
}

 ...

int luaopen_shapes(lua_State *L)
{
    luabridge::getGlobalNamespace(L)
        .beginClass<Circle>("Circle")
        .addConstructor <void(*) (void)>()

                 ... "other stuff to register" ...

        .addFunction("draw", &Circle::draw)
        .endClass();

    return 1;
}

最后(如果需要)我的lua脚本:

local ball = Circle()
ball:setColor(255,0,0,255)

while true do

    ball:draw()

end

当Lua Circle形状通过增加Vector2值之一移动时的结果:

enter image description here

希望您能帮忙并且我描述得很好:x

谢谢:)

--在main.cpp中更新的代码

点赞
用户2581119
用户2581119

我不确定发生了什么事,但我在代码中看到了一些问题。

首先:你没有从 CircleDrawList 中移除“旧的” CircleShapes。

在函数 Circle::draw() 中,你使用 CircleDrawList.push_front(circleShape); 将对象添加到列表的前面,但你从来没有将任何东西从中移除。使用 CircleDrawList.front() 可以访问到第一个元素,但你必须使用 pop_front() 方法将其移除。

第二件事。看看这段代码:

//通过range-for遍历整个列表:
for (sf::CircleShape obj : CircleDrawList)
{
    //为什么要使用 CircleDrawList.front()?
    //这里可能应该使用 obj!
    window.draw(CircleDrawList.front());
}

目前这段代码会将列表的第一个元素绘制 n 次,其中 n 是 CircleDrawList 的长度。你真的想这么做吗?

此外,你每帧都在绘制 splash。如果你只想在开始时显示 splash,那么该行代码 window.draw(splash_screen); // 在加载 Lua 脚本之前显示 splash 屏幕 可能应该在某种条件指令中。

我不知道在绘制 splash_screen 和绘制 circles 之间存在什么内容。这可能会对我们在屏幕上看到的内容产生一些影响。

还有一件事:强烈建议避免使用全局变量。CircleDrawList 是一个全局变量,我的建议是将其至少放在某个命名空间中,甚至最好将其封装在某个类中。

2016-07-12 12:25:43