嵌入Io语言:从C调用Io方法

嵌入Io语言:从C调用Io方法,c,game-engine,iolanguage,C,Game Engine,Iolanguage,我正在编写一个游戏引擎,我想用它来编写脚本。引擎是用纯C99编写的,而不是C++。我已经成功地将Io绑定到游戏的一些C函数上,并且运行良好。 但是,我想在C游戏循环中调用Io方法。基本上,我希望加载一个脚本(可能带有IoState\u doFile()),其中包含以下内容 Game init := method(...) Game keypress := method(key, ...) // and update, render, etc 然后,在C游戏循环中,我想调用这些函数,其中一些需要

我正在编写一个游戏引擎,我想用它来编写脚本。引擎是用纯C99编写的,而不是C++。我已经成功地将Io绑定到游戏的一些C函数上,并且运行良好。
但是,我想在C游戏循环中调用Io方法。基本上,我希望加载一个脚本(可能带有
IoState\u doFile()
),其中包含以下内容

Game init := method(...)
Game keypress := method(key, ...)
// and update, render, etc
然后,在C游戏循环中,我想调用这些函数,其中一些需要传递参数。不幸的是,Io的文档很好,但非常稀少。我对IoVM代码进行了一点挖掘,但没有发现任何有用的东西(我可能挖掘得不够努力)。最好的方法是什么?差不多

sprintf(buf, "Game update(%u)", &deltaTime);
IoState_doCString_(buf);
看起来相当粗糙(假设它能工作;我没有尝试过),更不用说可能效率很低。

根据,可以使用
IoObject\u rawDoString\u label()
IoState\u retain\u()
从源代码编译消息,并将其应用于
IoMessage\u locals\u performOn\u()

或者,可以通过
IoMessage\u newWithName\uName()
IoMessage\u setCachedArg\u*()
函数手动构造消息

我没有找到这方面的任何文档,但是可以在中找到相关函数的列表

适用于这种特殊情况的代码是

/* When you initialize everything */
renderMessage = IoObject_rawDoString_label_(IoState_lobby(state),
    IoState_symbolWithCString_(state, "message(Game render())"),
    IoState_symbolWithCString_(state, "[Game render]"));
IoState_retain_(state, renderMessage);

/* In the game loop's render function */
IoMessage_locals_performOn_(renderMessage, IoState_lobby(state), IoState_lobby(state));
对于需要向其传递参数的消息,您需要这样做:

/* When you initialize everything */
updateMessage = IoMessage_newWithName_(state, IoState_symbolWithCString_(state, "update"));
IoState_retain_(state, updateMessage);

/* In the game loop's update function */
IoMessage_setCachedArg_toInt_(updateMessage, 0, deltaTime);
IoMessage_locals_performOn_(updateMessage, IoState_lobby(state),
    IoObject_getSlot_(IoState_lobby(state), IoState_symbolWithCString_(state, "Game")));

看@Christoph你是搜索忍者!(我尝试了雅虎集团,但没有成功。)非常感谢,这看起来正是我想要的。“如果你把它作为一个答案贴出来,我会接受的。”克里斯托夫再看一眼,这似乎只允许我传递硬编码的参数。我会仔细考虑一下,看看是否能让它起作用。@Christoph没关系,我可以(可能)使用
IoMessage\u setCachedArg.*
来使用非硬编码参数。非常感谢!这实际上非常有效。非常感谢你。我真希望我能给你一大笔钱。