読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

日記的な事を書いて行くと思はれる

実際に自作ライブラリを使ってみて思った事

結局DXライブラリ的な関数を気がついたら作っていました。要するに自作APIをラップしてわざわざdraw_text関数とかを作っていたという事です。
やっぱり黒い文字列を書くのに

ngy313::graphic::draw(ngy313::graphic::text(0.f, 0.f, font, "C++でゲームを作ろう") | ngy313::graphic::colored(ngy313::utility::kBlack));

とか長ったらしくて毎回書いてられないですね。名前空間が鬼門ですね。
元々私のライブラリには、関数でこれらを全部用意しようとすると、先ず図形の種類だけ関数が出来て、それに色指定や塗りつぶし、拡大縮小、回転、画像貼り付け、文字列・・・とかやってると関数の種類と引数の組み合わせが爆発的に増えてしまうのを避けたかったという意味があったりします。

// 先ず図形の数だけ関数が出来る
void draw_line(...);
void draw_triangle(...);
void draw_box(...);

// 図形の中心を基準に拡大表示版
void draw_extend_line(...);
void draw_extend_triangle(...);
void draw_extend_box(...);

// 図形の中心を基準に回転表示版
void draw_rotate_line(...);
void draw_rotate_triangle(...);
void draw_rotate_box(...);

// 図形の中心を基準に拡大回転表示版
void draw_extend_rotate_line(...);
void draw_extend_rotate_triangle(...);
void draw_extend_rotate_box(...);

// 拡大中心座標指定表示版
void draw_extend_line2(...);
void draw_extend_triangle2(...);
void draw_extend_box2(...);

// 拡大中心座標指定表示版
void draw_rotate_line2(...);
void draw_rotate_triangle2(...);
void draw_rotate_box2(...);

// 拡大回転中心座標指定表示版
// 以下考えられる組み合わせが続く
// 
// 

というわけで図形、引数にきそうなオプションを全てクラスにしてそれらをつなげて描画させることで手間を省こうというコンセプトがありました。

// 図形を用意
class line;
class triangle;
class box;

// オプションを用意
template <typename BasePoint>
class extended;
template <typename BasePoint>
class rotated;

class base_point_at;
class base_point_center;

// 描画関数
template <typename Drawable>
void draw(...);

// 図形表示
draw(line);
draw(triangle);
draw(box);

// 図形の中心を基準に拡大表示
draw(line | extended(base_point_center()));
draw(triangle | extended(base_point_center()));
draw(box | extended(base_point_center()));

// 図形の中心を基準に回転表示
draw(line | rotated(base_point_center()));
draw(triangle | rotated(base_point_center()));
draw(box | rotated(base_point_center()));

// 図形の中心を基準に拡大回転表示版
draw(line | extended(base_point_center()) | rotated(base_point_center()));
draw(triangle | extended(base_point_center()) | rotated(base_point_center()));
draw(box | extended(base_point_center()) | rotated(base_point_center()));

// 拡大中心座標指定表示版
draw(line | extended(base_point_at(...)));
draw(triangle | extended(base_point_at(...)));
draw(box | extended(base_point_at(...)));

// 拡大中心座標指定表示版
draw(line | rotated(base_point_at(...)));
draw(triangle | rotated(base_point_at(...)));
draw(box | rotated(base_point_at(...)));

// 拡大回転中心座標指定表示版
// 以下考えられる組み合わせも既存の物の組み合わせで表現可能
// 
// 

こうすることで、定義する物の組が大幅に減ります(まぁ実際は相当メタメタしているので実際にコード量が減っているかは疑問)。加えて流石にこれはいらんだろうと思って用意しなかった関数が必要になった時、この組み合わせは・・・えーと、関数が無い!?な状況も避ける事が出来たわけです。
でも実際に使う組み合わせって結構限られてるんですね。というわけで結局良く使う組み合わせはそれをラップした関数を書くという残当な結果になってしまいましたとさ。そういう意味ではDXライブラリとは目指していた方向性がそもそも違ったのかもしれません。