DirectXに関してはまだまだ素人ですが、自分流に地道に制作しています。
ヘッダファイル
► スポイラーを表示
#pragma once
#ifndef UNICODE
#define UNICODE
#endif
#include
#include
#include
#include
#include
#include
//********************************************************************************************************************************************
//Inline Functions
//********************************************************************************************************************************************
//クラスオブジェクト安全開放
template
inline void SafeReleaseClassObject(TypeName *&object)
{
if (object != NULL)
{
delete object;
object = NULL;
}
}
//UnKnown継承クラスオブジェクト安全開放
template
inline void SafeReleaseUnknownClassObject(TypeName *&object)
{
if (object != NULL)
{
object->Release();
object = NULL;
}
}
//********************************************************************************************************************************************
//Log
//********************************************************************************************************************************************
//メッセージ表示
int MessageW(LPCWSTR message, int code);
//********************************************************************************************************************************************
//Window
//********************************************************************************************************************************************
#define DXT_CLIENT_CLEAR_ALPHA 0.5F //既定クライアント領域消去カラー不透明度
#define DXT_CLIENT_CLEAR_COLOR 0x0000ffU //既定クライアント領域消去カラー
#define DXT_CLIENT_HEIGHT 720L //既定クライアント領域高さ
#define DXT_CLIENT_WIDTH 1280L //既定クライアント領域幅
#define DXT_FPS 60 //既定CRTリフレッシュレート
#define DXT_WINDOW_LEFT CW_USEDEFAULT //既定ウインドウ描画座標[x]
#define DXT_WINDOW_TOP CW_USEDEFAULT //既定ウインドウ描画座標[y]
//デバッグ時のみ実行
#ifdef _DEBUG
#define DXT_WINDOW_CAPTION L"DXT[Debug]" //ウインドウキャプション
#else
//リリース時のみ実行
#define DXT_WINDOW_CAPTION L"DXT[Release]" //ウインドウキャプション
#endif
/*クライアント領域*/
extern FLOAT f_client_clear_alpha; //クライアント領域消去カラー不透明度
extern UINT32 U_client_clear_color; //クライアント領域消去カラー
extern SIZE t_client_size; //クライアント領域サイズ
/*ウインドウ*/
extern HBRUSH p_window_back_color; //ウインドウ背景消去カラー
extern LPCWSTR s_window_caption; //ウインドウキャプション
extern WNDCLASS t_window_class; //ウインドウクラス構造体
extern LPCWSTR s_window_class_name; //ウインドウクラス名
extern HWND p_window_handle; //ウインドウハンドル
extern RECT t_window_rect; //ウインドウ座標
/*共通*/
extern BOOL B_instance_exit; //アプリ終了フラグ
extern HINSTANCE p_application_instance; //アプリケーションインスタンス
extern POINT t_mouse_point; //マウスカーソル座標
extern MSG t_window_message; //ウインドウメッセージ
//ウインドウ生成
HRESULT DXTCreateWindow();
//ウィンドウメッセージループ処理
BOOL DXTMessageLoop();
//ウインドウ表示
BOOL DXTShowWindow();
//ウィンドウメッセージ処理
LRESULT CALLBACK DXTWindowProcedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//マウスカーソルx座標参照
LONG GetMousePointX();
//マウスカーソルy座標参照
LONG GetMousePointY();
//クライアント領域消去カラー設定[常時実行OK]
void SetClientClearColor(UINT32 color = DXT_CLIENT_CLEAR_COLOR, FLOAT alpha = DXT_CLIENT_CLEAR_ALPHA);
//クライアント領域サイズ設定[常時実行OK]
void SetClientSize(LONG width = DXT_CLIENT_WIDTH, LONG height = DXT_CLIENT_HEIGHT);
//ウインドウキャプション設定[常時実行OK]
BOOL SetWindowCaption(LPCWSTR caption = DXT_WINDOW_CAPTION);
//ウインドウ位置設定[常時実行OK]
void SetWindowPosition(LONG left = DXT_WINDOW_LEFT, LONG top = DXT_WINDOW_TOP);
//ウインドウ矩形設定
void SetWindowRect();
//********************************************************************************************************************************************
//COM
//********************************************************************************************************************************************
//COM初期化
HRESULT InitializeCOM();
//COM終了処理
void UninitializeCOM();
//********************************************************************************************************************************************
//WIC
//********************************************************************************************************************************************
#include
#pragma comment(lib, "Windowscodecs.lib")
extern IWICImagingFactory *p_wic_factory; //WICルートインターフェースポインタ
//WICルートインターフェース作成
HRESULT CreateWICImagingFactory();
//WICルートインターフェース開放
void ReleaseWICImagingFactory();
//********************************************************************************************************************************************
//DirectWrite
//********************************************************************************************************************************************
#include
#pragma comment(lib, "dwrite.lib")
#define DXT_FONT_DEFAULT //既定フォント登録
#define DXT_FONT_ENTRY_MAX 20 //最大フォント登録数
#define DXT_FONT_NAME L"MS ゴシック" //既定フォント名
#define DXT_FONT_SIZE 20.0F //既定フォントサイズ
//DXTフォントスタイル列挙体
enum DXT_FONT_STYLE
{
DXT_FONT_STYLE_NORMAL = DWRITE_FONT_STYLE_NORMAL, //Normal
DXT_FONT_STYLE_OBLIQUE = DWRITE_FONT_STYLE_OBLIQUE, //Oblique
DXT_FONT_STYLE_ITALIC = DWRITE_FONT_STYLE_ITALIC, //Italic
};
//DXTフォント伸縮列挙体
enum DXT_FONT_STRETCH {
DXT_FONT_STRETCH_UNDEFINED = DWRITE_FONT_STRETCH_UNDEFINED,
DXT_FONT_STRETCH_ULTRA_CONDENSED = DWRITE_FONT_STRETCH_ULTRA_CONDENSED,
DXT_FONT_STRETCH_EXTRA_CONDENSED = DWRITE_FONT_STRETCH_EXTRA_CONDENSED,
DXT_FONT_STRETCH_CONDENSED = DWRITE_FONT_STRETCH_CONDENSED,
DXT_FONT_STRETCH_SEMI_CONDENSED = DWRITE_FONT_STRETCH_SEMI_CONDENSED,
DXT_FONT_STRETCH_NORMAL = DWRITE_FONT_STRETCH_NORMAL,
DXT_FONT_STRETCH_SEMI_EXPANDED = DWRITE_FONT_STRETCH_SEMI_EXPANDED,
DXT_FONT_STRETCH_EXPANDED = DWRITE_FONT_STRETCH_EXPANDED,
DXT_FONT_STRETCH_EXTRA_EXPANDED = DWRITE_FONT_STRETCH_EXTRA_EXPANDED,
DXT_FONT_STRETCH_ULTRA_EXPANDED = DWRITE_FONT_STRETCH_ULTRA_EXPANDED
};
//フォントデータ構造体
struct FontData
{
int handle; //フォントハンドル
LPCWSTR name; //フォント名
int size; //フォントサイズ
DXT_FONT_STRETCH stretch; //フォント伸縮
DXT_FONT_STYLE style; //フォントスタイル
int weight; //フォント太さ
};
extern IDWriteFactory *p_dwrite_factory; //DWriteルートインターフェースポインタ
extern IDWriteTextFormat *p_dwrite_text_format[DXT_FONT_ENTRY_MAX]; //DWriteテキスト形式オブジェクトポインタ
extern int i_dwrite_text_format_entry; //DWriteテキスト形式登録数
/*インターフェース*/
//DWriteルートインターフェース作成
HRESULT CreateDWriteFactory();
//DWriteインターフェース開放
void ReleaseDWriteFactory();
//DWriteテキスト形式オブジェクト開放
void ReleaseDWriteTextFormat();
/*テキスト*/
//フォントハンドル作成
HRESULT CreateFontToHandle(int *fonthandle, LPCWSTR fontname = DXT_FONT_NAME, int fontsize = DXT_FONT_SIZE, int fontweight = DWRITE_FONT_WEIGHT_NORMAL, DXT_FONT_STYLE fontstyle = DXT_FONT_STYLE_NORMAL, DXT_FONT_STRETCH fontstretch = DXT_FONT_STRETCH_NORMAL);
//フォントハンドル作成
HRESULT CreateFontToHandle(FontData *fd);
//フォントハンドル破棄
BOOL DeleteFontToHandle(int *fonthandle);
//フォントハンドル破棄
BOOL DeleteFontToHandle(FontData *fd);
//DWriteテキスト形式登録
HRESULT EntryDWriteTextFormat(int *fonthandle = NULL, LPCWSTR fontname = DXT_FONT_NAME, FLOAT fontsize = DXT_FONT_SIZE, int fontweight = DWRITE_FONT_WEIGHT_NORMAL, DXT_FONT_STYLE fontstyle = DXT_FONT_STYLE_NORMAL, DXT_FONT_STRETCH fontstretch = DXT_FONT_STRETCH_NORMAL);
//********************************************************************************************************************************************
//Direct2D
//********************************************************************************************************************************************
#include
#pragma comment(lib, "d2d1.lib")
#define DXT_BITMAP_ENTRY_MAX 100 //最大画像登録数
#define DXT_BITMAP_RESIZE_LINEAR D2D1_BITMAP_INTERPOLATION_MODE_LINEAR //Linear
#define DXT_BITMAP_RESIZE_NEAREST D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR //Nearest Neighbor
#define DXT_TEXT_ALIGN_LEFT DWRITE_TEXT_ALIGNMENT_LEADING //文字列左寄せ
#define DXT_TEXT_ALIGN_CENTER DWRITE_TEXT_ALIGNMENT_CENTER //文字列中央寄せ
#define DXT_TEXT_ALIGN_RIGHT DWRITE_TEXT_ALIGNMENT_TRAILING //文字列右寄せ
//画像データ構造体
struct GraphData
{
int handle; //画像ハンドル
FLOAT height; //画像高さ
LPCWSTR name; //画像名
LPCWSTR path; //画像ファイルパス
FLOAT width; //画像幅
};
extern ID2D1Bitmap *p_d2d1_bitmap[DXT_BITMAP_ENTRY_MAX]; //D2D1画像オブジェクトポインタ
extern int i_d2d1_bitmap_entry; //D2D1画像登録数
extern ID2D1Factory *p_d2d1_factory; //D2D1ルートインターフェースポインタ
extern D2D1_BITMAP_INTERPOLATION_MODE e_d2d1_interpolation; //D2D1画像リサイズ補間方法
extern ID2D1HwndRenderTarget *p_d2d1_render_target; //D2D1ウインドウレンダーターゲットポインタ
/*インターフェース*/
//D2D1ルートインターフェース作成
HRESULT CreateD2D1Factory();
//D2D1ウインドウレンダーターゲット作成
HRESULT CreateD2D1HwndRenderTarget();
//D2D1画像オブジェクト開放
void ReleaseD2D1BitmapObject();
//D2D1ルートインターフェース開放
void ReleaseD2D1Factory();
//D2D1ウインドウレンダーターゲット開放
void ReleaseD2D1HwndRenderTarget();
/*テキスト*/
//レイアウト文字列描画
HRESULT DrawDWriteFormatText(FLOAT left, FLOAT top, FLOAT words, LPCWSTR string, ID2D1SolidColorBrush *d2d1brush, int fonthandle = 0, DWRITE_TEXT_ALIGNMENT alignment_x = DWRITE_TEXT_ALIGNMENT_JUSTIFIED, DWRITE_PARAGRAPH_ALIGNMENT alignment_y = DWRITE_PARAGRAPH_ALIGNMENT_CENTER);
//レイアウト文字列描画
HRESULT DrawDWriteFormatText(FLOAT left, FLOAT top, FLOAT words, LPCWSTR string, UINT32 color = 0xffffffU, FLOAT alpha = 1.F, int fonthandle = 0, DWRITE_TEXT_ALIGNMENT alignment_x = DWRITE_TEXT_ALIGNMENT_JUSTIFIED, DWRITE_PARAGRAPH_ALIGNMENT alignment_y = DWRITE_PARAGRAPH_ALIGNMENT_CENTER);
//書式文字列描画
HRESULT DrawFormatString(int left, int top, UINT32 color, int fonthandle, FLOAT alpha, LPCWSTR format, ...);
//書式文字列描画
HRESULT DrawFormatStringF(FLOAT left, FLOAT top, UINT32 color, int fonthandle, FLOAT alpha, LPCWSTR format, ...);
//既定フォント文字列描画
HRESULT DrawString(int left, int top, LPCWSTR string, UINT32 color = 0xffffffU, FLOAT alpha = 1.F);
//既定フォント文字列描画
HRESULT DrawStringF(FLOAT left, FLOAT top, LPCWSTR string, UINT32 color = 0xffffffU, FLOAT alpha = 1.F);
//文字列描画
HRESULT DrawStringToHandle(int left, int top, LPCWSTR string, UINT32 color = 0xffffffU, int fonthandle = 0, FLOAT alpha = 1.F);
//文字列描画
HRESULT DrawStringToHandleF(FLOAT left, FLOAT top, LPCWSTR string, UINT32 color = 0xffffffU, int fonthandle = 0, FLOAT alpha = 1.F);
//既定フォント整数値描画
HRESULT DrawValue(int left, int top, FLOAT words, LONG value, UINT32 color = 0xffffffU, FLOAT alpha = 1.F);
//既定フォント整数値描画
HRESULT DrawValueF(FLOAT left, FLOAT top, FLOAT words, LONG value, UINT32 color = 0xffffffU, FLOAT alpha = 1.F);
//整数値描画
HRESULT DrawValueToHandle(int left, int top, FLOAT words, LONG value, UINT32 color = 0xffffffU, int fonthandle = 0, FLOAT alpha = 1.F);
//整数値描画
HRESULT DrawValueToHandleF(FLOAT left, FLOAT top, FLOAT words, LONG value, UINT32 color = 0xffffffU, int fonthandle = 0, FLOAT alpha = 1.F);
/*画像*/
//画像オブジェクト破棄
BOOL DeleteGraph(int *imagehandle);
//画像オブジェクト破棄
BOOL DeleteGraph(GraphData *gd);
//画像オブジェクト描画
HRESULT DrawD2D1BitmapObject(ID2D1Bitmap *bitmap, const D2D1_RECT_F* dst_rect = (const D2D1_RECT_F*)0, FLOAT alpha = 1.F, const D2D1_RECT_F* src_rect = (const D2D1_RECT_F*)0);
//画像オブジェクト拡縮描画
HRESULT DrawExtendGraph(int left, int top, int imagehandle, FLOAT extend = 1.F, FLOAT alpha = 1.F);
//画像オブジェクト拡縮描画
HRESULT DrawExtendGraphF(FLOAT left, FLOAT top, int imagehandle, FLOAT extend = 1.F, FLOAT alpha = 1.F);
//画像オブジェクト描画
HRESULT DrawGraph(int left, int top, int imagehandle, FLOAT alpha = 1.F);
//画像オブジェクト描画
HRESULT DrawGraphF(FLOAT left, FLOAT top, int imagehandle, FLOAT alpha = 1.F);
//画像オブジェクトブロック転送描画
HRESULT DrawRectGraph(int left, int top, int src_x, int src_y, int width, int height, int imagehandle, FLOAT extend = 1.F, FLOAT alpha = 1.F);
//画像オブジェクトブロック転送描画
HRESULT DrawRectGraphF(FLOAT left, FLOAT top, FLOAT src_x, FLOAT src_y, FLOAT width, FLOAT height, int imagehandle, FLOAT extend = 1.F, FLOAT alpha = 1.F);
//画像オブジェクト縦サイズ参照
FLOAT GetGraphHeight(int imagehandle);
//画像オブジェクトサイズ参照
D2D1_SIZE_F GetGraphSize(int imagehandle);
//画像オブジェクト横サイズ参照
FLOAT GetGraphWidth(int imagehandle);
//画像オブジェクト登録
HRESULT LoadGraph(int *imagehandle, LPCWSTR filename);
//画像サイズ計測
void ScaleGraphSize(GraphData *object);
//********************************************************************************************************************************************
//DirectInput
//********************************************************************************************************************************************
#define DIRECTINPUT_VERSION 0x0800 //DirectInput Version
#define INITGUID //Initialize GUID
#include
#pragma comment(lib, "dinput8.lib")
#pragma comment(lib, "dxguid.lib")
extern LPDIRECTINPUT8 p_di8; //DI8インターフェースポインタ
//DI8インターフェース生成
HRESULT CreateDI8Interface();
//DI8インターフェース開放
void ReleaseDI8Interface();
//********************************************************************************************************************************************
//DirectInput - Keyboard
//********************************************************************************************************************************************
//DXTキーボードキー列挙体
enum DXT_KEY
{
DXT_KEY_ESC = DIK_ESCAPE, // Escキー
DXT_KEY_1 = DIK_1, // 1キー
DXT_KEY_2 = DIK_2, // 2キー
DXT_KEY_3 = DIK_3, // 3キー
DXT_KEY_4 = DIK_4, // 4キー
DXT_KEY_5 = DIK_5, // 5キー
DXT_KEY_6 = DIK_6, // 6キー
DXT_KEY_7 = DIK_7, // 7キー
DXT_KEY_8 = DIK_8, // 8キー
DXT_KEY_9 = DIK_9, // 9キー
DXT_KEY_0 = DIK_0, // 0キー
DXT_KEY_MINUS = DIK_MINUS, // -キー
DXT_KEY_EQUALS = DIK_EQUALS, // =キー
DXT_KEY_BACK_SPACE = DIK_BACK, // Back Spaceキー
DXT_KEY_TAB = DIK_TAB, // Tabキー
DXT_KEY_Q = DIK_Q, // Qキー
DXT_KEY_W = DIK_W, // Wキー
DXT_KEY_E = DIK_E, // Eキー
DXT_KEY_R = DIK_R, // Rキー
DXT_KEY_T = DIK_T, // Tキー
DXT_KEY_Y = DIK_Y, // Yキー
DXT_KEY_U = DIK_U, // Uキー
DXT_KEY_I = DIK_I, // Iキー
DXT_KEY_O = DIK_O, // Oキー
DXT_KEY_P = DIK_P, // Pキー
DXT_KEY_BRACKET_L = DIK_LBRACKET, // [キー
DXT_KEY_BRACKET_R = DIK_RBRACKET, // ]キー
DXT_KEY_ENTER = DIK_RETURN, // Enterキー
DXT_KEY_CTRL_L = DIK_LCONTROL, // 左Ctrlキー
DXT_KEY_A = DIK_A, // Aキー
DXT_KEY_S = DIK_S, // Sキー
DXT_KEY_D = DIK_D, // Dキー
DXT_KEY_F = DIK_F, // Fキー
DXT_KEY_G = DIK_G, // Gキー
DXT_KEY_H = DIK_H, // Hキー
DXT_KEY_J = DIK_J, // Jキー
DXT_KEY_K = DIK_K, // Kキー
DXT_KEY_L = DIK_L, // Lキー
DXT_KEY_SEMICOLON = DIK_SEMICOLON, // ;キー
DXT_KEY_APOSTROPHE = DIK_APOSTROPHE, // 'キー
DXT_KEY_GRAVE = DIK_GRAVE, // `キー
DXT_KEY_SHIFT_L = DIK_LSHIFT, // 左Shiftキー
DXT_KEY_BACKSLASH = DIK_BACKSLASH, // \[Back Slash]キー
DXT_KEY_Z = DIK_Z, // Zキー
DXT_KEY_X = DIK_X, // Xキー
DXT_KEY_C = DIK_C, // Cキー
DXT_KEY_V = DIK_V, // Vキー
DXT_KEY_B = DIK_B, // Bキー
DXT_KEY_N = DIK_N, // Nキー
DXT_KEY_M = DIK_M, // Mキー
DXT_KEY_COMMA = DIK_COMMA, // ,キー
DXT_KEY_PERIOD = DIK_PERIOD, // .キー
DXT_KEY_SLASH = DIK_SLASH, // /キー
DXT_KEY_SHIFT_R = DIK_RSHIFT, // 右Shiftキー
DXT_KEY_NUMPAD_MULTIPLY = DIK_MULTIPLY, // [Num]*キー
DXT_KEY_ALT_L = DIK_LMENU, // 左Altキー
DXT_KEY_SPACE = DIK_SPACE, // Spaceキー
DXT_KEY_CAPS_LOCK = DIK_CAPITAL, // Caps Lockキー
DXT_KEY_F1 = DIK_F1, // F1キー
DXT_KEY_F2 = DIK_F2, // F2キー
DXT_KEY_F3 = DIK_F3, // F3キー
DXT_KEY_F4 = DIK_F4, // F4キー
DXT_KEY_F5 = DIK_F5, // F5キー
DXT_KEY_F6 = DIK_F6, // F6キー
DXT_KEY_F7 = DIK_F7, // F7キー
DXT_KEY_F8 = DIK_F8, // F8キー
DXT_KEY_F9 = DIK_F9, // F9キー
DXT_KEY_F10 = DIK_F10, // F10キー
DXT_KEY_NUMPAD_LOCK = DIK_NUMLOCK, // Num Lockキー
DXT_KEY_SCROLL_LOC = DIK_SCROLL, // Scroll Lockキー
DXT_KEY_NUMPAD_7 = DIK_NUMPAD7, // [Num]7キー
DXT_KEY_NUMPAD_8 = DIK_NUMPAD8, // [Num]8キー
DXT_KEY_NUMPAD_9 = DIK_NUMPAD9, // [Num]9キー
DXT_KEY_NUMPAD_SUBTRACT = DIK_SUBTRACT, // [Num]-キー
DXT_KEY_NUMPAD_4 = DIK_NUMPAD4, // [Num]4キー
DXT_KEY_NUMPAD_5 = DIK_NUMPAD5, // [Num]5キー
DXT_KEY_NUMPAD_6 = DIK_NUMPAD6, // [Num]6キー
DXT_KEY_NUMPAD_ADD = DIK_ADD, // [Num]+キー
DXT_KEY_NUMPAD_1 = DIK_NUMPAD1, // [Num]1キー
DXT_KEY_NUMPAD_2 = DIK_NUMPAD2, // [Num]2キー
DXT_KEY_NUMPAD_3 = DIK_NUMPAD3, // [Num]3キー
DXT_KEY_NUMPAD_0 = DIK_NUMPAD0, // [Num]0キー
DXT_KEY_NUMPAD_DECIMAL = DIK_DECIMAL, // [Num].キー
DXT_KEY_F11 = DIK_F11, // F11キー
DXT_KEY_F12 = DIK_F12, // F12キー
DXT_KEY_F13 = DIK_F13, // F13キー
DXT_KEY_F14 = DIK_F14, // F14キー
DXT_KEY_F15 = DIK_F15, // F15キー
DXT_KEY_KANA = DIK_KANA, // カナキー
DXT_KEY_CONVERT = DIK_CONVERT, // 変換キー
DXT_KEY_NOCONVERT = DIK_NOCONVERT, // 無変換キー
DXT_KEY_YEN = DIK_YEN, // \キー
DXT_KEY_NUMPADEQUALS = DIK_NUMPADEQUALS, // =キー
DXT_KEY_CIRCUMFLEX = DIK_CIRCUMFLEX, // ^キー
DXT_KEY_AT = DIK_AT, // @キー
DXT_KEY_COLON = DIK_COLON, // :キー
DXT_KEY_UNDERLINE = DIK_UNDERLINE, // _キー
DXT_KEY_KANJI = DIK_KANJI, // 漢字キー
DXT_KEY_STOP = DIK_STOP, // Stopキー
DXT_KEY_AX = DIK_AX, // [Japan AX]AXキー
DXT_KEY_UNLABELED = DIK_UNLABELED, // [J3100]Unlabeledキー
DXT_KEY_NUMPAD_ENTER = DIK_NUMPADENTER, // [Num]Enterキー
DXT_KEY_CONTROL_R = DIK_RCONTROL, // 右Ctrlキー
DXT_KEY_NUMPAD_COMMA = DIK_NUMPADCOMMA, // [Num],キー
DXT_KEY_NUMPAD_DIVIDE = DIK_DIVIDE, // [Num]/キー
DXT_KEY_SYS_RQ = DIK_SYSRQ, // Sys Rqキー
DXT_KEY_ALT_R = DIK_RMENU, // 右Altキー
DXT_KEY_PAUSE = DIK_PAUSE, // Pauseキー
DXT_KEY_HOME = DIK_HOME, // Homeキー
DXT_KEY_UP = DIK_UP, // ↑キー
DXT_KEY_PAGE_UP = DIK_PRIOR, // Page Upキー
DXT_KEY_LEFT = DIK_LEFT, // ←キー
DXT_KEY_RIGHT = DIK_RIGHT, // →キー
DXT_KEY_END = DIK_END, // Endキー
DXT_KEY_DOWN = DIK_DOWN, // ↓キー
DXT_KEY_PAGE_DOWN = DIK_NEXT, // Page Downキー
DXT_KEY_INSERT = DIK_INSERT, // Insertキー
DXT_KEY_DELETE = DIK_DELETE, // Deleteキー
DXT_KEY_LWIN = DIK_LWIN, // [Windows]左Winキー
DXT_KEY_RWIN = DIK_RWIN, // [Windows]右Winキー
DXT_KEY_MENU = DIK_APPS, // Menuキー
DXT_KEY_POWER = DIK_POWER, // Powerキー
DXT_KEY_SLEEP = DIK_SLEEP, // [Windows]Sleepキー
DXT_KEY_224 = 224, // [Undefined]224キー
DXT_KEY_225 = 225, // [Undefined]225キー
DXT_KEY_226 = 226, // [Undefined]226キー
DXT_KEY_WAKE = DIK_WAKE, // Wakeキー
DXT_KEY_228 = 228, // [Undefined]228キー
DXT_KEY_WEB_SEARCH = DIK_WEBSEARCH, // Web Searchキー
DXT_KEY_WEB_FAVORITES = DIK_WEBFAVORITES, // Web Favoritesキー
DXT_KEY_WEB_REFRESH = DIK_WEBREFRESH, // Web Refreshキー
DXT_KEY_WEB_STOP = DIK_WEBSTOP, // Web Stopキー
DXT_KEY_WEB_FORWARD = DIK_WEBFORWARD, // Web Forwardキー
DXT_KEY_WEB_BACK = DIK_WEBBACK, // Web Backキー
DXT_KEY_MY_COMPUTER = DIK_MYCOMPUTER, // My Computerキー
DXT_KEY_MAIL = DIK_MAIL, // Mailキー
DXT_KEY_MEDIA_SELECT = DIK_MEDIASELECT, // Media SeLectキー
DXT_KEY_238 = 238, // [Undefined]238キー
DXT_KEY_239 = 239, // [Undefined]239キー
DXT_KEY_240 = 240, // [Undefined]240キー
DXT_KEY_241 = 241, // [Undefined]241キー
DXT_KEY_242 = 242, // [Undefined]242キー
DXT_KEY_243 = 243, // [Undefined]243キー
DXT_KEY_244 = 244, // [Undefined]244キー
DXT_KEY_245 = 245, // [Undefined]245キー
DXT_KEY_246 = 246, // [Undefined]246キー
DXT_KEY_247 = 247, // [Undefined]247キー
DXT_KEY_248 = 248, // [Undefined]248キー
DXT_KEY_249 = 249, // [Undefined]249キー
DXT_KEY_250 = 250, // [Undefined]250キー
DXT_KEY_251 = 251, // [Undefined]251キー
DXT_KEY_252 = 252, // [Undefined]252キー
DXT_KEY_253 = 253, // [Undefined]253キー
DXT_KEY_254 = 254, // [Undefined]254キー
DXT_KEY_255 = 255, // [Undefined]255キー
DXT_KEY_MAX // キーボードキー列挙子最大値
};
//キーボードマクロ
#define DXT_KEYBOARD_KEY_BUFFER DXT_KEY_MAX //キーボードキー入力バッファサイズ
#define DXT_KEYBOARD_KEY_MAX DXT_KEY_238 //キーボードキー総数
extern LPDIRECTINPUTDEVICE8 p_di8_keyboad; //DI8キーボード入力デバイスオブジェクトポインタ
extern DIDEVCAPS t_di8_keyboad_caps; //DI8キーボード入力デバイス能力オブジェクト
extern int i_di8_keyboad_key_max; //DI8キーボードキー数
extern int i_di8_keyboad_press[DXT_KEYBOARD_KEY_BUFFER]; //DI8キー入力継続値
extern char c_di8_keyboad_state[DXT_KEYBOARD_KEY_BUFFER]; //DI8キー入力バッファ
//DI8キーボード入力デバイスオブジェクト作成
HRESULT CreateDI8Keyboad();
//DI8キーボード入力継続値参照
int GetDI8KeyboadPressDuration(DXT_KEY DXT_KEY_x);
//DI8キーボード入力状態取得
void CALLBACK GetDI8KeyboadState();
//DI8キーボード押下キー総数参照
int GetDI8KeyboadTotalPressKey();
//DI8キーボード入力デバイスオブジェクト開放
void ReleaseDI8Keyboad();
//DI8キーボード入力継続値設定
void SetDI8KeyboadPressTime(DXT_KEY DXT_KEY_x = DXT_KEY_MAX, int presstime = 0);
//********************************************************************************************************************************************
//DirectInput - Joystick
//********************************************************************************************************************************************
//ジョイパッドキー列挙体
enum DXT_PAD
{
DXT_PAD_1, //ボタン1
DXT_PAD_2, //ボタン2
DXT_PAD_3, //ボタン3
DXT_PAD_4, //ボタン4
DXT_PAD_5, //ボタン5
DXT_PAD_6, //ボタン6
DXT_PAD_7, //ボタン7
DXT_PAD_8, //ボタン8
DXT_PAD_9, //ボタン9
DXT_PAD_10, //ボタン10
DXT_PAD_11, //ボタン11
DXT_PAD_12, //ボタン12
DXT_PAD_13, //ボタン13
DXT_PAD_14, //ボタン14
DXT_PAD_15, //ボタン15
DXT_PAD_16, //ボタン16
DXT_PAD_17, //ボタン17
DXT_PAD_18, //ボタン18
DXT_PAD_19, //ボタン19
DXT_PAD_20, //ボタン20
DXT_PAD_21, //ボタン21
DXT_PAD_22, //ボタン22
DXT_PAD_23, //ボタン23
DXT_PAD_24, //ボタン24
DXT_PAD_25, //ボタン25
DXT_PAD_26, //ボタン26
DXT_PAD_27, //ボタン27
DXT_PAD_28, //ボタン28
DXT_PAD_29, //ボタン29
DXT_PAD_30, //ボタン30
DXT_PAD_31, //ボタン31
DXT_PAD_32, //ボタン32
DXT_PAD_UP, //上方向キー
DXT_PAD_DOWN, //下方向キー
DXT_PAD_LEFT, //左方向キー
DXT_PAD_RIGHT, //右方向キー
DXT_PAD_RANGE_PITCH, //縦方向キー傾斜度
DXT_PAD_RANGE_SLIDE, //横方向キー傾斜度
DXT_PAD_MAX //ジョイパッドキー列挙子最大値
};
//ジョイパッドマクロ
#define DXT_PAD_BUTTON_MAX 10 //ジョイパッドボタン数
#define DXT_PAD_RANGE_MAX 100L //ジョイパッドアナログ方向キー入力範囲[最大値]
#define DXT_PAD_RANGE_MIN -DXT_PAD_RANGE_MAX //ジョイパッドアナログ方向キー入力範囲[最小値]
extern LPDIRECTINPUTDEVICE8 p_di8_joypad; //DI8ジョイパッド入力デバイスオブジェクトポインタ
extern int i_di8_joypad_button_max; //DI8ジョイパッドボタン数
extern DIDEVCAPS t_di8_joypad_caps; //DI8ジョイパッド入力デバイス能力オブジェクト
extern int i_di8_joypad_press[DXT_PAD_MAX]; //DI8ジョイパッド入力継続値
extern DIJOYSTATE t_di8_joypad_state; //DI8ジョイパッド入力バッファ
//DI8ジョイパッド入力状態初期化
void ClearDI8JoystickState();
//DI8ジョイパッド入力デバイスオブジェクト作成コールバック関数
BOOL CALLBACK CreateDI8JoystickDeviceCallBack(const DIDEVICEINSTANCE *deviceinstance, void *context);
//DI8ジョイパッド入力デバイスオブジェクト作成
HRESULT CreateDI8Joystick();
//DI8ジョイパッド入力デバイスオブジェクト列挙コールバック関数
BOOL CALLBACK EnumDI8JoystickDeviceCallback(const DIDEVICEOBJECTINSTANCE *pdidoi, void *context);
//DI8ジョイパッド入力継続値参照
int GetDI8JoystickPressDuration(DXT_PAD PAD_x);
//DI8ジョイパッド入力状態取得
void CALLBACK GetDI8JoystickState();
//DI8ジョイパッド押下キー総数参照
int GetDI8JoystickTotalPressKey();
//DI8ジョイパッド入力デバイスオブジェクト開放
void ReleaseDI8Joystick();
//DI8ジョイパッド入力継続値設定
void SetDI8JoystickPressTime(DXT_PAD DXT_PAD_x = DXT_PAD_MAX, int presstime = 0);
//********************************************************************************************************************************************
//DirectInput - Mouse
//********************************************************************************************************************************************
//マウスマクロ
#define DXT_MOUSE_CLICK_INTERVAL DXT_FPS //クリック感知最大フレーム数
#define DXT_MOUSE_BUTTON_MAX 4 //既定マウスボタン数
//マウスキー列挙体
enum DXT_MOUSE
{
DXT_MOUSE_LEFT, //左ボタン
DXT_MOUSE_RIGHT, //右ボタン
DXT_MOUSE_CENTER, //中ボタン
DXT_MOUSE_EX_1, //追加ボタン1
DXT_MOUSE_EX_2, //追加ボタン2
DXT_MOUSE_EX_3, //追加ボタン3
DXT_MOUSE_EX_4, //追加ボタン4
DXT_MOUSE_EX_5, //追加ボタン5
DXT_MOUSE_MAX //マウスキー列挙子最大値
};
extern LPDIRECTINPUTDEVICE8 p_di8_mouse; //DI8マウスデバイスオブジェクトポインタ
extern int i_di8_mouse_button_max; //DI8マウスボタン数
extern DIDEVCAPS t_di8_mouse_caps; //DI8マウス入力デバイス能力オブジェクト
extern BOOL i_di8_mouse_click[DXT_MOUSE_MAX]; //DI8マウスボタンクリックフラグ
extern int i_di8_mouse_click_interval; //DI8マウスボタンクリック感知最大フレーム数
extern int i_di8_mouse_press[DXT_MOUSE_MAX]; //DI8マウスボタン入力継続値
extern int i_di8_mouse_press_last[DXT_MOUSE_MAX]; //DI8マウスボタン入力継続値[前回]
extern DIMOUSESTATE t_di8_mouse_state; //DI8マウス入力バッファ
//DI8マウス入力状態初期化
void ClearDI8MouseState();
//DI8マウス入力デバイスオブジェクト作成
HRESULT CreateDI8Mouse();
//DI8マウスクリック入力参照
BOOL GetDI8MouseClick(DXT_MOUSE MOUSE_x);
//DI8マウス入力継続値参照
int GetDI8MousePressDuration(DXT_MOUSE MOUSE_x);
//DI8マウス入力状態取得
void CALLBACK GetDI8MouseState();
//DI8マウス押下キー総数参照
int GetDI8MouseTotalPressKey();
//DI8マウス入力デバイスオブジェクト開放
void ReleaseDI8Mouse();
//DI8マウス入力継続値設定
void SetDI8MousePressTime(DXT_MOUSE DXT_MOUSE_x = DXT_MOUSE_MAX, int presstime = 0);
//********************************************************************************************************************************************
//Functions
//********************************************************************************************************************************************
//DirectXインターフェース生成
HRESULT CreateDirectXInterface();
//DXT初期化
BOOL InitializeDXT();
//DirectXインターフェース開放
void ReleaseDirectXInterface();
//DXT終了処理
void UnInitializeDXT();
メインファイル
//********************************************************************************************************************************************
//関数マクロ
//********************************************************************************************************************************************
#define DXT_End() UnInitializeDXT() //DXT終了処理
#define DXT_Init() if (!InitializeDXT()) return 0 //DXT初期化
#define DXT_KeyDown(keyname) GetDI8KeyboadPressDuration(keyname) //キーボードキー押下チェック
#define DXT_MouseClick(mousekeyname) GetDI8MouseClick(mousekeyname) //マウスキークリックチェック
#define DXT_MouseDown(mousekeyname) GetDI8MousePressDuration((DXT_MOUSE)mousekeyname) //マウスキー押下チェック
#define DXT_PadDown(padkeyname) GetDI8JoystickPressDuration((DXT_PAD)padkeyname) //ジョイパッドキー押下チェック
#define DXT_PadDegree(rangename) ((FLOAT)DXT_PadDown(rangename) / (FLOAT)DXT_PAD_RANGE_MAX) //ジョイパッド方向キー入力強度
#define DXT_ShowWindow() if (!DXTShowWindow()) return 0 //ウインドウ表示
► スポイラーを表示
#include "DXT.h"
#include "Class_TestApp.h"
//ウインドウアプリケーションエントリーポイント
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
SetClientClearColor(0xff, 0.5); //クライアント領域消去カラー設定[常時実行OK]
SetClientSize(1280, 720); //クライアント領域サイズ設定[常時実行OK]
SetWindowCaption(L"Test App"); //ウインドウキャプション設定[常時実行OK]
SetWindowPosition(0, 0); //ウインドウ位置設定[常時実行OK]
DXT_Init(); //DXT初期化
TestApp *p_app = new TestApp(); //テストアプリインスタンス生成
DXT_ShowWindow(); //ウインドウ表示
/******************************** メッセージループ ********************************/
while (DXTMessageLoop() && !DXT_KeyDown(DXT_KEY_ESC))
{
p_app->Update(); //テストアプリ更新処理
p_app->Draw(); //テストアプリ描画処理
}
/**********************************************************************************/
delete p_app; //テストアプリインスタンス開放
DXT_End(); //DXT終了処理
return 0; //ウインドウアプリケーション終了
}
【ログ】
関数内部のあらゆる所でエラーチェックをして、デバックモードではメッセージ
ボックスで通知をしています。
リリースモードではログ出力のみ行いますが、ファイルを扱う関数をまだ作って
いません。
将来は、エラーチェック自体を省略したり、カスタマイズできるようにしたい
なぁ…という願望があります。
【ウインドウ】
ウインドウ領域とクライアント領域の変数ネーミングがごっちゃになっていたので、
分かりやすいように直しました。DxLibの影響?
Windows10の親ウィンドウって、普通に作ると左右と下の境界線(フレーム)の向こう
に、7ピクセル幅の見えないウインドウ領域が存在するんですね。ウインドウ座標を
(0, 0)に設定しても(7, 0)に描画されるので、若干イラっとします。(笑)
マウスカーソルの座標は、DirectInputではなくWindowsAPIから取り出して
デスクトップ・ウインドウ・クライアント・レンダーターゲットの領域座標・サイズ
から導き出しています。って普通ですね。
リソースファイルに関して何も作っていないので、まだアイコンは付けられません。
【描画】
描画命令に限らずだけれども、実行時間にシビアな関数は、他の関数を二次利用
するのではなく、同じコードでも一つ一つ個別に書いています。
コンパイラが何をどう最適化しているのかは面倒過ぎるから普通調べないので、
やれる事はやって置く事にしています。
【テキスト】
書式文字列描画は可変長引数をまんま引用する方法が分からないので自作中です。
printfの通りに作るのは、大変だと言うより無理だ。どうしよう…。
とりあえずswprintf_sと文字列描画命令を使って代用していますが、それよりも
、面倒でも項目毎に個別に描画した方が速いのでは?という気もしました。
【グラフィック】
努力しなくても簡単に8種類のフォーマット画像をロードする事ができました。
特定の色を透明として扱う機能を自作するのも面倒だから、透明部分が必要
な時は『ICO、GIF、PNG』画像を使用して簡単に済ます事にしました。
【デバイス入力】
キーボード・ジョイスティック・マウス、基本3種を作り直しました。
全てのボタン(キー)は、入力継続値(フレーム数)で取得できるようにしています。
ボタン(キー)を離したのと、マウスのダブルクリックの感知を取得する関数を
作れば、概ね完成です。
【FPS】
PCの性能のままに放置しているので現在1000f/s以上の数値を叩き出していますが、
レンダーターゲット側で画面更新に合わせて自動調整する方法と、自作で好きな
数値に設定する方法があるので、どっちが良いのか迷っています。
このままだとPCに負荷がかかるので、早くどうにかせねば…。
【全体】
ライブラリ全体を名前空間で囲むのは、全部出来てからの予定です。
インライン関数、別にインラインでなくても良いような。
テストアプリも作ってみました。ライブラリの動作は、今の所問題なさそうだ。
時間・FPS・音楽再生・乱数の概念がないのでまだゲームには使えませんが、
今ある部分をもっと丁寧に調整してから次に進もうと思ってます。
今年中に完成できるかな???