[PR]テレビ番組表
今夜の番組チェック

プラグイン

 

それでは早速、プラグインの作り方の解説を始めましょう。
なお、当チュートリアルはVCの取り扱いを心得ている事を前提に記述されています。

★概要の解説

まずは、プラグインを作成する為のテンプレートプロジェクトの概要を解説します。
説明の前に、テンプレートプロジェクトを以下の手順で開いてください。

1.AbyssLibSet.zipを解凍します。

2.PluginTemplateのソリューションファイル(.sln)を開きます。
 あなたがVC2003を使用しているのならAbyssLibSet→Src→PluginTemplate→Projects→VC2003を、
 あなたがVC2005を使用しているのならAbyssLibSet→Src→PluginTemplate→Projects→VC2005を、
 あなたがVC2008を使用しているのならAbyssLibSet→Src→PluginTemplate→Projects→VC2008を開きましょう。

以上の手順で、テンプレートプロジェクトを開けた筈です。
以下に、テンプレートプロジェクトに含まれる各種ファイルの役割を記します。

CMisc.h
CMisc.cpp
プラグインで使用可能な列挙体と構造体
含まれているのはTYPE_SYMBOLTYPE_TOKENTYPE_OPERATORTYPE_SEPARATOR
mystrvector_mystrExpressionTokenRubyTextTokenRubyTextTokenLineTextToken
TextTokenLineTextTokenSection
FMisc.h
FMisc.cpp
プラグインで使用可能な関数
含まれているのはSaveStringSSaveMapListLoadStringSLoadMapListSaveTemplate
LoadTemplateCreateRect
SimulatedHeap.h プラグインで使用可能なクラス
含まれているのはISingleHeapICommandHeap
TextStream.h プラグインで使用可能なクラス
含まれているのはITextStream
TaskManager.h プラグインで使用可能な列挙体と構造体とクラス
含まれているのはDRAWTASK_TYPEDRAWTASK_BLTTYPETASKMANAGER_CHPRIORITY
DrawTaskSpriteButtonEffectParamUpdateParamITaskManagerITMAccessor
TextManager.h プラグインで使用可能な構造体とクラス
含まれているのはRecordITextManager
InputManager.h プラグインで使用可能なクラス
含まれているのはIInputManager
SoundManager.h プラグインで使用可能なクラス
含まれているのはISoundManager
DrawManager.h プラグインで使用可能な列挙体とクラス
含まれているのはTEXTCURSORIDrawManagerIDMAccessor
Command.h プラグインで使用可能な列挙体と構造体とクラス
含まれているのはCmdParamICmd_BaseTYPE_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
プリコンパイル済みヘッダ

プラグインで使用可能な関数
含まれているのはnewdelete

各種設定
パディング、動作環境、警告の抑制、ヘッダのinclude、名前空間のusing

AbyssLib.h プラグインで使用可能な列挙体とクラス
含まれているのはNOVELENGINE_STATEINovelEngine
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 命令の種類を表す列挙型を取得する処理を実装してください
Print デバッグ時に命令の内容を表示する処理を実装してください
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で使用する可能性があります、また他の人のプラグインと列挙型が重複しないよう注意してください)

次に、追加する画面効果関数を記述します。
グラフィック機能に対するアクセスはITaskManagerITMAccessorIDrawManagerIDMAccessorを介して行います。

具体例は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で使用する可能性があります、また他の人のプラグインと列挙型が重複しないよう注意してください)

次に、追加する画面更新関数を記述します。
グラフィック機能に対するアクセスはITaskManagerITMAccessorIDrawManagerIDMAccessorを介して行います。

具体例はUpdate.hおよびUpdate.cpp、またはBasicCommandsを参照してください。

PluginTemplate.cpp

画面更新関数と列挙型を関連付けます。
RegisterPUpdate(列挙型, 画面更新関数の関数ポインタ);でOKです。

具体例はBasicCommandsを参照してください。

 

以上でプラグインの説明は終了です、作成する場合にはBasicCommandsも参考にしてください。