2D画像は一応完成?
約一か月前に「一週間で終わらせる」と言って,やっと終わりました(ぇw
#しかも2D画像表示だけw
いや,「一週間で終わらせる部分」はほぼ一週間で終わったけど,その後のやつがきつかった.
とりあえずこんな感じ?
なんかincludeするヘッダファイルが多いですが,まだ整理してないのでw
あとでまとめます.
// ウィンドウ #include <afclib/gui/windows/window.h> #include <afclib/gui/directx/initializer.h> #include <afclib/gui/window.hpp> // スクリーン #include <afclib/gui/directx/screen.h> #include <afclib/gui/screen.hpp> // リソース(画像) #include <afclib/gui/directx/resource/texture.h> #include <afclib/gui/directx/resource/object.hpp> // リソース管理 #include <afclib/gui/resource/group.hpp> #include <afclib/gui/resource/manager.hpp> #pragma comment(lib, "afclib.lib") #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") using namespace afclib::gui; // オブジェクト管理クラスの定義(画像をきりぬいたもの) typedef directx::resource::basic_object<int. float> object; // windowsコールバック関数 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // リソースマネージャ resource::manager< int, // リソースIDの型 directx::resource::texture, // テクスチャ管理クラス object, // オブジェクト管理クラス resource::basic_group<object> // グループ管理クラス > mgr; // リソースID const int TEX_BALL = 0; const int OBJ_R = 0; const int OBJ_W = -4; const int OBJ_P = 22; const int OBJ_B = 32; const int GRP = 344; int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){ // ウィンドウ管理クラス window< windows::window, directx::initializer > wnd; // 画面管理クラス screen<directx::screen> scr; object obj; // オブジェクト(画像をきりぬいたもの) try { // インデント略 wnd.fullscreen(false); // フルスクリーンか否か wnd.width(640); wnd.height(480); wnd.proc(WndProc); // ウィンドウプロシージャ wnd.title(L"Window Title"); // ウィンドウのタイトル wnd.classname(L"AFClibWindowClass"); // クラス名(てきとう) // ウィンドウ作成 wnd.create() // directx初期化 wnd.gui_init(); // ウィンドウ表示(可視化) wnd.show(true); // スクリーンとウィンドウを関連付ける wnd.assign(scr, 0, 0, 640, 480); // スクリーンとリソースマネージャを関連付ける scr.assign(mgr); // ここからはリソースの追加 // 画像を追加(ID = TEX_BALL, path=./tex/ball.bmp, 抜け色=0xff00ff00) mgr.tex_add(TEX_BALL, L"./tex/ball.bmp", 0xff00ff00); // これから追加するリソースを検索の対象にする mgr.enable_find(); // <-> mgr.disable_find(); // オブジェクト作成 mgr.obj_add(OBJ_R, TEX_BALL, 0, 0, 32, 32); // ID, テクスチャID, x, y, width, height mgr.obj_add(OBJ_W, TEX_BALL, 32, 0, 32, 32); // brown mgr.obj_add(OBJ_P, TEX_BALL, 0, 32, 32, 32); // purple mgr.obj_add(OBJ_B, TEX_BALL, 32, 32, 32, 32); // blue // オブジェクトの座標設定(表示位置) mgr.obj(OBJ_R).x(40); // IDがOBJ_Rのx座標を40に mgr.obj(OBJ_W).x( mgr.obj(OBJ_R).x() + 40); // OBJ_Wのx座標をOBJ_Rのx座標+40に mgr.obj(OBJ_P).x( mgr.obj(OBJ_W).x() + 40); mgr.obj(OBJ_B).x( mgr.obj(OBJ_P).x() + 40); object obj = mgr.obj(OBJ_R); // コピー // グループ作成 mgr.grp_new(GRP); // IDがGRPのグループにobjを5個つっこんでみる mgr.grp(GRP) << obj << obj << obj << obj << obj; // 深さを-5へ mgr.grp(GRP).depth(-5); // GRPを (10, 10)からx方向に40, y方向に0ずつずらしながら座標を設定 mgr.grp(GRP).pos_ex(10, 10, ,40, 0); } // try catch(const afclib::afc_error& e){ } scr.color(0x00000000); // 背景色 MSG msg; for(;;){ if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){ if(msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); } // 描画 if(scr.begin()){ mgr.draw_all(); // すべてのリソースを描画 mgr.end(); } Sleep(16); } return 0; } /////////////////////////////////////////////////////// // ウィンドウプロシージャ /////////////////////////////////////////////////////// LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam){ switch(msg){ case WM_DESTROY: PostQuitMessage(0); break; case WM_LBUTTONDOWN: // 左クリック int x = LOWORD(lparam); // クリック時の座標 int y = HIWORD(lparam); if(mgr.find(x, y)){ // 座標に重なる画像を検索 if(mgr.find_in_grp()) mgr.grp(mgr.find_id()).flag(!mgr.grp(mgr.find_id()).flag()); else mgr.obj(mgr.find_id()).flag(!mgr.obj(mgr.find_id()).flag()); break; } } return DefWindowProc(hwnd, msg, wparam, lparam); }
疲れたw
各リソースにはdepthという属性があって,depthの小さい順に描画されます.
つまり,depthの大きいのが手前に来ます.
mgr.find(x, y);
とすると,mgr.enable_find()が呼ばれた後に追加されたリソースの中で,
x, yを内側に含む(つまり重なる)リソースをdepthの大きい順に検索します.
つまり手前から(ry.
各リソースのflagという属性は,描画の時に描画させるかどうかを設定します.
flagをfalseにすると描画されません.
でも検索にはひっかかります(これはどうしようか検討中.
描画関数(mgr.draw_all()など)にはbool forceというパラメータがあって、
それをtrueにするとflagの値を無視してすべて描画します.
この例ではないですが,各リソースに対して拡大縮小,回転,透過などできます.
例:mgr.obj(100).alpha(0.5f); // IDが100のオブジェクトを50%透過する.
なんか適当に使い方書きました.
こんなんでいいよね,最初だしwww(ぁ
マニュアル作るのめんどくさw
afclib::gui::resource::managerとかメソッド40個以上あるし(privateも結構あるけど).
添付画像:実行結果(見やすくするためにサイズが違いますが,位置関係とかは同じです).