前節では、HD.version.SDKからIronPythonを呼び出すサンプルでした。 ここでは、HD.version.SDKの値そのものをIronPythonとやりとりする例をみてみましょう。
HD.version.SDKのほとんどすべてのインスタンス(クラスオブジェクト)は、 CLI(CLR)に沿ったものですので、IronPythonとインスタンスやクラスをやり取りし、 直接情報を扱うことが出来ます。
#include "天翔記クラス.h" #include "天翔記クラス_初期化.h" using namespace System::Collections; using namespace IronPython::Hosting; using namespace Microsoft::Scripting::Hosting; ref class GREF { public: static ScriptEngine^ pe; static ScriptScope^ scope; }; void 天翔記クラス::On_ゲームウィンドウ起動時() { try { GREF::pe = Python::CreateEngine(); // ファイルを実行。 GREF::scope = GREF::pe->ExecuteFile("script.py"); } catch (Exception^ e) { デバッグ出力 << e->Message << endl; } } void 天翔記クラス::On_戦略_軍団ターン変更時(int 軍団番号) { // スクリプトエラー等をキャッチできるようにしよう。 try { // 「武将」のインスタンスを引数として、渡して、ArrayList^型を受け取る。 // ArrayList型の各要素は、武将情報型 (=武将->配列[i]の1人の武将分の型)とする。 auto funcDoBushouSomething = GREF::pe->Operations->GetMember< Func<武将リスト情報型^, ArrayList^>^ >(GREF::scope, "DoBushouSomething"); ArrayList^ blist = funcDoBushouSomething(武将); for each (Object^ o in blist) { 武将情報型^ b = (武将情報型^)o; デバッグ出力 << b->姓名 << endl; } } catch (Exception^ e) { デバッグ出力 << e->Message << endl; } }
「武将」クラスオブジェクトを受け取って、50歳を超える年齢の武将だけをArrayListに追加して返しています。
# coding: cp932 from System.Collections import * def DoBushouSomething(武将): blist = [] for b in 武将.配列: if b.年齢 > 50: blist.append(b) blist_array = ArrayList(blist) return blist_array
以上となります。
今回の例をみてもわかるように、HD.versino.SDKのほどんど全てのクラスオブジェクトは IronPython側のスクリプトでも直接操作可能です。