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も結構あるけど).



添付画像:実行結果(見やすくするためにサイズが違いますが,位置関係とかは同じです).