自分の作るアプリはDirect2Dの機能で十分だから、今回はちょっとややこしいDirect3Dを使わない事にした。
子ウインドウ生成機能は取っ払うつもりだが、名残り惜しいので一つだけ作れるように一部保留してある。
文字列や画像の描画関数は、1から作り直したり、Dxライブラリに合わせて名前を変更中である。
DirectInputは、キーボードとジョイスティックは必須だが、マウスは本当に必要なのか疑問である。
現在のコードが整理できたら、あとはデバイス入力・サウンド・時間・乱数・FPS・ログ出力等の機能を追加する予定だ。
基本は前作をコピペするだけだから楽チンだが、定数・関数マクロや列挙体・便利な構造体も新たに分かりやすい名前
で作り直そうと考えているので、少し時間が掛かりそうだ。
ゲームを作るのは情熱が足りなくて疲れるが、こういう作業は好きだし楽しい!
#pragma once
#include
#ifndef UNICODE
#define UNICODE
#endif
//******************************************************************************************************************
//Inline Functions
//******************************************************************************************************************
//クラスオブジェクト安全開放
template
inline void SafeReleaseClassObject(TypeName *&object)
{
if (object != NULL)
{
delete object;
object = NULL;
}
}
//UnKnown継承クラスオブジェクト安全開放
template
inline void SafeReleaseUnknownObject(TypeName *&object)
{
if (object != NULL)
{
object->Release();
object = NULL;
}
}
//******************************************************************************************************************
//Functions
//******************************************************************************************************************
//メッセージ表示
int MessageW(LPCWSTR message, int code);
//******************************************************************************************************************
//Window
//******************************************************************************************************************
#define DXT_WINDOW_CLEAR_COLOR 0x0U //既定ウインドウクライアント領域消去カラー
#define DXT_WINDOW_CLEAR_ALPHA 1.0F //既定ウインドウクライアント領域消去カラー不透明度
#define DXT_WINDOW_LEFT CW_USEDEFAULT //既定ウインドウ描画座標[x]
#define DXT_WINDOW_TOP CW_USEDEFAULT //既定ウインドウ描画座標[y]
#define DXT_WINDOW_WIDTH 1280L //既定ウインドウクライアント領域幅
#define DXT_WINDOW_HEIGHT 720L //既定ウインドウクライアント領域高さ
extern WNDCLASS t_parent_class; //親ウインドウクラス構造体
extern LPCWSTR s_parent_class_name; //親ウインドウクラス名
extern HWND p_parent_handle; //親ウインドウハンドル
extern RECT t_parent_rect; //親ウインドウクライアント領域座標
extern SIZE t_parent_size; //親ウインドウクライアント領域サイズ
extern FLOAT f_parent_clear_alpha; //親ウインドウ背景透過度
extern LPCWSTR s_parent_caption; //親ウインドウキャプション
extern UINT32 U_parent_clear_color; //親ウインドウ消去カラー
extern WNDCLASS t_child_class; //子ウインドウクラス構造体
extern LPCWSTR s_child_class_name; //子ウインドウクラス名
extern HWND p_child_handle; //子ウインドウハンドル
extern RECT t_child_rect; //子ウインドウクライアント領域座標
extern SIZE t_child_size; //子ウインドウクライアント領域サイズ
extern FLOAT f_child_clear_alpha; //子ウインドウ背景透過度
extern LPCWSTR s_child_caption; //子ウインドウキャプション
extern UINT32 U_child_clear_color; //子ウインドウ消去カラー
extern HINSTANCE p_instance_handle; //アプリケーションインスタンス
extern POINT t_mouse_point; //マウスカーソル座標
extern MSG t_window_message; //ウインドウメッセージ
extern BOOL B_exit; //アプリ終了フラグ
extern LONG L_loop_count; //ループ数
//ウィンドウメッセージ処理
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//親ウインドウ生成
HRESULT CreateParentWindow(HINSTANCE hInst);
//子ウインドウ生成
HRESULT CreateChildWindow(HINSTANCE hInst, WNDCLASS *windowclass, HWND *windowhandle);
//ウィンドウメッセージループ処理
BOOL MessageProcess();
//******************************************************************************************************************
//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 //既定フォントサイズ
//フォントデータ構造体
struct FontData
{
int handle; //フォントハンドル
LPCWSTR name; //フォント名
int size; //フォントサイズ
};
extern IDWriteFactory *p_dwrite_factory; //DWriteルートインターフェースポインタ
extern IDWriteTextFormat *p_dwrite_text_format[DXT_FONT_ENTRY_MAX]; //DWriteテキスト形式オブジェクトポインタ
extern int i_dwrite_font_entry; //フォント登録数
//DWriteルートインターフェース作成
HRESULT CreateDWriteFactory();
//テキスト形式登録
HRESULT EntryDWriteTextFormat(int *handle = NULL, LPCWSTR fontname = DXT_FONT_NAME, FLOAT fontsize = DXT_FONT_SIZE);
//テキスト形式破棄
BOOL DiscardDWriteTextFormat(int *fonthandle);
//テキスト形式破棄
BOOL DiscardDWriteTextFormat(FontData *fd);
//テキスト形式登録
HRESULT LoadTextFormatHandle(int *fonthandle, LPCWSTR fontname = DXT_FONT_NAME, int fontsize = (int)DXT_FONT_SIZE);
//テキスト形式登録
HRESULT LoadTextFormatHandle(FontData *fd);
//DWriteインターフェース開放
void ReleaseDWriteFactory();
//******************************************************************************************************************
//Direct2D
//******************************************************************************************************************
#include
#pragma comment(lib, "d2d1.lib")
#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 //文字列右寄せ
#define DXT_BITMAP_ENTRY_MAX 100 //最大画像登録数
#define DXT_BITMAP_RESIZE_NEAREST D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR //Nearest Neighbor
#define DXT_BITMAP_RESIZE_BYLINEAR D2D1_BITMAP_INTERPOLATION_MODE_LINEAR //Linear
#define DXT_RENDER_DPI 96.F //DPI
//画像データ構造体
extern ID2D1Factory *p_d2d1_factory; //D2D1ルートインターフェースポインタ
extern ID2D1HwndRenderTarget *p_d2d1_render_target; //D2D1ウインドウレンダーターゲットポインタ
extern ID2D1Bitmap *p_d2d1_bitmap[DXT_BITMAP_ENTRY_MAX]; //D2D1画像オブジェクトポインタ
extern D2D1_BITMAP_INTERPOLATION_MODE e_d2d1_interpolation; //画像リサイズ補間方法
extern int i_d2d1_bitmap_entry; //画像登録数
//D2D1ルートインターフェース作成
HRESULT CreateD2D1Factory();
//D2D1ウインドウレンダーターゲット作成
HRESULT CreateD2D1HwndRenderTarget(HWND *windowhandle);
//D2D1ルートインターフェース開放
void ReleaseD2D1Factory();
//D2D1ウインドウレンダーターゲット開放
void ReleaseD2D1HwndRenderTarget();
//D2D1画像オブジェクト開放
void ReleaseD2D1BitmapObject();
//画像オブジェクト描画
HRESULT DrawBitmapObject(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 DrawGraphF(FLOAT left, FLOAT top, int imagehandle, FLOAT alpha = 1.F);
//画像オブジェクト描画
HRESULT DrawGraph(int left, int top, int imagehandle, FLOAT alpha = 1.F);
//画像オブジェクト拡縮描画
HRESULT DrawExtendGraphF(FLOAT left, FLOAT top, int imagehandle, FLOAT extend = 1.F, FLOAT alpha = 1.F);
//画像オブジェクト拡縮描画
HRESULT DrawExtendGraph(int left, int top, 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);
//画像オブジェクトブロック描画
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);
//文字列描画[レイアウト文字数&D2D1カラーブラシ指定版]
HRESULT DrawString(FLOAT left, FLOAT top, FLOAT words, LPCWSTR text, ID2D1SolidColorBrush *d2d1brush, int fonthandle = 0, DWRITE_TEXT_ALIGNMENT alignment_x = DWRITE_TEXT_ALIGNMENT_JUSTIFIED, DWRITE_PARAGRAPH_ALIGNMENT alignment_y = DWRITE_PARAGRAPH_ALIGNMENT_CENTER);
//文字列描画[レイアウト文字数&UINT32カラー指定版]
HRESULT DrawString(FLOAT left, FLOAT top, FLOAT words, LPCWSTR text, UINT32 color = 0xffffffU, int fonthandle = 0, DWRITE_TEXT_ALIGNMENT alignment_x = DWRITE_TEXT_ALIGNMENT_JUSTIFIED, DWRITE_PARAGRAPH_ALIGNMENT alignment_y = DWRITE_PARAGRAPH_ALIGNMENT_CENTER);
//文字列描画[レイアウト文字数&D2D1KnownColor指定版]
HRESULT DrawString(FLOAT left, FLOAT top, FLOAT words, LPCWSTR text, D2D1::ColorF::Enum knowncolor, int fonthandle = 0, DWRITE_TEXT_ALIGNMENT alignment_x = DWRITE_TEXT_ALIGNMENT_JUSTIFIED, DWRITE_PARAGRAPH_ALIGNMENT alignment_y = DWRITE_PARAGRAPH_ALIGNMENT_CENTER);
//文字列描画[レイアウト文字数自動設定&UINT32カラー指定版]
HRESULT DrawString(FLOAT left, FLOAT top, LPCWSTR text, UINT32 color = 0xffffffU, int fonthandle = 0, DWRITE_TEXT_ALIGNMENT alignment_x = DWRITE_TEXT_ALIGNMENT_JUSTIFIED, DWRITE_PARAGRAPH_ALIGNMENT alignment_y = DWRITE_PARAGRAPH_ALIGNMENT_CENTER);
//整数値描画[レイアウト文字数&UINT32カラー指定版]
HRESULT DrawValue(FLOAT left, FLOAT top, FLOAT words, LONG value, UINT32 color = 0xffffffU, int fonthandle = 0, DWRITE_TEXT_ALIGNMENT alignment_x = DWRITE_TEXT_ALIGNMENT_JUSTIFIED, DWRITE_PARAGRAPH_ALIGNMENT alignment_y = DWRITE_PARAGRAPH_ALIGNMENT_CENTER);
//整数値描画[レイアウト文字数自動設定&UINT32カラー指定版]
HRESULT DrawValue(FLOAT left, FLOAT top, LONG value, UINT32 color = 0xffffffU, int fonthandle = 0, DWRITE_TEXT_ALIGNMENT alignment_x = DWRITE_TEXT_ALIGNMENT_JUSTIFIED, DWRITE_PARAGRAPH_ALIGNMENT alignment_y = DWRITE_PARAGRAPH_ALIGNMENT_CENTER);
//画像オブジェクト破棄
BOOL DiscardBitmapObject(int *imagehandle);
//画像オブジェクト登録
HRESULT EntryBitmapObject(LPCWSTR filename, int *imagehandle);
//画像オブジェクト縦サイズ参照
FLOAT GetBitmapObjectHeight(int imagehandle);
//画像オブジェクトサイズ参照
D2D1_SIZE_F GetBitmapObjectSize(int imagehandle);
//画像オブジェクト横サイズ参照
FLOAT GetBitmapObjectWidth(int imagehandle);
//画像サイズ計測
void ScaleGraphSize(GraphData *object);