プラグイン
それでは早速、プラグインの作り方の解説を始めます。
なお、本解説はVCの取り扱いを心得ていることを前提に記述されています。
★概要の解説
まずは、プラグインを作成する為のテンプレートプロジェクトの概要を解説します。
説明の前に、テンプレートプロジェクトを以下の手順で開いてください。
1.AbyssLibSet.zipを解凍します。
2.PluginTemplateのソリューションファイル(.sln)を開きます。
あなたがVC2005を使用しているのならAbyssLibSet→Src→PluginTemplate→Projects→VC2005を、
あなたがVC2008を使用しているのならAbyssLibSet→Src→PluginTemplate→Projects→VC2008を、
あなたがVC2010を使用しているのならAbyssLibSet→Src→PluginTemplate→Projects→VC2010を、
あなたがVC2012を使用しているのならAbyssLibSet→Src→PluginTemplate→Projects→VC2012を開いてください。
以上の手順で、テンプレートプロジェクトを開けた筈です。
以下に、テンプレートプロジェクトに含まれる各種ファイルの役割を記します。
CMisc.h CMisc.cpp |
プラグインで使用可能な列挙体と構造体 含まれているのはTYPE_SYMBOL、TYPE_TOKEN、TYPE_OPERATOR、TYPE_SEPARATOR、 mystr、vector_mystr、Expression、Token、RubyTextToken、RubyTextTokenLine、TextToken、 TextTokenLine、TextTokenSection |
FMisc.h FMisc.cpp |
プラグインで使用可能な関数 含まれているのはCreateRect |
IOStream.h IOStream.cpp |
プラグインで使用可能な関数とクラス 含まれているのはIIOStream、SaveStringS、SaveMapList、SaveTemplate、LoadStringS、LoadMapList、LoadTemplate |
SimulatedHeap.h | プラグインで使用可能なクラス 含まれているのはISingleHeap、ICommandHeap |
TextStream.h | プラグインで使用可能なクラス 含まれているのはITextStream |
TaskManager.h | プラグインで使用可能な列挙体と構造体とクラス 含まれているのはDRAWTASK_TYPE、DRAWTASK_BLTTYPE、TASKMANAGER_CHPRIORITY、 DrawTask、Sprite、Button、EffectParam、UpdateParam、ITaskManager、ITMAccessor |
TextManager.h | プラグインで使用可能な構造体とクラス 含まれているのはRecord、ITextManager |
InputManager.h | プラグインで使用可能なクラス 含まれているのはIInputManager |
SoundManager.h | プラグインで使用可能なクラス 含まれているのはISoundManager |
DrawManager.h | プラグインで使用可能な列挙体とクラス 含まれているのはTEXTCURSOR、IDrawManager、IDMAccessor |
Command.h | プラグインで使用可能な列挙体と構造体とクラス 含まれているのはCmdParam、ICmd_Base、TYPE_CMD 命令を追加する場合、このファイルを編集する必要があります |
Cmd_Sample.h Cmd_Sample.cpp |
命令を追加した場合のサンプル |
Effect.h Effect.cpp |
プラグインで使用可能な列挙体 含まれているのはEFFECTTYPE 画面効果を追加する場合、このファイルを編集する必要があります |
Update.h Update.cpp |
プラグインで使用可能な列挙体 含まれているのはUPDATETYPE 画面更新を追加する場合、このファイルを編集する必要があります |
index.h | プラグインで使用可能なマクロとヘッダファイルのinclude 含まれているのはABYSSLIB_DLL_VERSION(DLLにおけるABYSSLIB_VERSION)、WARNING |
declare.h declare.cpp |
変数の定義 |
stdafx.h stdafx.cpp |
プリコンパイル済みヘッダ プラグインで使用可能な関数 各種設定 |
AbyssLib.h | プラグインで使用可能な列挙体とクラス 含まれているのはNOVELENGINE_STATE、INovelEngine |
PluginTemplate.cpp | DllMainとエクスポート関数 含まれているのはDllMain、GetAbyssLibDllVersion(エクスポート関数) 命令を追加する場合、このファイルを編集する必要があります 画面効果を追加する場合、このファイルを編集する必要があります 画面更新を追加する場合、このファイルを編集する必要があります 環境設定の保存/読み込みを追加する場合、このファイルを編集する必要があります ローカルデータの保存/読み込みを追加する場合、このファイルを編集する必要があります 描画タスク追加関数を追加する場合、このファイルを編集する必要があります 描画タスク処理関数を追加する場合、このファイルを編集する必要があります 描画関数を追加する場合、このファイルを編集する必要があります |
★命令を追加
命令を追加する方法を、ここでは解説します。
Command.h
初めに、追加する命令の列挙型を記述します。
既に宣言されている列挙型は、BasicCommands.dll内で使用されている列挙型です。
よって、追加する命令の列挙型は既に宣言されているものと重複しないようにしなければなりません。
具体的には1***〜429467***といった感じで、自分が使用する上位6桁を適当に設定するのがいいでしょう。
(0***(0〜999)はBasicCommands.dll内で使用する可能性があります、また他の人のプラグインと列挙型が重複しないよう注意してください)次に、追加する命令のクラスを記述したファイル(以下、"Cmd_xxx.h"とする)をincludeしてください。
具体例は、Command.hを参照してください。
Cmd_xxx.h
Cmd_xxx.cppはじめに、追加する命令クラスを記述します。
命令クラスは、ICmd_Baseの派生型にし、コンストラクタで行うべき処理をInitializeメンバ関数に記述し、
デストラクタを実装せずデストラクタで行うべき処理をSuicideメンバ関数に委譲し記述するようにしてください。
以下に命令クラスの実装に関する簡単な説明を記します。
コンストラクタ クラスの初期化を実装してください デストラクタ 絶対に実装しないでください Initialize クラスの初期化を実装してください(不必要な場合は省略可能です)
(※ただし、メンバ変数の初期化は一時変数を除き行わないでください)Suicide デストラクタで行うべき処理とdelete(this);を実装してください Run 命令実行時の処理を実装してください SetParam 命令に引数が渡された時の処理(メンバ変数への割り当て等)を実装してください(不必要な場合は省略可能です) GetID 命令の種類を表す列挙型を取得する処理を実装してください デバッグ時に命令の内容を表示する処理を実装してください Save セーブ時に必要な値をファイルに書き込む処理を実装してください(不必要な場合は省略可能です) Load ロード時に必要な値をファイルから読み込む処理を実装してください(不必要な場合は省略可能です) 次に、命令クラスのFactory関数(呼び出しに対してnewで生成した命令クラスを返す関数)を記述してください。
基本的には例に従い、return(new 命令クラス);でOKです。最後に、命令クラスの解析関数(コンパイラで構文を解析する時に用いる関数)を記述してください。
解析関数の記述の仕方は、解析関数の記述方法を参照してください。具体例はCmd_Sample.hおよびCmd_Sample.cpp、またはBasicCommandsを参照してください。
PluginTemplate.cpp
初めに、命令クラスのFactory関数と列挙型を関連付けます。
RegisterPFactory(列挙型, Factory関数の関数ポインタ);でOKです。次に、命令クラスの解析関数と列挙型を関連付けます。
RegisterPAnalysis(列挙型, 解析関数の関数ポインタ);でOKです。次に、命令の識別子("if"など)と列挙型を関連付けます。
RegisterPCommandName(識別子, 列挙型);でOKです。最後に、実行中に入力受付(ボタンやメニューへのアクセス)が有効な命令の列挙型を登録します。
RegisterPEnableSystemCommand(列挙型);でOKです。具体例はBasicCommandsを参照してください。
★画面効果を追加
画面効果を追加する方法を、ここでは解説します。
Effect.h
Effect.cpp初めに、追加する画面効果の列挙型を記述します。
既に宣言されている列挙型は、BasicCommands.dll内で使用されている列挙型です。
よって、追加する画面効果の列挙型は既に宣言されているものと重複しないようにしなければなりません。
具体的には1***〜429467***といった感じで、自分が使用する上位6桁を適当に設定するのがいいでしょう。
(0***(0〜999)はBasicCommands.dll内で使用する可能性があります、また他の人のプラグインと列挙型が重複しないよう注意してください)次に、追加する画面効果関数を記述します。
グラフィック機能に対するアクセスはITaskManagerやITMAccessor、IDrawManagerやIDMAccessorを介して行います。具体例はEffect.hおよびEffect.cpp、またはBasicCommandsを参照してください。
PluginTemplate.cpp
画面効果関数と列挙型を関連付けます。
RegisterPEffect1(列挙型, 画面効果関数の関数ポインタ);、RegisterPEffect2(列挙型, 画面効果関数の関数ポインタ);、
RegisterPEffect3(列挙型, 画面効果関数の関数ポインタ);でOKです。
RegisterPEffect1とRegisterPEffect2とRegisterPEffect3では画面効果関数の実行されるタイミングが異なります、
RegisterPEffect1は描画タスクリスト構築後、RegisterPEffect2はテキストウインドウ描画前、RegisterPEffect3はテキストウインドウ描画後です。
画面効果関数を実行させたいタイミングで、RegisterPEffect1かRegisterPEffect2かRegisterPEffect3かを判断してください。
画面効果関数を実行させたくないタイミングには、空関数と列挙型を関連付けてください(忘れるとランタイムエラーです、注意!)例:テキストウインドウ描画後に実行される画面効果関数Effect_Flashの場合(Effect_Nopは空関数)
RegisterPEffect1(EFFECTTYPE_FLASH , *Effect_Nop);
RegisterPEffect2(EFFECTTYPE_FLASH , *Effect_Nop);
RegisterPEffect3(EFFECTTYPE_FLASH , *Effect_Flash);具体例はBasicCommandsを参照してください。
★画面更新を追加
画面更新を追加する方法を、ここでは解説します。
Update.h
Update.cpp初めに、追加する画面更新の列挙型を記述します。
既に宣言されている列挙型は、BasicCommands.dll内で使用されている列挙型です。
よって、追加する画面更新の列挙型は既に宣言されているものと重複しないようにしなければなりません。
具体的には1***〜429467***といった感じで、自分が使用する上位6桁を適当に設定するのがいいでしょう。
(0***(0〜999)はBasicCommands.dll内で使用する可能性があります、また他の人のプラグインと列挙型が重複しないよう注意してください)次に、追加する画面更新関数を記述します。
グラフィック機能に対するアクセスはITaskManagerやITMAccessor、IDrawManagerやIDMAccessorを介して行います。具体例はUpdate.hおよびUpdate.cpp、またはBasicCommandsを参照してください。
PluginTemplate.cpp
画面更新関数と列挙型を関連付けます。
RegisterPUpdate(列挙型, 画面更新関数の関数ポインタ);でOKです。具体例はBasicCommandsを参照してください。
★環境設定の保存/読み込みを追加
環境設定の保存/読み込みを追加する方法を、ここでは解説します。
以下を行うことで、命令などの追加によって実装した新要素のパラメータを環境設定に保存/読み込みすることが可能となります。
xxx.h
xxx.cpp初めに、保存関数と読み込み関数を作成します。
引数はINovelEngineクラスのポインタ、戻り値はvoid型となります。
Save〜関数またはLoad〜関数で変数の保存と読み込みを実装してください。PluginTemplate.cpp
保存関数と読み込み関数をEXE側にエクスポートします。
RegisterPSaveEnvironmentDataFunc(プラグイン名, 保存関数の関数ポインタ);または
RegisterPLoadEnvironmentDataFunc(プラグイン名, 読み込み関数の関数ポインタ);でOKです。具体例はBasicCommandsを参照してください。
★ローカルデータの保存/読み込みを追加
ローカルデータの保存/読み込みを追加する方法を、ここでは解説します。
以下を行うことで、命令などの追加によって実装した新要素のパラメータをローカルデータに保存/読み込みすることが可能となります。
xxx.h
xxx.cpp初めに、保存関数と読み込み関数を作成します。
引数はINovelEngineクラスのポインタ、戻り値はvoid型となります。
Save〜関数またはLoad〜関数で変数の保存と読み込みを実装してください。PluginTemplate.cpp
保存関数と読み込み関数をEXE側にエクスポートします。
RegisterPSaveLocalDataFunc(プラグイン名, 保存関数の関数ポインタ);または
RegisterPLoadLocalDataFunc(プラグイン名, 読み込み関数の関数ポインタ);でOKです。具体例はBasicCommandsを参照してください。
★描画タスク追加関数を追加
描画タスク追加関数を追加する方法を、ここでは解説します。
以下を行うことで、様々な種類の描画タスクを取り扱う事が可能になります。
xxx.h
xxx.cppはじめに、描画タスク追加関数を作成します。
引数はINovelEngineクラスのポインタとDrawTask構造体のconst参照、戻り値はvoid型となります。
描画タスクの種類に応じた描画タスク追加関数を実装してください。
注意点として、最終的に描画タスクリストに描画タスクを追加する際にはPushTaskListIMを使用します。
(PushTaskListを使用すると、PushTaskList→作成した関数→PushTaskList→……の無限ループになります)PluginTemplate.cpp
描画タスク追加関数をEXE側にエクスポートします。
RegisterPAddDrawTaskFunc(描画タスクの種類, 描画タスク追加関数の関数ポインタ)でOKです。
★描画タスク処理関数を追加
描画タスク処理関数を追加する方法を、ここでは解説します。
以下を行うことで、様々な種類の描画タスクを取り扱う事が可能になります。
xxx.h
xxx.cppはじめに、描画タスク処理関数を作成します。
引数はINovelEngineクラスのポインタとDrawTask構造体のconst参照、戻り値はvoid型となります。
描画タスクの種類に応じた描画タスク処理関数を実装してください。PluginTemplate.cpp
描画タスク処理関数をEXE側にエクスポートします。
RegisterPDrawTaskFunc(描画タスクの種類, 描画タスク処理関数の関数ポインタ)でOKです。
★描画関数を追加
描画関数を追加する方法を、ここでは解説します。
以下を行うことで、様々な種類の転送方法を取り扱う事が可能になります。
xxx.h
xxx.cppはじめに、描画関数を作成します。
引数はINovelEngineクラスのポインタとDrawTask構造体のconst参照、戻り値はvoid型となります。
転送方法の種類に応じた描画関数を実装してください。PluginTemplate.cpp
描画関数をEXE側にエクスポートします。
RegisterPBltFunc(転送方法の種類, 描画関数の関数ポインタ)でOKです。
以上でプラグインの説明は終了です、作成する場合にはBasicCommandsも参考にしてください。