【C++】 DirectX初心者質問スレ Part5 【C++】
>>886 DXSTRUCTURE s = {sizeof(DXSTRUCTURE)};
そういう知らない人がいてもおかしくないマニアックな仕様を
わざわざ使うのはどうかと思うよ。
890 :
888:2005/09/15(木) 23:33:58
えー
>そういう知らない人がいてもおかしくないマニアックな仕様を
どこが?
2Dの単純描画を3Dで書いてる自分に矛盾を感じる。
無知を正当化するとはレベル高すぎですね。
ローカル仕様じゃなく、cの規格にのっとっているはずだし
Win32にも最初のメンバがサイズであるような構造体が大量にあるわけだが。
こんなん使ってるのやねうら某ぐらいだろ。
どんなスパゲッティなコードでも規格にのっとっていれば良いのか?
レベル高すぎだな。
速度や容量その他のメリットがあるならわからなくもないが、、
違わないなら、わかりやすい(多く知られてる一般的な)書き方をするのが当然だと思っていたが。
_, ,_ パーン
( ‘д‘) <馬鹿にレスつけんな!
⊂彡☆))Д´)
>>898
この手の話題はレスが伸びる 相変わらず
何処のスレでも言語に話が及ぶと伸びるよな。
それぞれ言語スレが立ってるだろうに。
つまり、ごく当たり前の仕様に則ったノウハウも知らない香具師ほど自分を否定された気になって吼えるんだよ。
俺の脳が摂動された。
904 :
デフォルトの名無しさん:2005/09/16(金) 08:09:58
結論はでてる。
仕様にも糞仕様ってものが存在する。
特にプログラムにおいて可読性は最優先事項だ。
一体
>>888で何が得られるものがあるのか激しく疑問。
就職作品なら書いてあった時点で落とす。あまりにもキモ過ぎ。
906 :
デフォルトの名無しさん:2005/09/16(金) 11:47:41
Direct3Dで3Dのモデルをフォームに表示したいと思っています。
当方、VisualStudio.NET(2003じゃない)を持っており、DirectX9をインストールしました。
VisualStudio.NETで、(できればVBで)
DirectXインストールから、マウスドラッグで簡単な3Dモデルが動かせるようなプログラムを
書くまでを解説してるようなサイトってないでしょうか?
DirectPlayでDPN_PLAYER_INFO構造体のpvDataに文字列Sを入れる場合
dwSizeはstrlen(S)+1でいいんですよね?
間違えました。DwDataSizeです。
>>886 HOGESTRUCT d = { sizeof(d) };
として、dwSize の初期化と残りのゼロ埋めを
まとめてやってしまうコードもたまに見るな。
911 :
デフォルトの名無しさん:2005/09/16(金) 14:23:33
>>910 俺は0埋めがメインで、sizeof dはついでだと思っている。
914 :
デフォルトの名無しさん:2005/09/16(金) 22:59:02
BC++5.5やmingwのようなフリーのコンパイラで
DirectX9による3Dプログラミングは出来ますか?
Webの情報だと古いものしか見つかりませんでした。
ご存知の方いらしたら教えていただけないでしょうか?
>>914 やったことないけど、DirectXSDK を落としてきてパス設定とか設定すれば問題ないはず
916 :
デフォルトの名無しさん:2005/09/17(土) 12:06:06
class CCharData {
public:
CCharData() { ZeroMemory(this,sizeof(CCharData)); }
LPD3DXMESH pMesh;
D3DMATERIAL9* pMeshMaterials;
LPDIRECT3DTEXTURE9* pMeshTextures;
DWORD dwNumMaterials;
} ;
enum { MAX_CHAR = 10 } ;
CCharData CharData[MAX_CHAR];
という風にCCharDataクラスを使ってXFileを読み込み表示したのですが
for (int i=0; i<MAX_CHAR; i++) {
SAFE_RELEASE( CharData[i].pMesh );
CharData[i].pMeshMaterials = NULL;
CharData[i].pMeshTextures = NULL;
}
でメモリ解放してもメモリリークしてしまいます。
クラスでなく構造体でやるとメモリリークしませんでした。
どこが悪いのか教えていただけないでしょうか。よろしくお願いします。
クラスとか構造体とかとは関係ないんだけど
> CharData[i].pMeshTextures = NULL;
これはまずいんじゃない?
これもRelease呼び出さないと。
>>CCharData() { ZeroMemory(this,sizeof(CCharData)); }
どうでもいいけど、これクラスが仮想関数持ってたら
仮想関数テーブルポインタも初期化しちゃって、そのうちアボンよ。
>>917 >SAFE_RELEASE( CharData[i].pMesh );
よくわからんけど、これがそうなんじゃね?
920 :
デフォルトの名無しさん:2005/09/17(土) 12:55:33
>>917 ポインタはリリースできないとか言われちゃったので、無理やりNULLしてました;
>>918 おおお;そんなことが。
変数ごとにNULLか0かします。
>>919 SAFE_RELEASEでメッシュをReleaseしてNULLを入れてるんですが迷子です
ZeroMemoryをやめてD3DMATERIAL9とLPDIRECT3DTEXTURE9をポインタで
無いようにしてやってみます。
ありがとうございます。
921 :
916:2005/09/17(土) 14:22:50
できました!
初歩的なミスでしたすみません;
for (int i=0; i<MAX_CHAR; i++) {
for (int j=0; j<CharData[i].dwNumMaterials; j++) {
SAFE_RELEASE( CharData[i].pMeshTextures[j] );
}
delete[] CharData[i].pMeshTextures;
delete[] CharData[i].pMeshMaterials;
SAFE_RELEASE( CharData[i].pMesh );
}
と配列の削除を入れたらメモリリークが無くなりました。
>>921 あー、そういやそんなのあったなぁ。
STLのvectorとstringとlistはお手軽に使えて便利だから
ちょっとだけかじってみればそういう苦労なくなるよ。
924 :
デフォルトの名無しさん:2005/09/18(日) 01:22:16
コンパイルしたexeを直接実行するとMPEGファイルが実行できるけど、
デバッガの中から実行するとRenderFile()で0x80040200エラーになってしまう。
何か手がかりありませんか?
環境はVisual C++ 2003, WinXP Proです。
MPEGファイルがdebugフォルダの中にある
926 :
924:2005/09/18(日) 01:50:27
"MPEGファイルが実行"→"MPEGファイルが再生"の間違い。
>>925 ファイルはプロジェクトと別フォルダに置いてあります
MPEGファイルへのパスを、フルパスで渡すと?
928 :
924:2005/09/18(日) 01:58:09
渡してます。
#defineFILENAME L"c:\\home\\foobar.mpg"
....
IGraphBuilder *pGraphBuilder;
IMediaControl *pMediaControl;
HRESULT hr;
hr = CoInitialize(NULL);
hr = CoCreateInstance(CLSID_FilterGraph,NULL,
CLSCTX_INPROC,IID_IGraphBuilder,(LPVOID *)&pGraphBuilder);
hr = pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID *)&pMediaControl);
hr = pMediaControl->RenderFile(FILENAME);
ここでエラー。
929 :
924:2005/09/18(日) 01:58:42
渡してます。
#defineFILENAME L"c:\\home\\foobar.mpg"
....
IGraphBuilder *pGraphBuilder;
IMediaControl *pMediaControl;
HRESULT hr;
hr = CoInitialize(NULL);
hr = CoCreateInstance(CLSID_FilterGraph,NULL,
CLSCTX_INPROC,IID_IGraphBuilder,(LPVOID *)&pGraphBuilder);
hr = pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID *)&pMediaControl);
hr = pMediaControl->RenderFile(FILENAME);
ここでエラー。
930 :
デフォルトの名無しさん:2005/09/18(日) 04:30:29
今作りかけのゲーム用のライブラリがあります。
これのインターフェイスはほぼ素のC++であり
依存する他のライブラリはDirectXぐらいです。
これらの設定を入力する為にダイアログを作らなきゃならなくて
windows用のGUIフレームワークが必要になるんですが
何使うのがベストですか?
思いついた一覧
MFC → IDEのサポートが効くしシンプルな構造で使いやすそう、独自コンテナとかウザい、この板の評判が悪い。
ATL/WTL → 軽い、この板の評判はいい、ドキュメントがソースのみ、MFCそっくりなのであえて選ぶメリットが不明瞭。
JavaSwing → 今風な作りで楽に書けそう、Windows+DirectXの構成でわざわざJavaを選ぶのはアクロバティック過ぎないか?
そもそもDirectX動くのか?
.NET WindowsForm → 今風な作りで楽に書けそう、.NETの仕様を一から覚えるの大変、MC++なんとなく嫌。
Win32プラットフォームのライブラリならって事だけど、
どれも全く経験が無いなら、MFCが扱いは楽で導入の問題も比較的少ない。
.netは、クライアントに.net Framework入れるのが前提になるので、
俺は配布するようなライブラリには、絶対選ばない。Javaも同様。
ATL/WTLが個人的には一番オススメ。使用経験ないならこの際いかが?w
MFCそっくりだから選ぶメリットが不明瞭というけど、
それはGUIフレームワークを使用して、プログラミングした時だけの話でしょ。
結果生成される物は、似て非なる物だもの。
初心者がMFCやるとDoc/Viewだけでわけ分からなくなって撃沈するんじゃないの?
そんなに複雑なもんでもないと思うけどDoc/Viewは。
あれで躓くようなら、他のGUIフレームワークどれでも躓くような気がするが。
それだったらいっそのこと、VCLでも薦めるよ。
MFCだからといってDocViewを強制される訳では無いのだが・・・
>windows用のGUIフレームワークが必要になるんですが
>何使うのがベストですか?
もはやQt以外に選択肢は無いな。
DirectX 7 SDK 日本語ドキュメントが欲しいのですが、MSサイトに行っても
8以降のバージョンしか置いてありません。
他にインターネット上で入手する方法はありませんか?
すみません自己解決しました。
MFCわかんね。
ダイアログだけ使うならMFCも難しくはないでしょ。
ダイアログだけで良いなら、APIだけで作るのもありかと。
たかがゲームの設定ダイアログだけの為に、フレームワークだの何だのは大げさな気がするけど。
そう、ダイアログなんてAPIだけで十分。
プログラムからやるのは、初期値の設定と最後に
ダイアログから値を取得することくらいだし。
APIベタでやるんならWTLでいいじゃん
WTLなんて今更感ありすぎ
今の時代WTFだよな
945 :
930:2005/09/18(日) 16:21:50
お答えありがとうございました。
お答え参考にしてMFCで行くことにします。
Qtというのもちょっと調べてみます。
マウスカーソルの位置によって速度が変わります。なぜでしょう?
解像度を640x480にすると、SDKサンプル全てで発生します。
947 :
デフォルトの名無しさん:2005/09/19(月) 02:18:28
DirectX9の勉強をするために、本を3冊ほど買ったのですが、
発行年度がバラバラで、
1.2004年1月
2.2004年11月
3.2005年3月
となっていて、一番新しいやつを読むと、2004年の途中で大幅に仕様が変更になったらしいのですが、
この場合どうしたほうが良いでしょうか?
自分として考え付くのは、発行年度が一番古い本のバージョンのDirectXを入れて、古い順に勉強していって、
次の本に行くごとにその本にあったDirectXのバージョンを入れる
または、一番新しいやつを最初に勉強して、古いやつのコードを新バージョンのDirectXにあうように書き換える(出来るかどうかわかりませんが)。
位なんですが、どうでしょうか?
2chでは糞本が多いとされるDirectX関連本をまとめて3冊買う蛮勇にまずは乾杯。
仕様変更っちゅーても、初心者が学習する範囲においては気にするようなモンじゃないよ。
いーんじゃない? 新しいので。なんの本買ったのか知らんけど。
>>947 SDK付属のサンプルコードだけで十分。
Microsoft謹製
950 :
947:2005/09/19(月) 11:52:01
一応アマゾンでは評価が高いやつを買ったんですけど、
1.DirectX9シェーダプログラミングブック
2.DirectX9ゲームプグラフィックスログラミング Ver.2
3.DirectX9 DirectX Graphics
を買ったんですが、古いやつほど、ページ数が多く色々書いてあるので・・・
仕様変更は、ライブラリが変更になったり、関数が変更になったりと書いてあったと思うんですが、
古いコードを新バージョンに対応させることって出来ますかね?
951 :
947:2005/09/19(月) 11:54:30
>>949 SDKのヘルプとかも一応見たんですけど、どうもPC上に書いてある長文は苦手で、
本で見れるものがほしかったので。
というか今現在出版されてる書物で最新のDirectXの仕様に対応してる奴ってないよな?
SDK付属のドキュメントも日本語版は古いままだしなぁ。
そりゃ最新の仕様が出たのが8月だしな
一番古いのがシェーダプログラミング
とか書いてあるし
どのみち後ろの二つで先に基礎を学ぶことになるのでは
DirectX SDKのチュートリアルに当たる部分に仕様変更なし
>> パフォーマンスの低下を招くことは間違いないようなので、正方形にします。
>現在テスト可能な環境、SavageIX、G200、G400MAX、Radeon9600Proで、
>トランスフォーム済み頂点で1024×512のテクスチャを640×480に切り出して
>ひたすら描画するだけのテストをしてみましたが、
>512×512を二枚使って二回描画した方がパフォーマンスが落ちてしまいました。
>
>間違いないと断言されていらっしゃるので、何らかのテストされたのだと思いますが、
>具体的にどの製品でどのような描画の仕方でパフォーマンスの低下が確認できたのでしょうか?
2回レンダしたら遅くなるの当たり前だろ知障
2048*1024と1024*1024から640*480だけ抜いて比較しろよ染色体異常者
おこったごーん
>>956 2048にする意味がわからんのだが、
そもそも1024*512と512*512二枚とどっち使うかという話だったんでは?
俺は素直に1024*512使うが。
>>958 あいつは正方形のほうが速いということに反応し、
512*512*2と1024*512で比較したんだよな?
正方形が速いという話はテクスチャ1枚のことであって、
2枚と1枚を比較してる時点で頭おかしいだろ?
640*480で正方形と長方形を比較するなら、
これがすっぽり収まる2048*1024と1024*1024だろ?
元々の512*512*2と1024*512の話は別で、
どれぐらいの大きさまで使えるのか聞いてただけだろ?
>1024×1024ぐらいのサイズのテクスチャはたいてい作れます。
>ただ、なしさんが言われたようにパフォーマンスは保障されません。
>工夫して、無駄をなくすことを心がけましょう。
>例えば、よく使う640×480や800×600の背景などは、実は512×512のテクスチャ2枚の中に納まります。
>これだけで、1024×1024のテクスチャよりも半分節約できます。
こいつがそもそも頓珍漢
同一人物か?
962 :
デフォルトの名無しさん:2005/09/19(月) 18:53:37
つーか、
>>956ってどこへのレスなんだ。
アンカーぐらいちゃんと使ってくれよ。
963 :
デフォルトの名無しさん:2005/09/19(月) 19:08:31
今c++を勉強してるんだが、掲示板みてるとJAVA
の方が主流?そこで質問
C VS JAVA
使いやすさ、流通度、就職や職場ではどちらが使われているか
の点から意見求む。
>>963 スレタイも読めない人には教えられません。
というか先に日本語勉強しましょう
>>963 C++とDirectXが主流ですよ
使いやすいし、これ以外流通してない
JAVAは趣味程度なのかな?
ここの板みてるとJAVAが多いような気がする。
967 :
デフォルトの名無しさん:2005/09/19(月) 19:43:29
何故BBXの話題がここで?
わざとJavaの話題を出して、C++使いにJavaを叩いてもらいたい、
よくある厨のパターンですか。
970 :
924:2005/09/19(月) 22:31:17
924です。
相変わらず解決しません。
MPEG1, AVIは問題なくデバッグ可能ですが、MPEG2だけだめみたい。
(作りたいのはMPEG2なので、他のフォーマットが再生できても)
アドバイスをお願いします
MPEG2だからじゃね?
D3DXPlaneFromPointsに指定する頂点の順番は
時計回りでよろしいでしょうか?
973 :
デフォルトの名無しさん:2005/09/20(火) 00:03:28
test
このスレを埋めたいと思うのは俺だけだろうか?
埋め
そろそろ次スレ
>>972 時計回りなら平面の法線(a,b,c)が上、逆なら下になるわ。
(v2-v1)と(v3-v2)の外積(の正規化ベクトル)ね。
平面の式としては同じだけど、
平面の向きが関係する関数(D3DXPlaneDotCoordとか)では
結果が変わってくるみたいね。
とりあえず法線が上になる時計周りにしておけばいいわ。
D3DXPlaneFromPointNormalってのもあって、こっちの方がわかりやすいかもね。
979 :
974:2005/09/20(火) 00:30:41
親切な解説どうもありがとうございました。
こういうドキュメントに載ってないのは、やっぱり
実験実証なのでしょうか。て、それしかなさそうですね。
面倒くさがりな自分....
サービスプロバイダとポートだけ設定して
hr = lpDirectPlay8Peer->Connect(&dpnAppDesc, prgHostAddr, prgDeviceInfo,
NULL, NULL, NULL, 0, NULL, NULL, NULL,
DPNCONNECT_OKTOQUERYFORADDRESSING | DPNCONNECT_SYNC);
if(FAILED(hr)) {
//エラー処理
return;
}
として実行したらIP入力ダイアログに何を入力してもエラー処理に行かないで
ダイアログが再度出てくるのですがDPNCONNECT_OKTOQUERYFORADDRESSINGっていうのは
そういう仕様なんですか?
キャンセルしてもダイアログがまた出てくるから強制終了しか出来ないorz
981 :
980:2005/09/20(火) 02:49:18
あー、DirectPlayのサンプルを試したらちゃんとエラー処理に行ってるなぁ。
どこで何間違えてるんだろう…orz
埋め
後17
次たってないのに梅んな
>>982 IPアドレスはコーディング段階では未入力で
実行時にDPNCONNECT_OKTOQUERYFORADDRESSINGによって作成されたダイアログに入力してます。
適当な数字、文字列、ポートを指定せずにIPを入力してOK、もしくはキャンセルを押した場合は
即座にIP入力ダイアログが再出現します。
127.0.0.1:2345などの形式で入力した場合は、接続試行をした後再度ダイアログが出ます。
>>986 DirectPlayのサンプルが、きちんとエラー処理に飛んでるなら、
絶対どこかに違いがあるはず。
ほんの些細な事でもいいから具体的な違いを見つけ出すしかないかと
988 :
980:2005/09/20(火) 09:59:30
>>987 原因が判明しました。
bool OnConnect () {
//省略
hr = lpDirectPlay8Peer->connect(...);
if(FAILED(hr)) {
MessageBox(NULL, "接続失敗", "ERROR!", MB_OK | MB_ICONWARNING);
return false;
}
としているのですが、このOnConnect()が誤ってループの中に書かれているというお約束のミスでしたorz
お騒がせしました。申し訳ないorz
次スレよろしく
それにしてもなんで【C++】なんだろw
【C++】【C♯】ならともかく何で【C++】を2つ書く必要があるのかってのは前から思ってた
おまじない
結界張ってんだよ
C++ってしーぷらぷらって読むよりしぽぽって読むほうが楽しいよ、ね?
ume
@2ハァハァ
1000は俺が取る!
誰かが1000を狙ってる余寒
俺が1000だ!!!!!!!!!1111111111111111111
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。