2ちゃんねる ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

親父PGがゲームを作り始めるスレッド

1 :親父PG:04/03/30 02:40 ID:phIrC7nN.net

C++やC、アセンブラは昔こなしたし、プログラムの事なら自信はあるけど
ゲームは作った事が無い方。現場からも引退したし(w。
ここは一つ趣味でDirectXでも勉強して、ゲームでも作ってみようかなぁと思った、
オジサンPGのスレッドです。

一緒にマターリライブラリから作りませんか?

2 :親父PG:04/03/30 02:48 ID:phIrC7nN.net
DirectX SDK
http://www.microsoft.com/japan/msdn/directx/downloads.asp
C++
http://www.microsoft.com/japan/msdn/visualc/



3 :名前は開発中のものです。:04/03/30 02:54 ID:aArzpmzM.net
はい、華麗に3ゲトーと

4 :親父PG:04/03/30 03:15 ID:phIrC7nN.net
とりあえずC++だけでいいなら19800円(ゲーム作るだけなら他はいらない)
Visual C++ .NET Standard 2003 通常パッケージ 19,800円
アカデミック パッケージ 7,800円

最初の半年の目標

SDKをざっと読む
開発環境を整える
デモをコンパイラする
スケルトンの作成

ここからは目的に応じて多少変化すると思いますが....

タイマー、スケジュール、ポーリング部分をどのように設計するか検討する

上を設計した上で、最小単位のオブジェクトクラス(最初のメンバはLife)を設計

オブジェクトの番号を管理するクラス設計
グラフィック関連
文字関連
テクスチャ関連
マウス・キーボード関連
ビューポート関連
メッシュ関連
ライト関連
STL(動的配列関連)※クラス設計に大きく関係する DirectXとは直接関係ないけどね。 

とりあえずこの辺までは共通事項かなぁ。追加があればご指摘ください

5 :名前は開発中のものです。:04/03/30 03:43 ID:Pg71ArAR.net
ゲームを作るのか、ライブラリを作るだけなのか。

C++とかでブイブイやってたんなら、オープンソースのDirectXライブラリ持ってきて
まず何かゲームを作りつつライブラリを解析したほうが良いと思う。
パソコンを勉強するおじ様方に多いけど、本だけ読んでもあんまり身につかないからねぇ。
実際に動かして、動きを見ながらソースをトレースして理解したほうが本読むより早い。

ていうかC++なら0円でIDEも揃うけど。DEV-C++とかEclipseとか。
VC系が必要になるのはポトペタでデザイン作るときだしね。

6 :親父PG:04/03/30 04:08 ID:phIrC7nN.net
>>5
早速レスありがとう
>パソコンを勉強するおじ様方に多いけど、本だけ読んでもあんまり身につかないからねぇ。
既にそのレベルは超えてもらわないと話が進まない^^;
スケルトンぐらい(質問はしてもいいけど)自作作成できないとおそらく
オープンソースライブラリなんて使いこなすのは無理でしょう。

>オープンソースのDirectXライブラリ持ってきて
>まず何かゲームを作りつつライブラリを解析したほうが良いと思う。

これは一旦自分で(調べて作って)解析した後でないと、かえって理解が遅くなると思います。
まぁあくまで持論ではあるのですけどね。
DirectXの動きを理解してからライブラリからコツコツと、それも楽しみの一つですから...

[最低でも問題のSDKのHELPは調べる]
親父PGに限った事ではないと思いますが^^;

7 :名前は開発中のものです。 :04/03/30 08:25 ID:nseNUF3n.net
ヘタレだけど面白そうだから参加していいかな。
大分前、SDKのみの自前描画で簡単な3Dモデルを表示してみた。
ちょい前、DirectXを覚えようと、とりあえず突貫工事で
Xファイルを表示してキーボードで移動させてみた。
いろんな所からサンプル拾ってほとんどコピペしただけ。
次はスキンメッシュのサンプルをどっかからパクって組み込もうと考えたが
わけ分かんなくて挫折。
最近、TCPとWinsockでS/C型の簡単な一対一チャットを作ったが、
一対多のやり方がワカンネェので挫折。
先週、暇だったからテトリス作ってみた。初めてのゲーム。

ライブラリ?クラス?なにそれ。
分割コンパイルすらままならない、道しるべが欲しいそんなダメオジサン。

8 :名前は開発中のものです。:04/03/30 09:44 ID:B2V5bL2q.net

それより親父さんよ

この板にはたくさんの厨がいる

そいつらは開発ってのを分かっていない

ここは一つ、お前さんが連中を管理してゲームを完成させるスレとかにしてみたらどう?

9 :名前は開発中のものです。:04/03/30 09:46 ID:1T5XDq7M.net
みんなリストラされたのか?



10 :親父PG:04/03/30 11:25 ID:nbxm21Tx.net
>>7
歓迎いたしますよ! 何か出来たことを報告してくれると、盛り上がって良いと思います
>>8
>この板にはたくさんの厨がいる そいつらは開発ってのを分かっていない

私の個人的な意見を言わせていただければ、もしPGの事が解って無くても
また、開発の事がわかってなくても、なんというか、「組立てるセンス」あれば
ある程度の事はできると思う。それは他の事でも物事を組み立てて考える力さえあれば、PG習得もその応用にすぎないからなのです。

PGには3つの壁があり、
プログラム理論ロジック習得の壁 if for
言語そのものに対する知識の壁 C++ int
環境に関する知識の壁 Windows DirectX
があると私は思っています。これらを分けてひとつひとつ知識のリンクを、つないで行けば自ずと光が見えてきます。

>ここは一つ、お前さんが連中を管理して...

そんな大それた事はできませぬ^^
参加したいのであれば年齢は問いませんが、姿勢は問いますよ。

>>9
>みんなリストラされたのか?

あはは、冗談きついなぁ。

取り合えずSDKのサンプル「三角形を回す奴」をコンパイルして実行する事
これが出来ないと先へ進めません。
回る三角形ができたら、これを四角形にする(頂点数の変更) 
FVFフォーマットを変えて実験してみる。

テクスチャを張り込むにしても4画ポリゴンは基本となるので、
まずはここまでを目標にしましょう!!

11 :名前は開発中のものです。:04/03/30 12:12 ID:EfGGMHLP.net
>プログラム理論ロジック習得の壁 if for
>言語そのものに対する知識の壁 C++ int
>環境に関する知識の壁 Windows DirectX
計算機の動作原理の理解に対する壁が抜けてるな。

12 :名前は開発中のものです。:04/03/30 12:26 ID:QXrCIhNo.net
>>11
CPUアーキテクチャなんかは知らなくても
とりあえず何かは作れるんじゃないか?
もちろん、知っておいたほうが質の良いコードが書けるだろうけどね。

13 :親父PG:04/03/30 12:47 ID:nbxm21Tx.net
>>7
偉そうな事を言える立場ではないですが、書き込みの内容を拝見するに 基本的なプログラムの技術をお持ちだと思いますので、ますはSDKサンプルの
ライブラリを見てDIRECTXの初期化とWINSOWSループあたりを見てみると良いのではないでしょうか?
WINDOWSのサンプルは描画速度はマシン速度(環境)に依存しています。
このままでは定期的な処理ができないので、PeekMessage周りを調べて定期的タイマーで特定の処理を呼び出すようなものを作ってみてはどうでしょうか?

while( WM_QUIT != msg.message )
{
if( m_bActive && m_pd3dDevice != NULL ){
 if ( tTake==FALSE ){
  QueryPerformanceCounter( ( LARGE_INTEGER * )&sTIME );//時間計測開始
  FSP60call();//同期して動かすものはここで
 }
 FSP60nonSYNCcall();//何か出来ることあればやってしまおう
}
 th_GetandPeekMessage( NULL );//Peek Message func
 if( bGotMsg!=TRUE ){
  if( m_bDeviceLost ){
   // Yield some CPU time to other processes
   Sleep( 100 ); // 100 milliseconds
}
if( m_bActive && m_pd3dDevice != NULL ){
 if( FAILED( Render3DEnvironment() ) )SendMessage( m_hWnd, WM_CLOSE, 0, 0 );
 QueryPerformanceCounter( ( LARGE_INTEGER * )&eTIME );// 計測終了
 DWORD wTIME;
 wTIME=( DWORD )16666;
 if ( ( eTIME.LowPart - sTIME.LowPart )>wTIME ){
  tTake=FALSE;
 }else {tTake=TRUE;}//endof if
}
}
私が自作した部分ですが、サンプルのソースに試行錯誤を繰り返しこのような形になりました。

14 :親父PG:04/03/30 13:12 ID:nbxm21Tx.net
>>11
>計算機の動作原理の理解に対する壁が抜けてるな。

理解に必用なヒントがあれば是非紹介してください。^^

これはネタとして昔やったアセンブラの事を紹介します。

PUSH AX
PUSH BX
PUSH CX
CALL fanction

function:
MOV BP,SP
MOV SS,AX
MOV AX,ES

;スタックポイントへのアクセス
MOV DX,ES:[BP+0]
MOV AX,ES:[BP+2]
このような形でスタック上の価(引数)にアクセス....

80186(V30)のころのスタックフレームへのアクセス方法です。
いまやアドレス空間幅は32ビットに広がり、
このようなことは必要ありませんが(W

かつてはCPUの動作を知らないとPGが書けなかった時代がありました。
現代の目で見ると、私の書いたような事はもはや御伽噺になっておりますなぁ...


15 :名前は開発中のものです。:04/03/30 13:22 ID:kPTgeVBo.net
>>14
懐かしいな、もうそこらへんのことはすっかり忘れたよ
今やれといわれても資料読みつつじゃなきゃ絶対無理だ。

>>11は親父PG氏に計算機の動作原理の理解がない、と言ってるんじゃなくて
3つの壁じゃなくて4つの壁ではないか?と提案してるんじゃないか?
少なくとも俺はそう読んだ

まぁ計算機に関する理解は環境に関する理解に含まれると思うけどね

16 :名前は開発中のものです。:04/03/30 13:26 ID:KRMwobBh.net
コーディングが汚くて読みづらい。

17 :名前は開発中のものです。:04/03/30 13:41 ID:kPTgeVBo.net
>>13のサンプルにちょっとだけ指摘
QueryPerformanceCounterで取ってきた値を1/1000msecとして扱ってるが
その値は思いっきり環境依存です
環境によってはバグります
あと、LARGE_INTEGERのLowPartのみ比較はやめたほうがいいです
QueryPerformanceCounterから取得した値がなぜ64bit値なのか考えましょ

あえて荒らしにも反応しとくけど
>>16
この程度読みづらいならおまえの能力が低すぎ

18 :親父PG:04/03/30 13:47 ID:nbxm21Tx.net
>>15
>11は親父PG氏に計算機の動作原理の理解がない、と言ってるんじゃなくて

私もそうとってますよ^^; 
11氏が提案する部分で、具体的な話があれば是非紹介して欲しいなぁと思って...

>>16
すんませんorz 自分でも汚いと思っております(反省

訂正

MOV SS,AX
MOV AX,ES

MOV AX,SS
MOV ES,AX

ネタとは言え恥ずかしい....orz

価の移動は右から左だった。
というかセグメントレジスタに、直接価が入れられない制約があったんだよね。
(なんかまだ間違ってるような気がするけど、深く考えないようにしよう)

まだ取り組んでいませんが、シェイダーの扱いで一部アセンブラライクなものが
あるみたいなので、アセンブラの知識が(一部)役に立つかもしれません(笑

19 :親父PG:04/03/30 13:52 ID:nbxm21Tx.net
>>17
おお! 御指摘ありがとうございます早速、修正させてもらいます。
とはいえ
>QueryPerformanceCounterで取ってきた値を1/1000msecとして扱ってるが
>その値は思いっきり環境依存です
このあたりを解決するには調べることがありそうですね。
頑張ってみます^^

20 :名前は開発中のものです。:04/03/30 14:23 ID:kPTgeVBo.net
あーしまった、何を使ってQueryPerformanceCounterの周波数調べるか書いてなかった
QueryPerformanceFrequency使うと調べられます。
なお、高分解能パフォーマンスカウンタは今までサポートしていない環境を見たことがありません
(CEも業務で数種扱ってますが全て使えました)

あと、使う値はLONGLONGで定義してキャストするほうが楽です
こんな感じ

LARGE_INTEGER llStartTime, llEndTime;
LARGE_INTEGER llCounter;
DWORD dwTime;
DWORD dwKeta = 1000; //ここを好きな桁に変更してください。1000だと1msec単位、1000000で0.001msec単位
bRet = QueryPerformanceFrequency((LARGE_INTEGER*)&llCounter);
〜略〜
QueryPerformanceCounter(LARGE_INTEGER*)&llStartTime);
〜略〜
QueryPerformanceCounter(LARGE_INTEGER*)&llEndTime);
dwTime = (DWORD)((llEndTime - llStartTime) * dwKeta / llCounter);


21 :名前は開発中のものです。:04/03/30 14:33 ID:kPTgeVBo.net
ってーミスってるΣ
LARGE_INTEGER llStartTime(略)→LONGLONG llStartTime(略)
に直してください

22 :親父PG:04/03/30 15:29 ID:nbxm21Tx.net
>>20
なんだかありがたいなぁ。
悪いねぇ。。。。orz いろいろ教えてもらって^^;
他の方にも参考になると思います。
こういうレスがついてくることを、内心期待してはいましたがほんとにくると嬉しいです。
これからもいろいろと私にできる情報を提供使用と思います。

高精度タイマーが使えない環境はない! と私も決め打ちしています。
このへんは「ゲーム」という事で許される範囲ですかね。
高精度タイマーが動かなければ、おそらく他のゲームも動かないでしょうから^^

wTIME=( double )16666;
//駄目コード if ( ( eTIME.LowPart - sTIME.LowPart )>wTIME ){
if ( double( eTIME.QuadPart - sTIME.QuadPart )>wTIME )

安易にこんなことしてましたが、>>20の書き込みも参考にさせていただきます。


23 :名前は開発中のものです。:04/03/30 21:24 ID:OjGk+Cgx.net
たとえゲームといえど、CPU100%つかうアプリは嫌いだな。

あとこっちは余計なお世話かもしれんが、高精度タイマなんて使わなくても
timeGetTimeあたりで十分な気もする。
(タイムスライスの精度的に、どうせどこかでぶれるんだから。)

24 :親父PG:04/03/30 22:38 ID:phIrC7nN.net
>>23
ご指摘ありがとうございます。
確かにtimeGetTimeの精度を一番上げた状態でも十分ではあると思います。

先にあげたソースでは実装していませんが、計測した値の差と基準となる
値を割り算して(wTIME)基準値に対して、もし遅れが出ているようなら
その値を移動係数に掛けるといった処理も、視野にいれてQueryPerformanceCounter
を選択しました。(正しいかどうかは別にして)

ところでtimeGetTimeの正体は何なのでしょう。
いわゆる昔からあるあの「ハードウェアタイマー割り込み」なのでしょうか?
OSの内部的なタイマーという解説がありますが、その内部的なタイマーとはなんぞや?
IRQ (Interrupt Request)使うアレなのだろうか...
少なくともQueryPerformanceCounterは昔からあるHWタイマーではなさそうですね。
(分解能からして、昔は無かったし<-コレ重要)
さて
QueryPerformanceCounterとtimeGetTimeはどっちが処理が重いのだろうか?
timeGettimeの精度を上げた状態とはどういうことが起きているのだろうか?
単純に精度高い=処理が重い と決め付けるわけにもいかないと思います。

いろいろと疑問が湧いてきますねぇ。
(タイマーだけで1スレ潰してしまうな、こんな話始めたら(笑 )

25 :名前は開発中のものです。:04/03/30 23:07 ID:bI3miJwX.net
>>16
単語の頭と、単語と単語の切れ目は大文字っていうルールでコーディングしてるんだったら、一貫してくれないと読みづらいね。
FSP60nonSYNCcall は FSP60NonSyncCallみたいに・・・・。

26 :名前は開発中のものです。:04/03/30 23:25 ID:OjGk+Cgx.net
>>24
QueryPerformanceCounterを含む時間管理についてはこの辺が参考になる。
ttp://www.dwahan.net/nyaruru/programming/programming.html
ttp://www.gamedev.net/community/forums/topic.asp?topic_id=195892

あと、環境によってはQueryPerformanceCounterが300ms以上帰ってこないという現象もあるらしい。
ttp://home.att.ne.jp/yellow/hide_n/old.html
の2001/11/12。
上のURLにある問題点と関係してるのかも。

>>25
全角スペースインデントするなら、ちゃんとやれってことじゃない?

27 :名前は開発中のものです。:04/03/30 23:32 ID:fcRSAwJm.net
個人的な好みだけど、前回のループのカウンターサンプリングからの経過時間冲
を、実数で持ってたほうが何かと便利かも。おじさんの頃はFPUが遅かったので
固定小数点命だったろうけど、今じゃ、バリバリ浮動小数点使います。

Real fInversedFrequency;
LARGE_INTEGER liPrevCount;
void init( void )
{
 LARGE_INTEGER liFrequency;
 bResult = QueryPerformanceFrequency( &liFrequency );
 errorCheck( !bResult ); //カウンターサポートなし。
 fInversedFrequency= 1.0f / Real ( liFrequency );
 liPrevCount = 0;
}

void gameLoop( void )
{
 LARGE_INTEGER liCount;
 Real dt; //凾 (sec)
 QueryPerformanceCounter( &liCount );
 if( liPrevCount != 0 ) {
  dt = Real( liCount - liPrevCount ) * fInversedFrequency;
 } else {
  dt = 0;
 }
 処理:UpdateAI(), Render(), etc.....
}


28 :親父PG:04/03/30 23:58 ID:phIrC7nN.net
>>25
サンプルに自分が書いた部分を書き足すと、ちゃんぽんになってしまう事があります。
気をつけないといけませんね(汗

>>26
参考URL有難う!
>fpsの調節をするためにビジーループでQueryPerformanceCounterを呼び出していると
どのようなループか気になりますね。素でループしたら変な事になるのかも知れませんね。
あと対策はどのくらい遅れたか? を計測して「移動やその他計算処理に」
その係数を掛け算する程度しか思いつきません。

DirectXのサンプルのタイマーユーティリティを覗くと、高精度タイマーを使用しています。
dxutil.cpp
確か高精度タイマーを選択した最大の理由はコレでした(もう忘れかけてるorz

「サンプルで使ってるし大丈夫だろう!」 ご意見お待ちしています(チョットコワイ



29 :親父PG:04/03/31 00:13 ID:Idf3f6lw.net
>>27
コードサンクス! オープンソースっぽくなってきましたね。
タイマーのブレをうまく吸収してくれそうですね。
ゲームの種類によっては、これが解決になるかも。

[タイマー系の処理は(時間が)くるまで動かないではなく
        「(時間が)越えれば動く」ように設計する]
ですかね^^

30 :名前は開発中のものです。:04/03/31 06:26 ID:gs6uGany.net
何気なく覗いてみたけど良スレの予感。
親父PGさんがんばれ。

31 :親父PG:04/03/31 07:43 ID:Idf3f6lw.net
ども有難うガム張ります。

タイマーの話だけではアレなので(滝汗
私が目標にした全体の設計指針を書きます。

プログラム内部で登場するものは、全て同じ基底クラスを持ち
Create 命令で作成され、その時に「オブジェクトハンドル番号」を返すようにする。
*ポリゴン ライト テクスチャなどは全てこれで管理する。
命令は全てオブジェクトハンドルを使って指示する。

Commander[i]._mesMoveObject(hOBJ,OBJtype,Counter);
Commander[i]._mesShowObject(hOBJ,OBJtype,Counter);
(Commanderクラスは_mesで始まるオブジェクト処理集合体クラス ビューポートごとに1つ定義される。)

ポーリングループにおいて一定周期にコールが行われ、このときに
カウンター(命令の回数)のデクリメントと各オブジェクトに記録されている
命令にしたがってデータを可変させる。また各クラスは動きマトリクスを一つ
内包していて、カウンタが尽きるまでマトリクス演算を繰り返す。

これによって ポリゴンやライトなどの制御が簡単に動的に処理する事ができる。
(RPG系のマクロ言語のサポートを視野に入れている)

各オブジェクトには(マウスが押された時など)に予め指定してある
番号をもって共通のインターフェース関数を呼ぶようにする。
これによってソースコードの奥深く(笑)で発生したトリガーが
一箇所に集約され、ここでも一括処理ができるようになる。
(ボタンやダイヤログ機能の実装)動的に作成されたものにも対応できる。
1枚のテクスチャの部分コピーをおこないテクスチャの管理を楽にする。

半年かけてこの辺までは作りました。データの扱いをメインにくんでいたせいか
DorectXの機能っぽい部分に触っていません。orz
いやこれからですコレから(汗

32 :名前は開発中のものです。:04/03/31 09:17 ID:t5cBxtOK.net
おまえらタイマーを何に使うか決まっててモノ言ってんのか?
おまえら10秒でできる判断に1日かけてんじゃねーぞ?

33 :27:04/03/31 09:49 ID:uLEtiF6X.net
>>32

ゲームの物理世界は
∫f(t)dt
ってことだよ。



34 :名前は開発中のものです。:04/03/31 10:00 ID:t5cBxtOK.net
>>33
プw
遅れてるねぇ

35 :名前は開発中のものです。:04/03/31 10:37 ID:uLEtiF6X.net
>>34
アフォですか?
世界を1フレームに微分して捉えるのは、CPUの能力が有限である以上
当たり前だよな?それ以上の何がある?
とんちんかんなシロートさん。


36 :名前は開発中のものです。:04/03/31 10:43 ID:t5cBxtOK.net
時間の概念が古いんだよw

37 :名前は開発中のものです。:04/03/31 11:43 ID:uLEtiF6X.net
>>36
おもしろんじゃん。その新しい時間の概念とはなんだよ?
何にも提示するものはないのに一応偉ぶって見たいだけですか?
どうせ逃げるんだろうケドナ。


38 :名前は開発中のものです。:04/03/31 11:52 ID:J7xQt3Sm.net
煽りに釣られてんなよ低脳

39 :名前は開発中のものです。:04/03/31 11:54 ID:Jboy7uue.net
親父PGさんは仮性ですか?


40 :名前は開発中のものです。:04/03/31 11:58 ID:e/u8FsRY.net
↓何事もなかったかのように親父PG登場

41 :名前は開発中のものです。:04/03/31 12:40 ID:cyUqzRML.net
こういう親父は
せいぜいライブラリ作りで終わりそうな予感・・・

42 :名前は開発中のものです。:04/03/31 13:00 ID:P6HXZMmb.net
んで、ゲームは何つくるの?

43 :名前は開発中のものです。:04/03/31 13:23 ID:t5cBxtOK.net
>>37
2,3年前で頭止まってんじゃねーの?
世の中進んでるのはグラフィクス技術だけじゃないぜw

44 :親父PG:04/03/31 13:34 ID:7Yj92Zqq.net
スレが伸び取る!                     2ちゃん的に(w

>>34
タイマーについては一度議論するのも悪くないと思います。もっともご指摘のように
いつまでもすることではないですか(w

>>41
ライブラリ作っていると「無駄に複雑」な仕様になりがちです。戒めて前に進まないとorz
>>42
ゲームですが、キャラクターデータ−を中心に(制約はあるものの)
ゲームの内容は後から追加できるように考えています。
まだ具体的にゲームの内容までは絞り込んでいません。
グラフィックは嫁にメタセコイア覚えさせないと(笑

スクリプトエンジンを設計して、実装したらゲームの具体的な部分を考えます。

プログラム初心者程度でも、データを設計できる難易度に落とし込みたいと考えています

(野望)幾つかのモジュールはDLLで配布して他の方もゲームシナリオが作れるような環境も
提供していければなぁと。これってある意味ツクール的かも知れないですね。

総レス数 668
280 KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
read.cgi ver.24052200