gpt4 book ai didi

c++/openframeworks - 如何在开放框架程序之间切换

转载 作者:行者123 更新时间:2023-11-30 01:25:19 26 4
gpt4 key购买 nike

我正在为需要通过 openFrameworks 运行各种程序的背景的表演艺术家开发程序。他需要一种能够以某种方式轻松地在它们之间切换的方法。有没有什么方法可以创建一个主 shell 来加载或卸载其他 openframeworks 文件?

最佳答案

如果您有办法从客户端终止 RunApp()(通过退出按钮),您可以通过 tcl 或 python 将调用包装在脚本语言中。您最终会得到一个交互式 shell,您可以在其中运行不同的应用程序并设置参数。

为了简单起见,我将省略一些细节并假设我们使用 boost::python 进行语言绑定(bind)。关于此的更详细的阅读在这个article , boost::python 文档是 here .

主要思想是为 OF 创建一个特定领域的语言/一组包装器,它可用于创建 OF 对象并访问它们的方法,通过 shell 以交互方式通过脚本

Boost 对象绑定(bind)大致像这样工作(引自 1):

先用C++定义类

struct World
{
void set(std::string msg) { this->msg = msg; }
std::string greet() { return msg; }
std::string msg;
};

然后,将其公开为 python 模块

#include <boost/python.hpp>
BOOST_PYTHON_MODULE(hello)
{
class_<World>("World")
.def("greet", &World::greet)
.def("set", &World::set)
;
}

在交互式 python session 中看起来像这样:

>>> import hello
>>> planet = hello.World()
>>> planet.set('howdy')
>>> planet.greet()
'howdy'

既然可以包装任何类或方法,那么如何实际利用 OF 就有很多可能性。我在这个答案中指的是 f.e.两个应用程序,App1App2 在 C++/OF 中实现,然后链接到在 python 中的实现。

交互式 session 看起来像这样:

>>> import myofapps
>>> a1 = myofapps.App1()
>>> a2 = myofapps.App2()
>>> a1.run() # blocked here, until the app terminates
>>> a2.run() # then start next app .. and so forth
>>> a1.run()

我不是 OF 黑客,但另一种(更简单的)可能性可能是交互式地改变 f.e. 的内容。 ofApp::draw() 在应用程序中(在线程中运行)。这可以通过在 python 解释器中嵌入自定义对象参数化来完成:

/// custom configurator class

class MyObj {
private int colorRed;

// getter
int getRed () {
return colorRed;
}

// setter
void setRed(int r) {
colorRed = r;
}

/// more getters/setters code
...
};

/// the boost wrapping code (see top of post)
...

/// OF code here

void testApp::draw() {

// grab a reference to MyObj (there are multiple ways to do that)
// let's assume there's a singleton which holds the reference to it
MyObj o = singleton.getMyObj();

// grab values
int red = o.getRed ();

// configure color
ofSetColor(red,0,0,100);

// other OF drawing code here...
}

OF 应用程序运行后,可用于在您的解释器中以交互方式更改颜色:

>>> import myofapps
>>> a1 = myofapps.App1()
>>> c1 = myofapps.MyObj();
>>> a1.run() # this call would have to be made non-blocking by running the
>>> # app in a thread and returning right away
>>> c1.setRed(100);

... after a minute set color to a different value

>>>> c1.setRed(200);

关于c++/openframeworks - 如何在开放框架程序之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12520148/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com