上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
エフェクトエディター制作中~

今まで何度かエディターを作ったことはあったのですが、エディットボックスやリストボックスをずらっと並べただけの使いづらいものだったので
今回はdirectxで複数のウインドウに描画した使いやすいGUIに挑戦しています


//複数のウインドウへのレンダリング方法
描画する箇所分d3dデバイスを生成するといいらしいんだけど
シソフレームワークはデバイスをグローバルで宣言しちゃってるので出来ればデバイスの数を増やしたくない・・・
そこで、デバイス1つで複数のウインドウに描画する方法を考えたので紹介します
普段スルーされているIDirect3DDevice9::Presentが大活躍

bool 描画関数
{
//メインウインドウの描画
g_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(64, 64, 64), 1.0f, 0);
if(SUCCEEDED(g_pD3DDev->BeginScene()))
{
//色々描画
g_pD3DDev->EndScene();
}
g_pD3DDev->Present(NULL, NULL, NULL, NULL);
//ダイアログのピクチャコントロールに描画
g_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(64, 64, 64), 1.0f, 0);
if(SUCCEEDED(g_pD3DDev->BeginScene()))
{
//色々描画
g_pD3DDev->EndScene();
}
HWND hItem = GetDlgItem(ダイアログハンドル, IDC_PICTURE);
RECT rect;
rect.left = rect.top = 0;
rect.right = ピクチャコントロールの幅;
rect.bottom = ピクチャコントロールの高さ;
g_pD3DDev->Present(&rect, NULL, hItem, NULL);
}

presentを2回呼んでますね
1回目がいつものメインウインドウへの描画で
2回目がダイアログのピクチャコントロールへの描画です

注意点はデバイスのPresentationInterval設定がD3DPRESENT_INTERVAL_DEFAULTだと
presentを呼んだときのモニターの同期待ちも2回行われるのでFPSがガクッっと下がります
ですのでPresentationIntervalはD3DPRESENT_INTERVAL_IMMEDIATEを指定しましょう
しかし、D3DPRESENT_INTERVAL_IMMEDIATEはモニターと同期を行わないので画面にちらつきが出る欠点があります、
気になる方はウインドウごとに別のデバイスを使ってください(試してないから出来るかわからんけど)

あと描画矩形を指定する場合、SwapEffectはD3DSWAPEFFECT_COPYを指定しないといけないみたいです、詳しくはmsdn


see20120229.jpg

グラフィカル!!!
スポンサーサイト
ピクチャーコントロールのサイズを640*480にしようと思ってリソースを編集したんだけど、
実行すると、書いた数値の1.5倍くらい大きくなってる!なんでや!
調べてみるとダイアログの座標系はピクセルじゃなくて
ダイアログで使われているフォントのサイズを基準に変動するらしい


解決策
ダイアログを生成した後、SetWindowPosで座標を変える!

↓こんな感じ

コールバック関数(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
HWND hItem = NULL;
switch ( message )
{
case WM_INITDIALOG: //ダイアログが作成された
{
//枠のサイズ
int smx = GetSystemMetrics(SM_CXFIXEDFRAME)*2;
//枠とタイトルバーのサイズ
int smy = GetSystemMetrics(SM_CYFIXEDFRAME)*2+GetSystemMetrics(SM_CYSMCAPTION);
//ウインドウ
SetWindowPos(m_hDlg, NULL, 0, 0, 800+smx, 600+smy, (SWP_NOZORDER|SWP_NOOWNERZORDER));
//ピクチャーコントロール
hItem = GetDlgItem(m_hDlg, IDC_PICTURE);
SetWindowPos(hItem, NULL, 0, 0, 640, 480, (SWP_NOZORDER|SWP_NOOWNERZORDER));
//略
学生生活最後の作品展が終わりました。
5(?)人グループで作った作品で最優秀賞、
2人で作った作品で佳作賞を頂きました。盾が増えるよ、やったねしそちゃん。

2人で作った方はまだ制作を開始して1ヶ月くらいしか経っていなくて
土台以外ほぼ未実装な状態なので、いつかのコミケ出展を目指して制作を続けて行きたいなーと思ってます。

作品名:東方タクティクス(仮)!!!
ジャンル:リアルタイムっぽい戦略シミュレーションゲーム!!!
動作環境:WindowsXP,Vista,7
プレイ人数:1(ストーリーモード)~2(ネットワーク対戦)

ゲーム概要
一般的なタクティクスゲームは1Pのターン→2Pのターン→1Pの・・・という繰り返しなのに対して
このゲームは作戦ターンと戦闘ターンで構成されています
「作戦ターン」:自分、相手共に全てのキャラクターの行動を予約します
「戦闘ターン」:作戦ターンで決めた行動情報を元に全てのキャラクターが一斉に戦います
キャラクターのステータス
「HP」:体力
「SP」:スペルを使う時に消費します
「Delay」:移動ディレイと攻撃ディレイがあり、それぞれ
     移動を開始するまでに掛かる時間と攻撃を開始するまでの時間です
     攻撃位置を相手のマスに指定しても、相手の移動ディレイが自分の攻撃ディレイよりも大きいと
     自分が攻撃した時には既に相手は他のマスに移動をしているので攻撃を避けられてしまいます

よくわからんと思うのでイメージ画像
shisoblog20120221.jpg
こんな感じで、先読みを楽しむゲームです
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。