2

ゲームエンジンを書いていますが、スクリプトにIoを使用したいと思います。エンジンはC++ではなく純粋なC99で書かれています。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 に答える