もう10時か、
2ちゃんねる ■掲示板に戻る■ 全部 1- 最新50 [PR]萌え猫写真館が復活。[PR]  

【C++】 DirectX初心者質問スレ Part18 【C】

1 :デフォルトの名無しさん:2008/07/17(木) 13:50:04
1 名前:デフォルトの名無しさん[sage] 投稿日:2008/04/09(水) 09:55:56
※回答する人も、質問する人も必ず読んでください

これらに当てはまる人のための質問スレです。
1.C/C++は多少理解している。
2.最近DirectXを始めたばかり
3.SDKを見ても、Googleで検索しても、いまいち理解できない人
4.余計な雑談は不要ですよ

【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
 「ググれ」「SDK見れ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。

【 質問する方 】
・ どんな事で躓いているのか明確にしよう。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。
・ 回答して貰ったら、出来るだけお礼もしよう。

【C++】 DirectX初心者質問スレ Part17 【C】
http://pc11.2ch.net/test/read.cgi/tech/1207702556/

620 :デフォルトの名無しさん:2008/10/08(水) 21:40:22
>>619
Acquireを呼んでいるのと、Acquireが成功するかは別問題。

MSのサンプルだってAcquireは呼んでいる。
でも、それが成功したかなんて気にしていない。

621 :617:2008/10/08(水) 21:54:33
日本語版のMSDNでようやく該当する記述を見つけました。
Acquireの戻り値として、
>DIERR_OTHERAPPHASPRIO 他のアプリケーションの優先レベルの方が高いので、この呼び出しを実行できない。
>この値は、標準の COM 戻り値である E_ACCESSDENIED に等しい。このエラーが返されるのは、
>デバイスに対するアプリケーションのアクセス権がフォアグラウンド アクセス権であるにもかかわらず、
>バックグラウンドであるときにデバイスを取得しようとした場合である。
とありました。WM_CREATEの処理内で呼び出していたために失敗していたようです。
大変お騒がせしました。まさか日本語ページの方が詳しいなんて・・・

622 :デフォルトの名無しさん:2008/10/09(木) 00:11:47
DirectSoundはDirextX8も9も一緒なんですか?
DirectSoundCreate8からDirectSoundCreate9になるのかと思ったんですがないといわれます。
ライブラリの追加はdsound.lib dxguid.lib winmm.lib だけでいいんですか?

623 :デフォルトの名無しさん:2008/10/09(木) 02:15:01
質問です。
DirectXで作られたゲームを公開する場合、マイクロソフトの著作権表記などは
必要なのでしょうか?

ttp://www.microsoft.com/japan/msdn/directx/japan/license/eula.aspx
ttp://www.microsoft.com/japan/msdn/directx/japan/license/dx_license.aspx

一応上を読んでみたのですが、ごちゃごちゃ書いてあって正直よくわかりません。

624 :デフォルトの名無しさん:2008/10/09(木) 08:26:40
>>622
dsound.hの中を見ればわかるよ
DIRECTSOUND_VERSION >= 0x0800
なので8も9も同じ
libはそれでいいんじゃない
未解決とか言われたら追加すればいい

625 :デフォルトの名無しさん:2008/10/09(木) 10:12:20
質問です
DirectX8で作られた古いソースが出てきたのですが、現在PCには9.0cのSDKが入っています。
上記ソースをコンパイルしようとしたところ
#include <d3d8.h>
#include <d3dx8.h>
こいつらがないと言われてしまったのですが、DirectX8のSDKをインストールしないとダメってことでしょうか。
(普段は9のプログラムを組んでいるので)競合しそうで怖いのですが、何か良い手はありますでしょうか

626 :デフォルトの名無しさん:2008/10/09(木) 10:19:36
俺も場合は複数バージョンのSDKをインストールしないで解凍して保管する
で、includeやlibは新しいバージョンを優先しとけばないものだけ古いものから参照される

627 :デフォルトの名無しさん:2008/10/09(木) 12:46:20
>>625

>>552

628 :デフォルトの名無しさん:2008/10/09(木) 13:06:39
>>625
オプションのVC++ディレクトリを
C:\Program Files\Microsoft DirectX SDK (March 2008)\Include
C:\Program Files\Microsoft DirectX SDK (August 2007)\Include


こんな感じにしてるが心配ならDX8のときは順番を入れ替えればいいんじゃない


629 :デフォルトの名無しさん:2008/10/09(木) 15:14:18
DirectInputのマウスデバイスで相対座標のデータを得るとき、値1が1pxと対応しているわけではないと思うのですが、
どうやってピクセル単位の座標変化を求めればいいでしょうか。

630 :デフォルトの名無しさん:2008/10/09(木) 15:59:32
対応してた気がするが?

631 :デフォルトの名無しさん:2008/10/09(木) 16:09:01
629
つまりプログラムのミスですか。確認してみますorz

632 :デフォルトの名無しさん:2008/10/09(木) 17:09:17
サウンドバッファはプライマリとセカンダリ両方作る必要はあるんですか?サンプルを見たんですが、2つ作ってるのにセカンダリしかつかってないように見えるんですが

633 :629:2008/10/09(木) 19:43:32
やっぱりどうしても、実際のカーソルの位置と、DirectInputで求めたカーソル移動量が食い違います。
スクリーン上で1000px水平に移動させると、移動量の合計が600〜800くらいになっています。
下がそのコードなのですが、どこか間違っているところがありますか?
void MouseDevice::UpdateState()
{
HRESULT hr;
if (hr = pDevice_->Acquire(), FAILED(hr))
{
LOG_WARN("IDirectInputDevice8::Acquire 非アクティブになった?");
return;
}

DIMOUSESTATE mouseState;
if (hr = pDevice_->GetDeviceState(sizeof(mouseState), &mouseState), FAILED(hr))
{
LOG_ERROR("IDirectInput8::GetDeviceState");
return;
}

cursorPos_.x = clamp(cursorPos_.x + mouseState.lX, 0L, 1279L);
cursorPos_.y = clamp(cursorPos_.y + mouseState.lY, 0L, 1023L);

//SetCursorPos(cursorPos_.x, cursorPos_.y);

POINT pt;
GetCursorPos(&pt);

std::stringstream ss;
ss << "MOUSE " << cursorPos_.x << "," << cursorPos_.y << " (" << pt.x << "," << pt.y << ")";
LOG_INFO(ss.str().c_str());
}


634 :デフォルトの名無しさん:2008/10/09(木) 20:07:33
>>633
関係ないけど ,演算子をそんな風に使う人は初めて見た

635 :デフォルトの名無しさん:2008/10/09(木) 20:10:37
WAVEFORMATEX構造体のnSamplesPerSecに値がはいらないんですが、どうしてですか?
WAVEFORMATEX FEX;
ZeroMemory(&FEX, sizeof(WAVEFORMATEX));
FEX.nSamplesPerSec = 44100;
ここで変数をみても44100が入ってなくて0なんですけど

636 :デフォルトの名無しさん:2008/10/09(木) 20:12:16
>>633
試してないのでわからんけど、マウスカーソルの加速の分がずれてるとか・・・?

637 :デフォルトの名無しさん:2008/10/09(木) 20:25:37
>>636
ありがとうございます。「directinput マウス 加速」で検索したら解決しました。
DirectInputではマウスドライバから直接データを得るので、ウィンドウズのカーソルを意識するアプリケーションは
Win32関数かメッセージを使うように書いてありました。

638 :デフォルトの名無しさん:2008/10/09(木) 20:30:29
//ローカル回転&ワールド移動 >> ワールド変換行列設定
//
//角度はRAD
HRESULT CDXDevice::SetWorldTransformLW(D3DVECTOR &l_rot, D3DVECTOR &w_trans, int index)
{
D3DXMATRIX mat,mat2;
D3DXMatrixIdentity(&mat);


if (l_rot.x) {
D3DXMatrixRotationX(&mat2, l_rot.x);
D3DXMatrixMultiply( &mat, &mat, &mat2);
}
if (l_rot.z) {
D3DXMatrixRotationZ(&mat2, l_rot.z);
D3DXMatrixMultiply( &mat, &mat, &mat2);
}
if (l_rot.y) {
D3DXMatrixRotationY(&mat2, l_rot.y);
D3DXMatrixMultiply( &mat, &mat, &mat2);
}

D3DXMatrixTranslation( &mat2, w_trans.x, w_trans.y, w_trans.z);
D3DXMatrixMultiply( &mat, &mat, &mat2);

return SetWorldTransform( &mat, index);
}

行列を掛ける順番って x z yなんですか?

639 :デフォルトの名無しさん:2008/10/09(木) 20:36:35
望む結果に応じて好きな順序で掛ければ良い

640 :デフォルトの名無しさん:2008/10/09(木) 21:37:53
どなたか>>623の質問に答えられる人はいませんか?

641 :デフォルトの名無しさん:2008/10/09(木) 23:19:49
DIRECTXで描画をしながら、Windowsのテキストボックスなどを表示したいのですが
どのような方法がありますでしょうか?

普通にウィンドウにコントロールを作成するだけでは
DIRECTX側のpresentで上書きされてしまい、表示することができません。

ウィンドウモードならば、ウィンドウ作成時にWS_CLIPCHILDRENを指定することで
テキストボックスを部分のみをクリッピングすることができたのですが
フルスクリーンモードでは、当然上書きされてしまいます。

フルスクリーンモードでも通用する、何か良い方法はありませんでしょうか?



642 :デフォルトの名無しさん:2008/10/09(木) 23:25:12
GXUT custom UI

643 :デフォルトの名無しさん:2008/10/10(金) 00:00:03
ニセフルスクリーンモードにする

644 :デフォルトの名無しさん:2008/10/10(金) 00:01:41
>>641
上書きしないところに描かなければ良いだけ
そんな当たり前なことを聞く意味が分からない

645 :デフォルトの名無しさん:2008/10/10(金) 00:11:34
>>644
日本語でおk

646 :デフォルトの名無しさん:2008/10/10(金) 00:14:58
上書きしたくなければ、その位置に描くなということだろ

647 :デフォルトの名無しさん:2008/10/10(金) 00:21:06
>>644
上書きしなきゃいいって問題じゃない。
GDIサーフェスについて勉強してこい。

648 :デフォルトの名無しさん:2008/10/10(金) 00:34:59
設定をフリップにせず、present時に適切に描画位置を指定すれば上書きされない。
いくら無能でもその程度のことぐらい理解出来るだろ。

649 :デフォルトの名無しさん:2008/10/10(金) 01:31:48
別途専用ウィンドウを描画する

650 :デフォルトの名無しさん:2008/10/10(金) 07:31:36
このメソッドは、Microsoft Windows Graphics Device Interface (GDI) のダイアログ ボックスを、フルスクリーン モードのアプリケーションで使えるようにします。

構文

HRESULT SetDialogBoxMode( BOOL bEnableDialogs );


651 :デフォルトの名無しさん:2008/10/10(金) 13:22:58
>>635
どうやって確認してるの
ブレークポイント?

652 :デフォルトの名無しさん:2008/10/10(金) 23:28:45
StretchRectでモザイク的なもの作ろうと思ってるんだが、どうもメソッドが失敗しちゃう。
GetRenderTargetで成功しているコピー元とコピー先と同じの使ってるから何とかなると思ったが・・・
しかもMSDNの言ってることがよー分からん。RTテクスチャって何ですか?単純なオフスクリーンってなんですか・・・

天才が居たら助言頼む

653 :デフォルトの名無しさん:2008/10/11(土) 00:31:44
そういう用途に使うのなら素直にテクスチャとして、適切に位置指定して描画しろ。

654 :デフォルトの名無しさん:2008/10/11(土) 00:47:19
規制で書き込めませんでした…

>>642
DXUTでしょうか? ちょっと調べてみます。

>>643
自前で解像度変更して、ごまかすことも考えたのですが
強制終了した場合に解像度が戻らなくなってしまったりしそうで悩んでいます

>>644
>>648
言ってることはわかりますし、以前にその方法も考えたのですが
コントロールが単純な位置にあり、少ない方形でまとめられるのならまだしも、
「コントロールの位置が固定でなく、しかも複数が散らばる」という
状況ではどうしようもなくなってしまうので止めました。

>>649
テキストボックスから入力が必要な場面のみダイアログを描画、という
方法も考えたのですが、できるだけ1ウィンドウでやりたいと思っております。
(どうしようもなかったら、ダイアログを出そうかとも思っていますが…)

>>650
使用してみましたが、やはりフルスクリーンでは効果がないようです。
色々と調べてみた限りでは、ダイアログやメニューに対して効果があるようですが
ウィンドウに、子ウィンドウとして貼り付けたコントロールにも使用できるのでしょうか?

655 :デフォルトの名無しさん:2008/10/11(土) 00:55:41
クリッピング程度の単純な処理すら書けないのなら、
そもそもプログラムを組むのを諦めろ。

656 :デフォルトの名無しさん:2008/10/11(土) 01:01:18
>>654
逆に考えるんだ
ダイアログに効果があるのならダイアログに貼り付ければいいだろ

657 :デフォルトの名無しさん:2008/10/11(土) 01:21:36
>>655
>>648で言われたようにクリッピング的な処理は調べてみたのですけども、
今回の条件の場合には適切な方法なのでしょうか?

presentにはrect単位で転送領域を区切る方法などもあるようです。
ですが、仮にど真ん中にBOXがあったら、これを避けるように方形で区切ると
上下左右の4個の領域に区切るということになり、
仮にこのコントロールが複数ある場合には、非現実的に思えました。
(見当違いな意見を言っているようでしたら、すいません)

>>656
やはり難しいようなので、ダイアログを使って別ウィンドウに出すか、
もしくは最初に言われたDXUTとやらの勉強を始めてみたいと思います。
一応、presentの「後に」GDIでコントロールの画像を転送する、
という方法でトライしてみましたが、どうもちらついたりしてダメみたいです。

658 :デフォルトの名無しさん:2008/10/11(土) 02:16:27
複数矩形があろうが、その分だけ分解すればいいだけ。
その程度のことが非現実的だったら、
Windowsが行っているGUIのクリッピングは超常現象なのか?

659 :デフォルトの名無しさん:2008/10/11(土) 02:50:44
まっさきにDXUTのサンプル動かしてみるようじゃないと、今後も苦労しそうだな・・・

660 :デフォルトの名無しさん:2008/10/11(土) 20:30:03
hr = device->CreateIndexBuffer(
sizeof(WORD)*m_index_count,
0,
D3DFMT_INDEX16,
(fVRAM ? D3DPOOL_MANAGED : D3DPOOL_SYSTEMMEM),
&m_index,
NULL);

最初のsizeof(WORD)*m_index_count,って

*は乗算ですか?ポインタですか?

初心者すぎる質問ですいません。。。。。

661 :デフォルトの名無しさん:2008/10/11(土) 20:48:44
>>660

つ、釣られないぞ・・・・。

662 :デフォルトの名無しさん:2008/10/11(土) 21:08:24
どうみても乗算

663 :デフォルトの名無しさん:2008/10/11(土) 21:08:27
DirectX関係なさ過ぎる・・・
お前に必要なのはCの参考書だ。

664 :デフォルトの名無しさん:2008/10/11(土) 21:18:22
ポインタだよ。
次の方どうぞ

665 :デフォルトの名無しさん:2008/10/12(日) 09:18:14
HRESULT CDXPrimitive::SetVertex(LPVOID lpvertex, int point_num)
{
HRESULT hr;
LPVOID p;

//有効なデータ個数
m_point_active = point_num;

//バッファをロック
hr = m_vertex->Lock( 0, 0, (void**)&p, 0 );
if (FAILED(hr))
return hr;

//copy
CopyMemory( p, lpvertex, (DWORD)(point_num * m_pointsize));

//バッファのロックを解除
hr = m_vertex->Unlock();
return hr;
}

return hr と return S_OKの違いってなんですか? 調べても分からなかったので教えてください

666 :デフォルトの名無しさん:2008/10/12(日) 09:28:51
returnの意味がわかってないのか?

667 :デフォルトの名無しさん:2008/10/12(日) 09:34:15
return は この場合はHRESULTに返す値の事ですか?

hrとS_OKの違いが分からないです;;。

MSDNライブラリーでHRESULTで検索しても解りませんでした

668 :デフォルトの名無しさん:2008/10/12(日) 09:36:40
>>665
まず入門書でもいいから
Cの本を一冊以上読破して
C++の本を一冊以上読破して
Win32の本を一冊以上読破してから来い

669 :デフォルトの名無しさん:2008/10/12(日) 10:05:26
>>667
S_OK 定数
hr 変数

179 KB [ 2ちゃんねる 3億PV/日をささえる レンタルサーバー \877/2TB/100Mbps]

■ おすすめ2ちゃんねる 開発中。。。 by FOX ★
このスレを見ている人はこんなスレも見ています。(ver 0.20)
会社で使えない奴、それはワタシ/アイツ [プログラマー]

新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
名前: E-mail (省略可) :


read.cgi ver 05.0.7.8 2008/09/25 アクチョン仮面 ★
FOX ★ DSO(Dynamic Shared Object)