トップページ⇒tech
1001コメント303KB

C#でDirectX9 初心者の館

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
Windows Longhorn でGDIに取って代わって標準になりそうなDirectX9ですが
GDIと違ってドキュメントも難解で何をすれば描画できるのかさっぱりさっぱりなライブラリです。
その上知っている人はレベルが高すぎて聞いても宇宙語でしす(泣
そんなDirectX9を将来に備えて勉強してみようというスレです。
Microsoftの掲示板
http://www.gdncom.jp/general/bbs/ShowForum.aspx?ForumID=29
SDKをダウンロードできるところ
http://www.microsoft.com/japan/msdn/directx/downloads.asp#CDasp#CD
0091デフォルトの名無しさんNGNG
>>85-90
サンクスコ。 とりあえず自作板とか初心者板、くだ質巡って 情報収集してきます。
早く喪前らと同じくらいの実力をつけたいですよ・・・。第一歩すら踏めてない。

もともとゲーム(=DirectX)使うつもり無くてPC買ったからなぁ。
少しグラフィック関係には弱いのかもしれない。
デスクトップにテレビ機能なんていらんから、3Dを強化したの選べばよかった。

デスクトップ(2002年購入)は英語分からんからメーカーの日立に聞いたら
「無い」って断言してたので諦め。
ノート(2004年購入)はメーカーのNECのウェブサイトにドライバアップデートの時に見たら
ATI社の RADEON だった。期待できるかもしれないな。
0092デフォルトの名無しさんNGNG
>>74
// マルチレンダリングターゲット
device.DrawUserPrimitives(PrimitiveType.TriangleFan, 2, verts);
をつかいましょう僕も動的に扱うのにC#の資料がなくて苦労しました。。。
vertsにフレキシブルな頂点データの参照を書きます(わかるよね?)
あとはサンプル、ヘルプやC++の資料を柔軟に解釈すればできるはずです。

では健闘を祈ります
0093デフォルトの名無しさんNGNG
>>80
C#からDirectXを始める場合資料がないので結局C++からC#に直して考えるかMSのページで我慢するかです
3Dグラフィクスを始めたい場合おすすめ書籍は

「DirectXゲームグラフィックスプログラミング(N2Factrory)」

をみるとけたたましくわかりやすいです。すべてのDirectXの初期化コードの意味がわかるようになります。
いかんせんC++なのですがC#に似ているコマンドを探せば何とか対処できるはずです。

C++より断然かんたんなC#ですからがんばってください。
0094デフォルトの名無しさんNGNG
>>91
そのパソコンでも勉強はできます。
3Dゲームプログラムは2Dゲームの応用なので
まずDirectDrawをつかった2Dゲームを作る練習からすると良いと思います。
またDirectDrawは初期化も簡単だし、スプライトさえ表示できれば簡単にゲームが作れます。

ぜんぜん悲観することはないですよ。
0095デフォルトの名無しさんNGNG
>>93
>をみるとけたたましくわかりやすいです
斬新な表現だ。

0096デフォルトの名無しさんNGNG
つーかさ、DirectXを叩くクラスが.NET Frameworkにあれば
けたたましく苦労する事ないのにな。
0097デフォルトの名無しさんNGNG
>>94
自作板で厨房な質問したのに、親切に教えてもらえた―(゚∀゚)――!!!
おかげで無事にドライバアップデート完了。
Direct3Dが使えるようになりますた。

これで日経ソフトウェアについてたサンプルが実行できますよ。

その後は2DからDirectXの勉強していきたいです
0098デフォルトの名無しさんNGNG
よかったな。厨房質問しなくて良いようにがんがれよ
0099デフォルトの名無しさんNGNG
88べーしっくしかつかったことなかったが
きょうからC#とDirectX9勉強する
初心者にもわかるHPつくってまとめるから
わからないことあったらおしえろ
と書いてみるてすと
0100デフォルトの名無しさんNGNG
なんだよ まじで誰もいないのかよ
C#.netでDirectXってこと自体が破綻してるってことか?
だがチュートリアルを攻略するまでは諦めんからな
誰でもいいから教えろまじで
0101ぐっすり八兵衛NGNG
...zzzZZZ
0102デフォルトの名無しさんNGNG
>>92
>// マルチレンダリングターゲット
>device.DrawUserPrimitives(PrimitiveType.TriangleFan, 2, verts);

ありがとうございます。がんばって調べてやってみます。
C++からDirectXやっている方は、C#でプログラムしてもなんとかなるかと
思いますが、C#からDirectXをはじめたものとしては、参考書とか少なくて
大変です。これからもがんばってみます。
0103デフォルトの名無しさんNGNG
C#からDirectXを始めたヤシはC++の参考書も読むべし
0104デフォルトの名無しさんNGNG
>>102
そのへんは結構がんばったのでまた分からないことがあれば質問してください。
ま、僕が答えられたらの話だけど。。。
010599NGNG
C#。NETの本を読んでみた
Cっぽくてなんとなくわかりやすかった
土日でDirect3Dのチュートリアルをやりまつ
とイチイチ予告してみるてすと。
0106デフォルトの名無しさんNGNG
>>105
独り言を言いたいならゲ製作技板にそういうスレあるよ
0107デフォルトの名無しさんNGNG
Direct3Dのチュートリアル1の
パラメータ設定んところで SwapEffectの項目は
D3DSWAPEFFECT_DISCARDが選択されてますが

D3DSWAPEFFECT_FLIP
D3DSWAPEFFECT_COPY
との違いが説明読んでもよくわからないので
解説お願いシマス
0108デフォルトの名無しさんNGNG
>>107
交換と上書きコピー
0109デフォルトの名無しさんNGNG
>>108
D3DSWAPEFFECT_FLIP = バッファ交換
D3DSWAPEFFECT_COPY = 上書き
D3DSWAPEFFECT_DISCARD = これは何?
0110デフォルトの名無しさんNGNG
>>109
ドライバに任せる
0111デフォルトの名無しさんNGNG
超サンクスコよくわかりました
0112デフォルトの名無しさんNGNG
おれも聞きたい。
SwapEffect.Discardのとき250のfpsが
なぜかSwapEffect.CopyにするとFpsが200になる??

読んでもあんまわかんなかったけど予想はつく、
Discardだとバックバッファの情報はPresent()した瞬間に消えて再利用ができない。
Copyの場合バックバッファを二つ作ってPresent()した後コピーするからバックバッファを利用できる。
しかしメモリ効率が悪い。

たぶんCopyはマルチパスレンダリングや2分割画面を使うのに有効だと思う。。。
0113デフォルトの名無しさんNGNG
>>55
>ちゃうちゃう、この場合すでにFormクラスにループが仕込んであってイベントがあったら
>それに対応したメソッドを呼ぶんよ。

その仕込んであるループってどういう形なんだろうか?
その部分がメソッド化しててオーバーライド可能であればWin32APIのような
メッセージループができるわけだが・・・
0114デフォルトの名無しさんNGNG
Form.WndProc()
0115113NGNG
>>114
なるほど!ありがとうございました。そのまんまWndProc()だったんですか!
C#で何も操作していなくても画面が進行していく処理が知りたかったのですが
これならタイマやスレッドを使うより高速で安定してますね。

近いうちにC#とDirectXで何か作ろうと思ってた所でとても助かりました。
0116デフォルトの名無しさんNGNG
http://www.geocities.jp/mootdata/
0117デフォルトの名無しさんNGNG
>>79
その記事はDirectX初心者用ではないよ。
だってソースも間違ってるから、それに気づかないとダメっぽいw

それと、その程度で行き詰ってるようでは先は無いな。
諦めろw
0118デフォルトの名無しさんNGNG
諦めろとか、やめろとか安易に言う奴さ、
おまえはよほどいいゲームを作れたんだな?
作品見せてみろよ

初心者用の板で吼えてるんじゃねーよ
子ね
0119デフォルトの名無しさんNGNG
>>116 >>90
アフォ、DoEventは動作が不安定になる(数秒間とまったりする)ってManaged DirectXの
作者自らが公言しているだろ。
きちんとApprication.run(form)して >>114みたいにプロシージャでループ作れよ。

ttp://blogs.msdn.com/tmiller/archive/2003/11/07/57524.aspx
0120デフォルトの名無しさんNGNG
↑すまん、レス間違い

>>90 ×
>>60 ○

0121デフォルトの名無しさんNGNG
C#+DirectX関連の書籍、
いつまでたっても
ほとんどでなさすぎだなぁ。
0122デフォルトの名無しさんNGNG
すごい日本語ですね。
0123デフォルトの名無しさんNGNG
日本語は意味が伝わればモウマンタイ。
0124デフォルトの名無しさんNGNG
どうでもいいけど、ゲイツちゃんは
DirectXベースの.NETFrameworkは作らないのかよ!?
0125デフォルトの名無しさんNGNG
Microsoft XNAのことか?
0126デフォルトの名無しさんNGNG
DirectXがFrameworkに取り込まれたら
けたたましくステキなヨカン
だが、逆に使いにくくなるような気がしなくもない予感

>122
?
0127デフォルトの名無しさんNGNG
しかしC#+DirextX9の解説はネットにあまり転がっていないなぁ。
本のほうも、あまり多くないし、ヘルプは 更新されていないし間違い多いし。

>>117
ソース間違っているの?まだ日ソフのサイトから ソースだけ落として
VC#のプロジェクトに変換しただけで 中身見て無いけど。
実行はできたけど。
0128デフォルトの名無しさんNGNG
>>127
俺は>>117しゃないけど多分、サンプルの方。
Direct3D.Fontクラスの第一引数がnullになってる。
ここってstringでしょ?
0129デフォルトの名無しさんNGNG
>>127
7月号特集7「C♯とDirectXで3Dゲーム作りに挑戦!」の106ページリスト4font.DrawTextの第一引数のこと?
あと、サイトから落とせるt70407.zipのD3DSampleフォルダのWinForm.csと
SpaceSimフォルダのGamePlay.csにあるfont.DrawTextの第一引数もnullになってるね?
C♯Builderではこれでいいの?
VC♯だとnullを消さないと「引数が多い」等のエラーでコンパイルできなかった。

Microsoft.DirectX.Direct3D.FontのDrawTextメソッドのシグネチャは2種類あって
どちらも第一引数はstringなんですね。
私は先月C♯は始めたばかりなのでよく分かりませんが、他の方で修正無しでコンパイルできた方はいるのでしょうか?
ソースファイル自体は貴重な情報源なので重宝してますが。
0130デフォルトの名無しさんNGNG
>>129
外出だろうけど
コンパイルできない理由は多分、参照しているDirect3Dアセンブリのバージョンが違うからじゃねーの?
ここ読んでみろ。
http://www.dwahan.net/nyaruru/getreadyformdx/

DirectX9.0bのDirect3Dアセンブリのバージョンは1.0.900.0
DirectX9.0 UPDATE SUMMER 2003のDirect3Dアセンブリのバージョンは1.0.1901.0
日経のそのソースは後者のDirectX9.0 UPDATE Summer 2003で組まれているから1.0.1901.0の方を参照するべし!

もしDirectX9.0bのみがインストールされてたらコンパイルできねーよ。
ランタイムの方にもバージョンの違いで動かない等、問題がおきているよね。
0131デフォルトの名無しさんNGNG
リスクがいっぱいのManagedアプリよりも、Javaでのんびりゲーム製作したほうが楽しいと思う。
メインループさえまともに起こせない現段階のC#+ManagedDXに力注ぐのは無駄。

もう一度言う。LongHone出るまではキッパリあきらめて、Javaゲーム製作の練しとけ。
0132デフォルトの名無しさんNGNG
同人ゲームつくるのにC#がいいかなって思ってるんだけどさ、
どうやって配布すりゃいいのか悩む。
.NET Framework再配布パッケージをCDに入れるのも、なんだかトラブルの元になりそう。
Javaで作っても同じだけどね。

ネット配布の場合はMSのページにリンクでも張っとじゃなんとかなるかもしれんけど、
CD媒体のアプリではC#は避けるべきなんだろうか…
0133デフォルトの名無しさんNGNG
トラブルの元になりそうと思った理由は?
0134デフォルトの名無しさんNGNG
RPGツクールのようなゲームエディタ系アプリの中で
ソースコードを吐き出してくれるモノってあるの?
板違いかもしれんが・・・
0135129NGNG
>>130
最新のSDK入れたら動きました。初代9.0からSDK変えて無かったorz
0136デフォルトの名無しさんNGNG
>>131
Javaじゃろくなゲームできないだろうに。
現行の市販3Dゲームと同じような
クオリティのものなんてみたことないぞ。
Java3Dってパフォーマンスよくないっしょ。
0137デフォルトの名無しさんNGNG
>>131
>メインループさえまともに起こせない現段階のC#+ManagedDXに力注ぐのは無駄。
それはつまりスレッドをまともに扱えない無能者であることの宣言ですか?
0138デフォルトの名無しさんNGNG
>119
単にDoEventの行だけ削除するんじゃダメなん?
0139138NGNG
今更だがスゲーあほな質問してました
ダメに決まってるよな  スマソ
014054NGNG
WndProcの中で永久ループしちゃっていいの?
いまやってみてるけど、巧く行かない…。

113さんは巧く行ったのだろうか。
0141デフォルトの名無しさんNGNG

.NET系はソースレベルで逆コンパイルできるから
EXE配布==ソース公開 と思ったほうがいいぞ。

せっかくC#にもなれてC#まんせーって感じだったのに
まともなリバースエンジニアリング対策ができない事がわかってやる気なくした。

難読化ぐらいはできるがデバッグ情報付で再コンパイルできるんだぞ
署名機能とかあるけど間単にはずせる。

ようはオープンソース派以外は.NET系は使わないほうがいい。
もしくはMSにどうにかしろとメールだすなりして対策されるまで使わないか、
せめて誰かエロい人が.NetFrameworkのコール隠すツールが作られて公開されるまで.NET系は使わない方がいい。

0142132NGNG
>133
単純に、インストーラを2つ立ち上げなければならないってだけで、
ユーザは十分混乱すると思われ。

…と思ったんだが、さっきぐぐってみたら.NET再配布パッケージをインストーラに
ふくめることができるツールがあるとか。
ただし英語版のみで日本語環境ではそのままでは動かないらしいが。
http://www.gdncom.jp/general/bbs/ShowPost.aspx?PostID=1509

それじゃ配布に関しても特に問題はないのか…俺のC#Builderで
こいつが動くかどうか不安だが。
0143デフォルトの名無しさんNGNG
>141
そんなのはどの環境で作ったって同じでしょ。程度の問題で。
0144デフォルトの名無しさんNGNG
>>140
何故スレッドを使うという選択肢が存在しないのですか?
0145デフォルトの名無しさんNGNG
>>143

程度っていうけど普通のEXEの逆アセンブルレベルじゃないぞ
普通のEXEならC++のクラスレベルで逆コンパイルは出来ない。(少なくとも漏れのしるかぎりでは)

.NET系の場合は綺麗に逆コンパイルできるから
EXEから一部のクラスをそのままぱくる事が可能。
しかもILレベルで逆コンパイルとじゃなくC#の言語レベルで逆コンパイルできる。
0146デフォルトの名無しさんNGNG
たいしたものでもないのに、
やたらソース見せたくないと思ってるやついるよな。
0147デフォルトの名無しさんNGNG
パクられて困るようなものってそんなにないと思うがどうか
0148デフォルトの名無しさんNGNG
ネットゲーム
0149デフォルトの名無しさんNGNG
パスワードがべた書きとかじゃなければ 別に良いよ。
どうでも良いヤツ(糞ソースとか、ブス女とか)ほど隠したがるのは
どの世界でも共通なんだなw
0150デフォルトの名無しさんNGNG
議論がずれてないか?

なんにしても、ソースまる分かりな.NETを商用で使えるかってなると使えないだろ?
ソースが綺麗とか価値があるないとかは関係ないぞ
0151デフォルトの名無しさんNGNG
初心者の館で商用の話すんなよ
0152デフォルトの名無しさんNGNG
>>151
同人ゲーで一儲けしようと思ってるんだよ。
相手にすんな。
0153デフォルトの名無しさんNGNG
商用でソースがバレたらなぜだめなのかがわからない。
ネットゲームでプロトコルがバレたらまずいなどの理由ならわかるが
商用全般を指しているようだ

>ソースが綺麗とか価値があるないとかは関係ないぞ
と書いてあるので技術流出も関係なさそうだ

いまいち想定している危険が想像できない
0154デフォルトの名無しさんNGNG
(´-`).。oO(商用でソースばれたらダメダメでは…
015554NGNG
>144
スレッドを使うという話になってなかったから。
いま仕方ないのでスレッドでやってます。

でもWndProcで出来ないというのもイヤですよね?
せっかく聞いたのに。
0156デフォルトの名無しさんNGNG
WinProcをオーバーライドして使ってみたんだが、
何かしらのメッセージが発生した時に来る。
つまり、PeekMessageの中って事になるわけで…。
それだったらループには組み込めないんだけど、
WinProcで回してる人はどうやってやってるんだろう?
それよりも実際にいるの?
0157デフォルトの名無しさんNGNG
>>156
Controlクラス上のイベントハンドラの定義されていないようなメッセージの場合は
Win32APIの時と同じようにswitch,case文で自前でメッセージ処理を行えばいい。
ドキュメントのControl.WndProcの欄を見ればやり方が書いてある。
てか普通、気にしなくてもいいと思う。

>>140
その中でループを組んじゃダメ。
WndProgメソッド自体をループだと思えばいい(毎フレーム呼ばれる、と思う)
アプリの初期化処理はApprication.run()以前に済ませておくか、formのコンストラクタ内でやる。
描画に関してはOnPaintをオーバーライドしてDevice.Begin()〜end()を含んだRander()なりを入れればOK。
This.invalidate()メソッドをオーバーライドしたWndProc()の最後に入れてやると、
実行後ほおっておいても再描画を繰り返してくれる。

チョット分かりにくい説明ですまんが
0158157NGNG
>>156
常にWM_ACTIVATEAPP (0x001C)は呼ばれている(毎フレームかどうかは知らんが)ので大丈夫です
0159157NGNG
すまん、徹夜で超疲れてて発言おかしい。

Summer2004版ではおそらくDoEventの改善は行われるはずだから
リリースまで待ってみるのもいい。

0160157NGNG
俺はこんなかんじでやってるが、問題なし。


protected override void WndProc(ref Message m)
{
     switch(m.Msg) {    // メッセージ処理
       case 0xxxx:
        break;
       }

     Game.mapDraw();    // マップ処理
     Game.characterDraw(); // キャラクタ処理
     Game.padInput();     //入力処理
    base.WndProc(ref m); // 親クラスにもメッセージを送る(必須)
    this.Invalidate(); // 画面の更新(OnPaint()を呼んで再描画する)
}
0161デフォルトの名無しさんNGNG
スレッドを使えばいいだけのことを、なぜわざわざメッセージループ中でやろうとするのか、
理由と必要性がさっぱり分からない。
0162デフォルトの名無しさんNGNG
イベントをウインドウ制御側のスレッドで実行したければ、
必要に応じて別スレッドからSendMessageでユーザーメッセージを処理させればいいだけだし。
何故イベントリブンを無意味にするような方法を使おうとするのだろう?
0163デフォルトの名無しさんNGNG
スレッドはパフォーマンスが落ちるからなるべく避けてきたというゲーム独特の歴史的背景のせいだと思われ
016454NGNG
>157
そのソースを見る限り「Invalidate」のおかげで
WndProcに戻ってきてるのでは……。

だったらそもそもOnPaintの中に書けばいいんじゃないかな。

0165デフォルトの名無しさんNGNG
そしてメッセージループ中で重い処理を書いた方が、
ウインドウの反応速度が落ちて重く感じることになるという。
0166デフォルトの名無しさんNGNG
http://www.csharphelp.com/archives2/archive387.html
0167デフォルトの名無しさんNGNG
OnIdleなんぞ使おう物なら、どうでもいいときに制御が回ってきて無駄が多いは、
他のスレッドが重い処理をするととたんに回ってこなくなるはで、さあ大変。
0168デフォルトの名無しさんNGNG
>>161
スレッドはアクションゲームには向かないし初心者には同期とるのもね。デッドロックかかちゃいそう。
>>140
この答えはいろいろあるとおもいますが
>>60の最後に書いてるけど

// Windowsメッセージを処理します。
Application.DoEvents();

をつけたせばウインドウズのメッセージを処理できるー>無限ループにならない。
僕はWinProcやOnPaintはつかってないねぇ。
0169デフォルトの名無しさんNGNG
>スレッドはアクションゲーム向かないし
あなたがどうしようもないほどの馬鹿だということが分かりました。
0170デフォルトの名無しさんNGNG
>>160
すべてのメッセージがそこを通るんだから描画と処理の同期がおかしくなる
0171デフォルトの名無しさんNGNG
初心者が大勢集まってるもんだから
0172デフォルトの名無しさんNGNG
Device デバイス = new Device(
                 0,
                 DeviceType.Hardware,
                 フォーム,
                 CreateFlags.SoftwareVertexProcessing,
                 パラメータ );
のときに 1つめの引数が0になっていますが0ってどういう意味でしょうか?
C++ヘルプでは
Adapter[in]ディスプレイ アダプタを示す序数。D3DADAPTER_DEFAULT は常にプライマリディスプレイ アダプタである。
とありますが 0はプライマリディスプレイアダプタなんでしょうか?
0173デフォルトの名無しさんNGNG
#define D3DADAPTER_DEFAULT 0
0174172NGNG
D3DADAPTER_DEFAULT=0
defineの数値に対応してるんでつね、
ありがとうございます
にしてもC++のへるぷないとどうにもなりまつぇんね・・
おとなしくC++でヤったほうがよいのかとすら思えてきますた
0175デフォルトの名無しさんNGNG
>>169
自分のこと書いて楽しいですか?
0176デフォルトの名無しさんNGNG
>>169
馬鹿って言い方は失礼だと思うぞ。
単に、ここ最近のWindowsの仕組みを知らずに言い放った愚か者ってだけ。
0177デフォルトの名無しさんNGNG
スレッドを勘違いしている無能者って、VBからC#に移ってきた奴なんだろうなあ。
0178デフォルトの名無しさんNGNG
N88べーしっくから移ってきた漏れよりはマシなんではないでしょうか
0179デフォルトの名無しさんNGNG
>176
ここ最近って何か変わったの?
0180デフォルトの名無しさんNGNG
そもそもVB厨でもなければ、スレッドを使わずにDoEventでぶん回そうなどと、
阿呆なことは考えない。
0181デフォルトの名無しさんNGNG
>>180
おまいの理屈だと
チュートリアル作ったやつも
VB厨って解釈できるが
それについて何かコメントおながいしまつ

もうね、ループすりゃどうだっていいじゃん
偉そうなこと書くなら
おまいらの言う理想のループ処理とやらを書いてくれ
参考にさせてもらうから
0182デフォルトの名無しさんNGNG
>>180殿、さ、どうぞ!

0183デフォルトの名無しさんNGNG
だからスレッド使えよ。
0184デフォルトの名無しさんNGNG
*言うだけなら誰でも*
0185デフォルトの名無しさんNGNG
>>183
おまいの理想とする
スレッド使ったコードを晒してください
話はそれからだ

*言うだけなら誰でも*
0186デフォルトの名無しさんNGNG
関係ない話題は、然るべきスレでかきなよ。
いい加減、うっとおしくなってきた。
0187デフォルトの名無しさんNGNG
C++ではメインループとウインドウメッセージを分けることなど当たり前なのに、
何故C#になるとスレッドを使おうとしないのか不思議で仕方がない。
別にC#特有の問題が存在するわけでもないのに。
0188デフォルトの名無しさんNGNG
>>187
C#ではメインループとウィンドウメッセージを意識せずにコードが
書けるからでは?
0189デフォルトの名無しさんNGNG
>>187
スレッドの場合
たとえば16ms毎にゲーム処理のスレッドを呼び出すとすると、もしスレッドの処理が3msで終わってしまえば
次の呼び出しまでの13msは待ち時間となり無駄になるだろ?

でもメインループなら、マシンの限界まで処理を回ることができる。
お前ってMFCしか使ったこと無いの?
0190デフォルトの名無しさんNGNG
スレッドをループさせれば同じことじゃないの?

あと、アクションゲームの場合は、おそらくイント単位で処理することになるから、
メインループでもスレッドでも、待ち方が違うだけで同期処理は同じになると思われ。
0191デフォルトの名無しさんNGNG
イントってなに?
■ このスレッドは過去ログ倉庫に格納されています