我正在编写一个游戏引擎,我想使用Io来编写脚本引擎是用纯的,而不是C++编写的。我已经成功地将Io绑定到了游戏的一些C函数上,并且运行良好。
不过,我想在C游戏循环中调用Io方法实际上,我想加载一个脚本(可能带有IoState_doFile_()),其中包含

Game init := method(...)
Game keypress := method(key, ...)
// and update, render, etc

然后,在C游戏循环中,我想调用这些函数,其中一些函数需要传递参数不幸的是,Io的文档很好,但是非常稀少我仔细研究了IoVM代码,没有发现任何有用的东西(我可能挖掘得不够努力)最好的方法是什么有点像
sprintf(buf, "Game update(%u)", &deltaTime);
IoState_doCString_(buf);

似乎有点老套(假设它甚至有效;我还没试过),更不用说可能真的效率很低。

最佳答案

根据this mailing-list thread,可以使用IoObject_rawDoString_label_()IoState_retain_()从源代码编译消息并将其与IoMessage_locals_performOn_()一起应用。
或者,可以通过IoMessage_newWithName_()IoMessage_setCachedArg_*()函数手动构造消息。
我没有找到任何相关的文档,但是相关函数的列表可以在IoMessage.h中找到。
适用于这种特殊情况的代码是

/* 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")));

关于c - 嵌入Io语言:从C调用Io方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13314641/

10-11 22:35