こんばんは。The Social Network見てきました。いやぁ素晴らしいですね。本当に。技術力の高さがすべてじゃないけど、ある人は強いです。あんまり公の場でしゃべるとアレなので言えませんが。
情報系の人必見です。まじで興奮します!!
http://www.thesocialnetwork-movie.com/
というわけで、昨日とは打って変わって。DirectX10のTutorialを始めることにしました。理由は、OpenGL4.0(GLUTを使わない)で開発する環境がどうしても作れなかったからです。
ただ、留学に行く前に一芸をつくって持っていきたい。一番わかりやすいのはグラフィックだけど、OpenGLは使えない・・・・・・・
俺にはDirectXがあるじゃないか……
きっと覚えている人はいませんが、昔DirectXを3年ほど本気でやってました。その頃は9でしたが。で、DX10が出たころに、ゲーム以外のプログラミングの世界を知って、大混乱、大暴れ、様々な迷走その他もろもろを繰り返し、2年半年ぶりにDirectXをいじることに。運命って怖い。
学科選択で真剣の真剣に悩んで、自分の過去5年間のプログラミング人生を振り返って。私はやはりグラフィック処理な人間。グラフィックの事は、特にDirectX使わせたら、今でも絶対立命館情理の誰にも負ける自信がない。
この春休み。留学に行くまでに、得意分野を伸ばすという方向で自信をつけよう。というわけでDirectX10です。挫折してから2年半。ついに本気だす。
DirectX SDK
http://goo.gl/JRBA
ってわけで、Tutorial00ですが。あっさりクリアしちゃいました。ウィンドウをつくるとかどうとかっていう内容だったので。めんどくさいのでクラス化して、本来なら100行かかるプログラムを20行で書けるように。これなら文句ない。
#include "windowclass.h" // ウィンドウクラスの読み込み LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { static HWND hToolbar=0; switch(msg){ case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hWnd, msg, wParam, lParam); } } int WINMAIN() { WindowClass wc; // 自分で作ったクラス wc.InitApp(hInstance,(WNDPROC)WndProc); // プログラム初期化 wc.InitWindow(L"窓の タイトル\(^o^)/"); // ウィンドウ作成 wc.MessageLoop_Normal(); // メインループ return 0L; }
クラスの中身は省略。続きを読む。に置きます。
さて、準備完了。one-Tutorial per one-dayで進めば、7まではきっと終わる。途中でInput処理を考えなきゃだけど。まぁそれはおいおいコピペすることにしよう。
# Window.h ウィンドウ関連クラス ver1.4(未実験) #ifndef __WINDOW_H__ #define __WINDOW_H__ //---------------------------------------------------------- // Window表示に関するヘッダ //---------------------------------------------------------- // ライブラリ読み込み #pragma comment(lib,"winmm.lib") #pragma comment(lib,"imm32.lib") // 使わない関数削除 //#define WIN32_LEAN_AND_MEAN // インクルードファイル #include <windows.h> // ウィンドウズ標準 #include <windowsx.h> // ウィンドウズ補佐 // 定数 #define WINMAIN() WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpCmdLine,int lpCmdShow) // WinMain関数を簡略化 class WindowClass // ウィンドウ関連を完全にオブジェクト化 { private: LPCWSTR ClassName; // ウィンドウクラス WNDCLASSEX wcex; // ウィンドウクラスEx構造体 MSG msg; // メッセージ構造体 HACCEL hAccel; //アクセラレーターテープルハンドル // ウィンドウプロシージャ関数のポインタ LRESULT (*WndProc)(HWND, UINT, WPARAM, LPARAM); public: HWND hWnd; // ウィンドウハンドル HINSTANCE hInst; // インスタンスハンドル bool Active; // アプリケーションの状態 WindowClass(); // コントラクタ ~WindowClass(); // デストラクタ // ウィンドウ・クラスの登録用メソッド ATOM InitApp( HINSTANCE hInstance, // インスタンスハンドル WNDPROC WP, // ウィンドウプロシージャ HCURSOR hCur = NULL, // カーソル LPCTSTR lpszMenuName = NULL, // メニュー HICON hIcon = NULL, // アイコン HICON hIconSm = NULL, // アイコンミニ UINT style = CS_HREDRAW | CS_VREDRAW // ウィンドウスタイル ); // ウィンドウの生成用メソッド BOOL InitWindow( LPCWSTR lpTitle = L"WindowTitle", // ウィンドウタイトル DWORD style = WS_OVERLAPPEDWINDOW, // オーバーラップド int width = CW_USEDEFAULT, // 横幅 int height = CW_USEDEFAULT, // 縦幅 int nCmdShow = SW_SHOW, // 表示モード int x = CW_USEDEFAULT, // x座標 int y = CW_USEDEFAULT // y座標 ); // メッセージループメソッド int MessageLoop_Normal(); // 引数いらず // メッセージループメソッド(アクセラレータ付き) int MessageLoop_Accelerator(LPCWSTR lptableName);// アクセラレータテーブルのリソースのアレ // ファイルオープン(保存などは含まない) int FileOpen( bool bSave, // セーブモードならtrue LPTSTR lpFileName, // 保存先ファイルネーム LPTSTR lpFileTitle, // ファイルネームオンリー LPCTSTR lpFileFilter, // ファイルフィルタ int nFilterIndex // フィルタインデックス ); }; #endif # Window.cpp ウィンドウ関連クラス ver1.4 // インクルード #include "Window.h" //---------------------------------------------------------- // タイトル:コントラクタ // 説明 :ウィンドウ表示に関する変数の初期化をします。 // 戻り値 :なし //---------------------------------------------------------- WindowClass::WindowClass() { memset(this,0,sizeof(WindowClass)); // 初期化 ClassName = L"WClass"; // ウィンドウクラス return; } //---------------------------------------------------------- // タイトル:デストラクタ // 説明 :ウィンドウ表示に関する変数の開放をします。 // 戻り値 :なし //---------------------------------------------------------- WindowClass::~WindowClass() { return; } //---------------------------------------------------------- // タイトル:アプリケーションの初期化 // 説明 :ウィンドウ・クラスの登録をします。 // 戻り値 :RegisterClassEx(&wcex) //---------------------------------------------------------- ATOM WindowClass::InitApp(HINSTANCE hInstance,WNDPROC WP,HCURSOR hCur,LPCTSTR lpszMenuName,HICON hIcon,HICON hIconSm,UINT style) { hInst = hInstance; // 各メンバの設定 wcex.cbSize = sizeof(WNDCLASSEX); // 構造体のサイズ wcex.style = style; // クラスのスタイル wcex.lpfnWndProc = WP; // ウィンドウプロシージャー wcex.cbClsExtra = 0; // 補助メモリ wcex.cbWndExtra = 0; // 補助メモリ wcex.hInstance = hInst; // インスタントハンドル wcex.hIcon = hIcon; // アイコン wcex.hIconSm = hIconSm; // 小さいアイコン wcex.hCursor = hCur; // カーソル wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);// 背景ブラシ wcex.lpszMenuName = lpszMenuName; // メニュー名 wcex.lpszClassName = ClassName; // クラス名 return (RegisterClassEx(&wcex)); } //---------------------------------------------------------- // タイトル:インスタンスの初期化 // 説明 :ウィンドウの生成をします。 // 戻り値 :成功の場合、"true"を返します。 //---------------------------------------------------------- BOOL WindowClass::InitWindow(LPCWSTR lpTitle,DWORD style,int width,int height,int nCmdShow,int x,int y) { hWnd = CreateWindow( ClassName, // ウィンドウクラス lpTitle, // タイトルバーにこの名前が表示されます style, // ウィンドウの種類 x, // X座標 y, // Y座標 width, // 幅 height, // 高さ NULL, // 親ウィンドウのハンドル、親を作るときはNULL NULL, // メニューハンドル、クラスメニューを使うときはNULL hInst, // インスタンスハンドル NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return true; } //---------------------------------------------------------- // タイトル:メッセージループ(通常) // 説明 :メッセージループを回します。 // 戻り値 :(int)msg.message //---------------------------------------------------------- int WindowClass::MessageLoop_Normal() { while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); // 仮想キーメッセージの変換 DispatchMessage(&msg); // ウインドウプロシージャへ転送 } return (int)msg.message; } //---------------------------------------------------------- // タイトル:メッセージループ(アクセラレータ) // 説明 :メッセージループを回します。 // 戻り値 :(int)msg.message //---------------------------------------------------------- int WindowClass::MessageLoop_Accelerator(LPCWSTR lptableName) { hAccel = LoadAccelerators(hInst,lptableName); if (hAccel == NULL) MessageBox(hWnd,L"アクセラレータテーブルの取得に失敗",L"Error", MB_OK | MB_ICONWARNING); while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(hWnd, hAccel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int)msg.message; }