我正在编写一个游戏引擎,我想使用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/