2012-11-09 32 views
2

我正在编写游戏引擎,并且我想使用Io来编写脚本。引擎是用纯C99编写的,而不是C++。我已经成功地将Io绑定到游戏的一些C函数中,并且运行良好。
但是,我想在C游戏循环中调用Io方法。从本质上讲,我想加载脚本(可能与IoState_doFile_())含有沿嵌入Io语言:从C调用Io方法

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

线的东西。然后,在C游戏循环,我想调用这些函数,其中一些我需要将参数传递给。不幸的是,Io的文档很好,但却非常稀疏。我已经挖掘了一下IoVM代码,并没有发现任何有用的东西(我可能不够努力)。什么是最好的方法来做到这一点?像

sprintf(buf, "Game update(%u)", &deltaTime); 
IoState_doCString_(buf); 

东西似乎相当hackish的(假设它甚至还可以,我没试过),更不用说真正地大概是低效的。

+0

请参阅http://tech.groups。 yahoo.com/group/iolanguage/message/4471 – Christoph

+0

@Christoph你是一个搜索忍者! (我试过雅虎集团没有成功。)非常感谢,看起来像我正在寻找的东西。如果您将它作为答案发布,我会接受它。 –

+0

@Christoph第二看,似乎只允许我传递硬编码参数。我会仔细研究一下,看看我能否实现这个目标。 –

回答

1

根据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"))); 
+0

您摇滚。非常感谢。 –