[FKUTリファレンスマニュアル]


0.はじめに

FKUTはFK ToolKitを利用したプログラミングをサポートする補助ライブラリです。
FKは汎用性を非常に重視した設計になっている反面、
複数のクラスインスタンスをバインドしたり、組み合わせる必要があります。
このような構造によって多目的に運用できるシステムになっているのですが、
プログラミング初学者にとっては若干扱いが困難な面もあります。
(それでもフルスクラッチでプログラムするよりは遙かに簡単ですが)

これを緩和するため、FKをラッピングして扱いを簡便にしたTinyFKというシステムを
FK ToolKitでは内包しています。しかし、これはプログラミング初学者向けという点に
強くフォーカスした設計になっており、FK本来のプログラミングスタイルとは異なる
コーディングが必要になります。FKの機能をフルに引き出すことが出来ないので、
ある程度以上の規模のゲームアプリケーションを作るのには不向きです。

そこで、FKUTは次に掲げる点をクリアするために作成しました。
・初学者に配慮して、最低限必要なコーディング量を大幅に削減する。
・FKを用いたプログラミングにおける定番の処理や便利機能を提供する。
・FKUTで提供する機能は必要なものだけを取捨選択できるようにする。
これらにより、必要な機能だけを選択して用い、それ以外は自力でコーディングする、
といった運用が可能になります。最初は初学者向けの便利クラスを利用して学習し、
段階的にFK本来のスタイルへ移行していくことも容易です。

FKUTで提供するクラスは、主に次に挙げるものになります。

・fkut_SimpleWindow :ウィンドウを表すクラス

・fkut_BlockModel :直方体形状モデルを表すクラス
・fkut_SphereModel :球体形状モデルを表すクラス
・fkut_PrismModel :角柱形状モデルを表すクラス
・fkut_ConeModel :錐体形状モデルを表すクラス

・fkut_SpriteModel :画像・文字列板モデルを表すクラス

・fk_AudioStream :オーディオ再生クラス(Oggストリーミング)
・fk_AudioOggBuffer :オーディオ再生クラス(Oggオンメモリ)
・fk_AudioWavBuffer :オーディオ再生クラス(Wavオンメモリ)

・fkut_Performer :FK Performerでモーション付けしたキャラクターを扱うクラス

これらを利用するだけで、3DCGと2D画像&文字表示を行い、
音の再生を伴ったアプリケーションが作成可能です。


1.クラスリファレンス

・fkut_SimpleWindow :ウィンドウを表すクラス

[FK使用者向け情報]
SimpleWindowは、Fl_Window、fk_Window、fk_Sceneを複合したクラスです。

[ウィンドウ設定関数]
void setWindowName(const string &name);
ウィンドウのタイトルバーに表示する文字列を変更します。
デフォルトは"FKUT Window"です。
void setSize(int w, int h);
ウィンドウサイズを変更します。3DCG描画領域も同じサイズに変更します。
デフォルトは512x512です。
void setInnerSize(int x, int y, int w, int h);
ウィンドウの内部に持つ3DCGの描画領域の位置とサイズを変更します。
マルチウィンドウを実現する際の調整用関数なので、上級者向けです。
void setBGColor(double r, double g, double b);
3DCG描画領域の背景色をRGBの色値ブレンドで指定します。各成分は0.0~1.0の実数値です。
デフォルトは黒(0.0, 0.0, 0.0)です。
void setFPS(int fps);
update()をコールした際に調整するFPSを指定します。
デフォルトは60です。
void setTrackBallMode(bool mode);
マウスの右ドラッグとホイール操作でカメラを自由に操作できるモードをON(true)/OFF(false)します。
デフォルトはOFF(false)です。

[座標ガイド関数]
void showGuide(fkut_GuideMode mode = FKUT_AXIS_X | FKUT_AXIS_Y | FKUT_AXIS_Z | FKUT_GRID_XZ);
画面内の座標系を表すグリッドと軸を指定します。
FKUT_AXIS_X, FKUT_AXIS_Y, FKUT_AXIS_Zがそれぞれの軸を、
FKUT_GRID_XZ, FKUT_GRID_XY, FKUT_GRID_YZがそれぞれの平面を表すグリッドに対応します。
複数の要素を指定したい場合は | で区切って指定できます。
FKUT_NO_GUIDEで全て非表示に、FKUT_ALL_GUIDEで全ての軸・グリッドを表示します。
引数を省略した場合は、XYZの各軸とXZ平面のグリッドを表示します。
デフォルトでは全て非表示(FKUT_NO_GUIDE)です。
void hideGuide(void);
showGuide()で表示した軸とグリッドを消去します。
showGuide(FKUT_NO_GUIDE)と等価です。
void setGuideAxisWidth(double width);
showGuide()で表示する軸の太さを指定します。
デフォルトは4.0です。
void setGuideGridWidth(double width);
showGuide()で表示するグリッドの太さを指定します。
デフォルトは1.0です。
void setGuideScale(double scale);
showGuide()で表示するグリッドの1辺の長さを指定します。
デフォルトは5.0です。
void setGuideNum(int num);
showGuide()で表示するグリッドの軸方向あたりの個数を指定します。
デフォルトは20です。

[カメラ制御関数]
void setCameraPos(double x, double y, double z);
現在ウィンドウが制御しているカメラの位置を指定した座標に移動します。
void setCameraFocus(double x, double y, double z);
現在ウィンドウが制御しているカメラの向きを指定した座標に向くよう姿勢変更します。
void setCameraModel(fk_Model &model);
ウィンドウに対して、別のfk_Model(及びその派生クラス)のオブジェクトをカメラとしてセットします。
void setCameraDefault(void);
ウィンドウが制御するカメラを、デフォルトで内部に保持しているfk_Modelのインスタンスに戻します。
fk_Model* getCameraModel(void);
現在ウィンドウで制御しているカメラモデルのポインタを取得します。

[モデルの表示登録・解除関数]
void entry(fk_Model &model);
void entry(fkut_SpriteModel &model);
void entry(CMotionCharactor &chara);
ウィンドウに対してモデルを登録し、表示するようにします。
描画順は登録した順になるので、前後関係が微妙な場合は後から登録したモデルによって上書きします。
一度登録したモデルを再度登録した場合は、以前に登録した順番はキャンセルされ、最後尾に回ります。

[FK利用者向け情報]
FKではポインタ渡しにしている部分をFKUTでは参照渡しにしている場合があります。

void remove(fk_Model &model);
void remove(fkut_SpriteModel &model);
void remove(CMotionCharactor &chara);
ウィンドウからモデルの登録を解除し、表示されないようにします。
登録していないモデルを指定した場合は何も起きません。

void open(void);
ウィンドウを開いて表示します。
表示しないことには何も始まらないので、諸々の初期設定が済んだら必ずopen()してください。
void close(void);
ウィンドウを閉じます。
通常は終了と同時に自動的に閉じられるので、明示的に呼ぶ必要はありません。
void toFullscreen(void);
ウィンドウをフルスクリーン化します。
正しく表示するためには、ウィンドウサイズがモニタ側で対応しているサイズと一致している必要があります。
すでにフルスクリーン化されている時は何も起きません。
void toWindow(void);
フルスクリーン化しているウィンドウを元に戻します。
フルスクリーン化されていない時に呼んでも何も起きません。

bool update(bool forceDraw = false);
画面を描画し、各種入力デバイスの状態を更新します。
基本的にメインループ内でコールすることになります。
その際、FPSの制御状態に基づいて時間調整が入ります。
特殊な状況下で、強制的に描画処理を呼び出したい場合は引数にtrueを渡します。

fkut_SwitchStatus getKeyStatus(char keyChar);
fkut_SwitchStatus getSpecialKeyStatus(fk_SpecialKey keyCode);
キーボードの入力状態を検出します。
文字として入力できるキーはgetKeyStatus()を使います。
引数として、検出したい文字をシングルクォーテーションで囲って指定します。
'a' や ' ' などとしますスペースも指定できる点に注意しましょう。
入力できない特殊キーにはgetSpecialKeyStatus()を使います。
この引数にはfk_SpecialKeyで定義されている列挙型の値を使います。
定義されている値については次のURLを参照してください。
http://fktoolkit.sourceforge.jp/Document/FK_Ref_2_8_10/Window_8h.html#a23ae5e8cf42dca289df83d51ba581906
返値として、キーの入力状態に応じて次の値が返ります。
・FKUT_SW_PRESS: 押しっぱなし
・FKUT_SW_DOWN: 押した瞬間
・FKUT_SW_UP: 離した瞬間
・FKUT_SW_RELEASE: 離しっぱなし
瞬間かどうかの判定は、直前にupdate()を呼んだ時点とその前にupdate()を呼んだ時点での
入力状態によって決定しています。

fkut_SwitchStatus getMouseStatus(fk_MouseButton buttonCode);
マウスのクリック状態を検出します。
引数は、
・FK_MOUSE1: 左クリック
・FK_MOUSE2: 中クリック(ホイールボタン)
・FK_MOUSE3: 右クリック
のいずれかを指定します。返値はキーボード入力の関数と同義です。
fk_Vector getMousePosition(void);
マウスのカーソル位置を検出します。
返値としてfk_Vectorの値を返し、x成分とy成分にそれぞれウィンドウ座標系の値が入ります。
ウィンドウの外にはみ出したかどうかは、値がウィンドウサイズを超過しているか否かで判断できます。

int getPadCount(void);
認識できているゲームパッドの個数を取得します。
返値が0の場合はパッドを認識できていません。
1以上の場合は、パッドIDが0から順番に割り振られます。
fkut_SwitchStatus getPadButtonStatus(int padID, int buttonID);
ゲームパッドのボタン入力状態を取得します。
引数としてパッドIDと、ボタンIDを指定します。
パッドIDは0からスタートします。ボタンIDも0からスタートし、一般的には15あたりが上限です。
方向キーについては、FKUT_PAD_UP, FKUT_PAD_DOWN, FKUT_PAD_LEFT, FKUT_PAD_RIGHTを
ボタンIDとして指定すると取得できます。
返値の入力状態値は、キーボードやマウスのボタンの取得関数と同義です。
fk_Vector getPadDirection(int padID, int axisID);
ゲームパッドのアナログスティックの値を取得します。
引数としてパッドIDと、スティックのIDを指定します。
スティックIDは一般的には0か1になるはずです。
返値のfk_Vectorの値は、X軸とY軸それぞれごとに-1.0~1.0の値が入ります。
fkut_Input* getPadManager(void);
ゲームパッド入力を制御するfkut_Inputクラスのポインタを返します。
パッドの挙動について詳細な設定をしたい場合はこちらからメンバ関数をコールしてください。

[特殊な操作を行う関数]
bool isModelPicked(fk_Model &model, int pixel = 1, int mouseX = -1, int mouseY = -1);
マウスでモデルをクリックしているかどうかを判定する関数です。
引数には判定対象としたいモデルを渡します。1つずつしか判定できません。
そのままだと現在のカーソル位置を基準に判定しますが、任意の座標を指定したい場合は、
(モデル, 誤差を許容するピクセル数, X座標, Y座標)の形式で引数を渡します。
カーソルがモデルに重なっている場合はtrue、いない場合はfalseを返します。

void procMouseView(fk_Model &camera, double spinX, double spinY, bool lockSW);
FPS視点のゲーム特有の、マウスカーソル移動よる視点操作処理を行う関数です。
引数として、
(カメラモデル, 横方向の移動に対する回転角度, 縦方向の移動に対する回転角度, カーソルの中心固定on/off)
を渡します。

void setCursorState(bool visible, bool center);
マウスカーソルの表示・非表示と、カーソルをセンターに移動するか否かを指定します。
それぞれの引数に対してtrueかfalseかを渡して下さい。初期状態では(true, false)です。


・fkut_SpriteModel :画像・文字列板モデルを表すクラス

fkut_SpriteModelはfk_Modelを継承しているため、fk_Modelのメンバ関数が使用可能です。
ただし、3次元的な挙動を指示した場合には意図しない動作になることがあります。

fk_TextImage text;
これはメンバ関数ではなく、公開メンバオブジェクトです。
スプライトの変数.text.~とすることでテキストの細かな装飾が設定できます
詳細はFKリファレンスマニュアルのfk_TextImageを参照してください
http://fktoolkit.sourceforge.jp/Document/FK_Ref_2_8_10/classfk__TextImage.html

bool readBMP(const string argFileName);
bool readPNG(const string argFileName);
bool readJPG(const string argFileName);
画像を読み込みます。PNGのみ透過画像に対応しています。
読み込みに成功した場合はtrue、失敗した場合はfalseを返します。

void setImage(fk_Image &argImg);
別途用意したfk_Imageを使用したい場合はこれでセットします。

fk_Image* getImage(void);
現在使用されている画像を参照します(あまり変にいじくると落ちるかもしれません)。

void setPositionLT(double x, double y);
指定した座標が左上になるように位置を変更します。
指定する数値は画面中心が原点の座標系です。

void setSpriteArea(double left, double top, double width, double height);
画像の一部分だけを表示領域として切り出します。
指定する数値は左上が原点の画像座標系です。

void setSpriteSize(double width = -1.0, double height = -1.0);
画像の表示サイズを変更します。
通常は画像の設定時に自動調整を行っていますので、敢えてそこからサイズを変更したい時に使います。
引数を省略すると、読み込んである画像と同じサイズに復元します。
fk_TexCoord getSpriteSize(void);
画像の表示サイズを取得します。
返値のfk_TexCoordの変数には、u成分とv成分にそれぞれ幅と高さが入ります。

void setSpriteSmoothMode(bool flag);
画像の表示方法を変更します。
初期状態でtrue(滑らかモード)にしてありますが、文字やフォントの場合はfalseの方が見やすい場合もあります。
bool getSpriteSmoothMode(void);
現在の画像表示モードを取得します。
滑らかモードならtrue、そうでなければfalseを返します。

bool initFont(const string argFontFile);
文字表示のための初期化を行います。
引数には使いたいフォントのファイル名を指定します。
Vista以降であればメイリオが扱いやすいので、おすすめです(ファイルパスは"C:/WINDOWS/Fonts/Meiryo.ttc"です)。
それ以外のフォントを扱いたい場合は、フルパスで指定するか、フォントファイルを自分で配置して指定してください。

void drawText(const string argStr, fk_StringCode argCode = FK_STR_SJIS);
void drawText(const string argStr, bool clearFlag, fk_StringCode argCode = FK_STR_SJIS);
文字の表示を行います。引数に表示したい文字を指定します。
第2引数にbool値を渡すバージョンでは、trueを渡すとこれまでに入力した文字列を初期化し、
falseを渡すとこれまでに入力した文字列への付け足しを行います。bool値を渡さないバージョンは、
falseを渡したのと同じ処理になります。文字コードはWindows環境でなら省略で構いません。
表示方法を変更したい場合は事前に「スプライトの変数.text.~」で設定します。
事後に変更しても有効にならないので注意してください。