2

我正在编写一个游戏引擎,我想使用Io来编写脚本。该引擎是用纯 C99 编写的,而不是 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);

看起来相当老套(假设它甚至可以工作;我没有尝试过),更不用说可能真的效率低下。

4

1 回答 1

1

根据这个邮件列表线程,可以使用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")));
于 2012-11-09T21:45:53.300 回答