仕様書の作成方法について
仕様書の作成方法について
シューティングゲームを作成してて、ひととおり完成しました
そこで、次はもうすこし内容のあるシューティングにしようと思ってます
しかし、ボリュームが大きくなるとソースコードやフローの管理が大変になりそうなので
仕様書もしくは設計書などを作ってからプログラミングしたいと考えています
そこで、仕様書はどのようにして作成するのが一般的なのでしょう?
色々調べてみましたけど業種によってさまざまという回答が多く
ゲームについての仕様書は見つかりませんでした(公開してない?)
DB関連の仕様書が多いように見れましたが、頭の回転の良い方はこれを応用できているのでしょう
私の頭の回転ではとても応用できていないです
そこで、何かシューティング向けの仕様書のテンプレートなどないでしょうか?
結構無理難題を言っているかもしれないですけど、参考になるものがあったら教えてもらえると助かります
==========================================
自分的に思っているのですが、基本はできていると思うので
あとは私の気持ち状態次第かなぁ・・・とも思ってます
(細かいバグなどが入ると怖い)
そこで、次はもうすこし内容のあるシューティングにしようと思ってます
しかし、ボリュームが大きくなるとソースコードやフローの管理が大変になりそうなので
仕様書もしくは設計書などを作ってからプログラミングしたいと考えています
そこで、仕様書はどのようにして作成するのが一般的なのでしょう?
色々調べてみましたけど業種によってさまざまという回答が多く
ゲームについての仕様書は見つかりませんでした(公開してない?)
DB関連の仕様書が多いように見れましたが、頭の回転の良い方はこれを応用できているのでしょう
私の頭の回転ではとても応用できていないです
そこで、何かシューティング向けの仕様書のテンプレートなどないでしょうか?
結構無理難題を言っているかもしれないですけど、参考になるものがあったら教えてもらえると助かります
==========================================
自分的に思っているのですが、基本はできていると思うので
あとは私の気持ち状態次第かなぁ・・・とも思ってます
(細かいバグなどが入ると怖い)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 仕様書の作成方法について
オブジェクト指向設計されてはどうでしょう?
ゲームつくろー! 「オブジェクト指向設計編」
http://marupeke296.com/OOD_main.html
「ゲーム作者の集い[ゲームヘル2000] - kenmo」
http://www5.atwiki.jp/yaruhara/pages/39.html
「UMLによるゲーム・プログラミング」
http://eis.yokkaichi-u.ac.jp/WBT/game/gameOOdesign.html
ゲームつくろー! 「オブジェクト指向設計編」
http://marupeke296.com/OOD_main.html
「ゲーム作者の集い[ゲームヘル2000] - kenmo」
http://www5.atwiki.jp/yaruhara/pages/39.html
「UMLによるゲーム・プログラミング」
http://eis.yokkaichi-u.ac.jp/WBT/game/gameOOdesign.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 仕様書の作成方法について
>>softyaさん
リンク先読ませてもらいました
オブジェクト指向は私も習得しようとしているのですが
なかなか、設計はした、ではどのようなコードがいいのか?というさらにつっこんだ内容の記事がなく
ただ、UMLのクラス図だけで終わりという記事ばかりで、実用ではないように私は感じています
意見をもらってなんなんですが、オリジナルのマイタスクシステムを作ることにしました
シンプル設計でいこうかと思いまして
構造化設計とほとんど変わらないかもしれないですけど、ゲームを作成するのが目的ですので
気にせずに進めたいと思います
そこで、DxLibを使って組んでいるところなのです
トピックを新しく作るか迷いましたが、ここを再利用します
ここの龍神録のFPS制御の方法をそのままコピーして利用させてもらってますが
どうしても60FPSがでません
各処理にかかる時間を計測しても、0.00000となっており何が原因かつかめない状態です
私のオリジナルDirectXライブラリで、同じFPS制御をしてみると60FPSでるのですが
DxLibとここのFPS制御を組み合わせると43FPSくらいで止まります
下にそのソースコードの一部と結果を載せますので、どこが問題なのかわかるかたいませんでしょうか?
TIME.txtの中身
かかった時間、1フレームの時間:TIME[0]:44 0.000000
呼び出し回数:TIME[1]:696
かかった時間、1フレームの時間:TIME[2]:20 0.000000
呼び出し回数:TIME[3]:696
かかった時間、1フレームの時間:TIME[4]:657 0.000000
呼び出し回数:TIME[5]:697
かかった時間、1フレームの時間:TIME[6]:10853 0.000000
呼び出し回数:TIME[7]:697
//=======================
TIME.txtに出力の際の TIME[x] の部分のミスを修正しました
リンク先読ませてもらいました
オブジェクト指向は私も習得しようとしているのですが
なかなか、設計はした、ではどのようなコードがいいのか?というさらにつっこんだ内容の記事がなく
ただ、UMLのクラス図だけで終わりという記事ばかりで、実用ではないように私は感じています
意見をもらってなんなんですが、オリジナルのマイタスクシステムを作ることにしました
シンプル設計でいこうかと思いまして
構造化設計とほとんど変わらないかもしれないですけど、ゲームを作成するのが目的ですので
気にせずに進めたいと思います
そこで、DxLibを使って組んでいるところなのです
トピックを新しく作るか迷いましたが、ここを再利用します
ここの龍神録のFPS制御の方法をそのままコピーして利用させてもらってますが
どうしても60FPSがでません
各処理にかかる時間を計測しても、0.00000となっており何が原因かつかめない状態です
私のオリジナルDirectXライブラリで、同じFPS制御をしてみると60FPSでるのですが
DxLibとここのFPS制御を組み合わせると43FPSくらいで止まります
下にそのソースコードの一部と結果を載せますので、どこが問題なのかわかるかたいませんでしょうか?
static int TIME[10];
// メインループ
while(1)
{
if( -1 == ProcessMessage() )
break;
char key[256];
GetHitKeyStateAll( key );
if( key[KEY_INPUT_ESCAPE] == 1 )
break;
fps_wait();
DWORD start, end;
switch( gMode )
{
case def_mode_title:
start = timeGetTime();
gTitle.Draw();
end = timeGetTime();
TIME[0] += end - start;
TIME[1]++;
start = timeGetTime();
gTitle.Move( &gMode );
end = timeGetTime();
TIME[2] += end - start;
TIME[3]++;
break;
default:
break;
}
start = timeGetTime();
int i;
for( i=0; i<DEF_TASK_NUM+1; i++ )
{
gTask[i].Draw();
gTask[i].Move();
gTask[i].System();
gTask[i].Etc();
}
draw_fps( 0, 20 );
end = timeGetTime();
TIME[4] += end - start;
TIME[5]++;
start = timeGetTime();
ScreenFlip();
end = timeGetTime();
TIME[6] += end - start;
TIME[7]++;
}
// TIME.txtに出力
FILE *f = fopen( "TIME.txt", "wt" );
char mes[80];
sprintf( mes, "かかった時間、1フレームの時間:TIME[0]:%d %f\n", TIME[0], TIME[0]/TIME[1] );
fputs( mes, f );
sprintf( mes, "呼び出し回数:TIME[1]:%d\n", TIME[1] );
fputs( mes, f );
sprintf( mes, "かかった時間、1フレームの時間:TIME[2]:%d %f\n", TIME[2], TIME[2]/TIME[3] );
fputs( mes, f );
sprintf( mes, "呼び出し回数:TIME[3]:%d\n", TIME[3] );
fputs( mes, f );
sprintf( mes, "かかった時間、1フレームの時間:TIME[4]:%d %f\n", TIME[4], TIME[4]/TIME[5] );
fputs( mes, f );
sprintf( mes, "呼び出し回数:TIME[5]:%d\n", TIME[5] );
fputs( mes, f );
sprintf( mes, "かかった時間、1フレームの時間:TIME[6]:%d %f\n", TIME[6], TIME[6]/TIME[7] );
fputs( mes, f );
sprintf( mes, "呼び出し回数:TIME[7]:%d\n", TIME[7] );
fputs( mes, f );
fclose( f );
かかった時間、1フレームの時間:TIME[0]:44 0.000000
呼び出し回数:TIME[1]:696
かかった時間、1フレームの時間:TIME[2]:20 0.000000
呼び出し回数:TIME[3]:696
かかった時間、1フレームの時間:TIME[4]:657 0.000000
呼び出し回数:TIME[5]:697
かかった時間、1フレームの時間:TIME[6]:10853 0.000000
呼び出し回数:TIME[7]:697
//=======================
TIME.txtに出力の際の TIME[x] の部分のミスを修正しました
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 仕様書の作成方法について
解決されたようですが、事前に全体構造を考えて大きなクラス構造・インターフェイス・ステート・シーケンスの設計ぐらいはしたほうが良いと思います。
>しかし、ボリュームが大きくなるとソースコードやフローの管理が大変になりそうなのせ
>仕様書もしくは設計書などを作ってからプログラミングしたいと考えています
経験のあるSTGなら何とか成るかも知れませんが、未知のものを作る時は困ると私は思います。
>なかなか、設計はした、ではどのようなコードがいいのか?というさらにつっこんだ内容の記事がなく
>ただ、UMLのクラス図だけで終わりという記事ばかりで、実用ではないように私は感じています
それは設計や仕様書ではなく実装ですよね。
最初に紹介したこちらとか、実装まで書かれていますが何がものたらないのでしょうか?
分からない部分をdicさんなりに説明して頂けないとこちらとしても説明できないのです。
「UMLによるゲーム・プログラミング」
http://eis.yokkaichi-u.ac.jp/WBT/game/gameOOdesign.html
>私のディスプレイは結構大きいので負荷が特別に大きいかもしれないですね
>30FPSにあわせます
あと使い方の間違いが無いのなら30FPSしか出ないのはDXライブラリの相性・バグの問題だと思いますので、DXライブラリ本家の掲示板でお問い合わせ下さい。
DXライブラリのバージョンを変えると直る場合もあります。
下記のプログラムで60FPSでるか確認してみてください。
「C言語~ゲームプログラミングの館~」
http://dixq.net/g/52.html
>しかし、ボリュームが大きくなるとソースコードやフローの管理が大変になりそうなのせ
>仕様書もしくは設計書などを作ってからプログラミングしたいと考えています
経験のあるSTGなら何とか成るかも知れませんが、未知のものを作る時は困ると私は思います。
>なかなか、設計はした、ではどのようなコードがいいのか?というさらにつっこんだ内容の記事がなく
>ただ、UMLのクラス図だけで終わりという記事ばかりで、実用ではないように私は感じています
それは設計や仕様書ではなく実装ですよね。
最初に紹介したこちらとか、実装まで書かれていますが何がものたらないのでしょうか?
分からない部分をdicさんなりに説明して頂けないとこちらとしても説明できないのです。
「UMLによるゲーム・プログラミング」
http://eis.yokkaichi-u.ac.jp/WBT/game/gameOOdesign.html
>私のディスプレイは結構大きいので負荷が特別に大きいかもしれないですね
>30FPSにあわせます
あと使い方の間違いが無いのなら30FPSしか出ないのはDXライブラリの相性・バグの問題だと思いますので、DXライブラリ本家の掲示板でお問い合わせ下さい。
DXライブラリのバージョンを変えると直る場合もあります。
下記のプログラムで60FPSでるか確認してみてください。
「C言語~ゲームプログラミングの館~」
http://dixq.net/g/52.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 仕様書の作成方法について
ScreenFlipはテアリングを防ぐために垂直帰線期間を待つので、時間がかかるのは仕方がないというか当たり前だと思います。
fps_waitという関数がFPS制御をしている関数だと思うのですが、FPS制御は1フレームの時間が一定になるように待ち時間を入れる処理なので、スクリーンフリップの直後に呼び出すと1フレーム分まるまる待ち時間として計上してしまうと思います。
そこに実際に処理した分が加算されるのでFPSが低下しているのではないでしょうか。
fps_waitをScreenFlipの直前で呼ぶようにすれば期待どおりに動く気がします。
fps_waitという関数がFPS制御をしている関数だと思うのですが、FPS制御は1フレームの時間が一定になるように待ち時間を入れる処理なので、スクリーンフリップの直後に呼び出すと1フレーム分まるまる待ち時間として計上してしまうと思います。
そこに実際に処理した分が加算されるのでFPSが低下しているのではないでしょうか。
fps_waitをScreenFlipの直前で呼ぶようにすれば期待どおりに動く気がします。
Re: 仕様書の作成方法について
>>softyaさん
「C言語~ゲームプログラミングの館~」
http://dixq.net/g/52.html
ここのコードでは63.5~58FPSでました
SetDrawScreen() 関数というのがあったんですね 気づきませんでした
しかもデフォルトの描画先が画面表だったなんて・・・
ということは、画面表に描画していたので、ScreenFilpはまったくの無用ってことですね(作者の推薦は)
SetDrawScreen( DX_SCREEN_BACK )に変更、追加しました
>>ISLeさん
垂直同期ですね
リフレッシュレートがからんでいるのか、垂直同期をまたない
SetWaitVSyncFlag( false );
に変更したら60FPSでるようになりました
2つFPS制御してたことになりますね
これもデフォルトが垂直同期を待つ設定のようでした
おふたかたの助言で30FPSのコードをくまなくてよくなりました^^ を最初の方に追加で対応できました
「C言語~ゲームプログラミングの館~」
http://dixq.net/g/52.html
ここのコードでは63.5~58FPSでました
SetDrawScreen() 関数というのがあったんですね 気づきませんでした
しかもデフォルトの描画先が画面表だったなんて・・・
ということは、画面表に描画していたので、ScreenFilpはまったくの無用ってことですね(作者の推薦は)
SetDrawScreen( DX_SCREEN_BACK )に変更、追加しました
>>ISLeさん
垂直同期ですね
リフレッシュレートがからんでいるのか、垂直同期をまたない
SetWaitVSyncFlag( false );
に変更したら60FPSでるようになりました
2つFPS制御してたことになりますね
これもデフォルトが垂直同期を待つ設定のようでした
おふたかたの助言で30FPSのコードをくまなくてよくなりました^^ を最初の方に追加で対応できました
Re: 仕様書の作成方法について
テアリング対策で垂直帰線期間に画面を切り替えるので、垂直帰線期間を待たないとテアリングが発生しますよ。
背景スクロールなんかするとはっきり水平にぶった切られたように映ります。
アーケードゲームの移植ではテアリングを我慢してでもオリジナルの速度を重視する場合がありますけど。
Vistaや7ではデスクトップマネージャーレベルで対策されているのでウインドウモードではテアリングが発生しないそうです(聞きかじり)けど。
そのかわりモニタのリフレッシュレート以上の速度で画面を描き変えても映らないとか。
背景スクロールなんかするとはっきり水平にぶった切られたように映ります。
アーケードゲームの移植ではテアリングを我慢してでもオリジナルの速度を重視する場合がありますけど。
Vistaや7ではデスクトップマネージャーレベルで対策されているのでウインドウモードではテアリングが発生しないそうです(聞きかじり)けど。
そのかわりモニタのリフレッシュレート以上の速度で画面を描き変えても映らないとか。
Re: 仕様書の作成方法について
>>ISLeさん
画面のちらつきは起きるということが前提でDirectXが作られているので(たぶん)
私の場合はダブルバッファリングで対応しています
モニタの性能の違いがあるので100%カバーできるとは思ってません
90%を目標にし、91%、92%とつきつめていくとどんどんキツくなりプログラムどころではなく
それは私の時間の都合もあるので不可能とわりきっています
Vista や 7 はまだ手元にないですがハードウェアの性能も向上していくと思っているのでほどほどにしていますし
私が配った知り合いの範囲内においては、そのようなことを言ってくる方はいませんので、大丈夫と思ってます
しかし、何か画面のちらつきについて言ってくる方がいましたら、考えようと思います
(それくらい私の影響力はないと思ってます)
画面のちらつきは起きるということが前提でDirectXが作られているので(たぶん)
私の場合はダブルバッファリングで対応しています
モニタの性能の違いがあるので100%カバーできるとは思ってません
90%を目標にし、91%、92%とつきつめていくとどんどんキツくなりプログラムどころではなく
それは私の時間の都合もあるので不可能とわりきっています
Vista や 7 はまだ手元にないですがハードウェアの性能も向上していくと思っているのでほどほどにしていますし
私が配った知り合いの範囲内においては、そのようなことを言ってくる方はいませんので、大丈夫と思ってます
しかし、何か画面のちらつきについて言ってくる方がいましたら、考えようと思います
(それくらい私の影響力はないと思ってます)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 仕様書の作成方法について
>画面のちらつきは起きるということが前提でDirectXが作られているので(たぶん)
>私の場合はダブルバッファリングで対応しています
ティアリングは理解されていますよね?
「ティアリング」
http://d4.princess.ne.jp/multimedia/ntsc/tearing.html
ダブルバッファにして同期を待つことでティアリングもチラツキも無くすことは出来ますよ。
それが出来ているDXライブラリもDirectXですからなにか勘違いされているのでは無いでしょうか?
DXライブラリはDirectDrawなので同期に次のものを使っていると思います。
「IDirectDraw::WaitForVerticalBlank」
http://msdn.microsoft.com/ja-jp/library/cc355951.aspx
あと3Dだと「D_D3DPRESENT_INTERVAL_ONE」
http://msdn.microsoft.com/ja-jp/library ... s.85).aspx
が使えるはずですが私は使ったこと無いので動作確認をお願いします。
CPU負荷が上がると言う話も聞くのですが、DirectXのバージョンで違うかも知れません。
>私の場合はダブルバッファリングで対応しています
ティアリングは理解されていますよね?
「ティアリング」
http://d4.princess.ne.jp/multimedia/ntsc/tearing.html
ダブルバッファにして同期を待つことでティアリングもチラツキも無くすことは出来ますよ。
それが出来ているDXライブラリもDirectXですからなにか勘違いされているのでは無いでしょうか?
DXライブラリはDirectDrawなので同期に次のものを使っていると思います。
「IDirectDraw::WaitForVerticalBlank」
http://msdn.microsoft.com/ja-jp/library/cc355951.aspx
あと3Dだと「D_D3DPRESENT_INTERVAL_ONE」
http://msdn.microsoft.com/ja-jp/library ... s.85).aspx
が使えるはずですが私は使ったこと無いので動作確認をお願いします。
CPU負荷が上がると言う話も聞くのですが、DirectXのバージョンで違うかも知れません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 仕様書の作成方法について
今回はじめてSetWaitVSyncFlag(FALSE)で垂直帰線期間を待たないようにされたのではないのですか?
ダブルバッファリングは描画途中を隠してチラツキを抑えますが、テアリングを解消することはできません。
ダブルバッファリングは描画途中を隠してチラツキを抑えますが、テアリングを解消することはできません。
Re: 仕様書の作成方法について
>>softyaさん
混合された状態で表画面に出てくるのがティアリングですね
ちょっと誤解してました
>>ISLeさん
ティアリングを回避できないということで
ではどういった方法で回避できるのでしょうか?
といった話になりますが
混合された状態で表画面に出てくるのがティアリングですね
ちょっと誤解してました
>>ISLeさん
ティアリングを回避できないということで
ではどういった方法で回避できるのでしょうか?
といった話になりますが
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 仕様書の作成方法について
同じ話の繰り返しになりますが、表裏画面の切り替えで垂直帰線期間を待てばティアリングは発生しません。dic さんが書きました:>>softyaさん
混合された状態で表画面に出てくるのがティアリングですね
ちょっと誤解してました
>>ISLeさん
ティアリングを回避できないということで
ではどういった方法で回避できるのでしょうか?
といった話になりますが
なので、SetWaitVSyncFlag(FALSE)とすれば発生します。
「s6. FPSを表示する。」
http://dixq.net/g/52.html
に書かれている仕組みにすれば同期して表裏画面の切り替えが出来ます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 仕様書の作成方法について
>>softyaさん
「s6. FPSを表示する。」
http://dixq.net/g/52.html
に書かれている仕組みにすれば同期して表裏画面の切り替えが出来ます。
を参考にして、テストしたところ、上にもあるように62~58FPSくらいの不安定なFPS制御になってしまうので
「43.きっちりFPSを制御してみよう」
http://dixq.net/rp/43.html
のコードを再利用して使ってます
私のパソコンのスペック不足か、ここのコードを再利用すると40FPSまでしかでないのです
この場合、すべてDxLibのデフォルト設定なので、表画面に描画し、垂直同期もDxLibまかせです
この状態だと私のパソコンでは40FPSしかでません
なので、なんとか60FPSだそうと思い、いろいろいじってたところです
「s6.FPSを表示する」のコードではきっちり60FPSにならないので「43.きっちりFPSを制御してみよう」のコードで
60FPSを保つように、上にあるように、裏画面に設定したり、垂直同期を「43.きっちりFPSを制御してみよう」の
コードだけにまかせるという方法をとったところ、うまくいったというところです
また、デフォルトが表画面に描画するので画面のチラツキもあり、これはマズいと思っていたところです
テアリングに関しては softyaさんとISLeさんの意見が異なるので、保留にしておきたいと思います
「s6. FPSを表示する。」
http://dixq.net/g/52.html
に書かれている仕組みにすれば同期して表裏画面の切り替えが出来ます。
を参考にして、テストしたところ、上にもあるように62~58FPSくらいの不安定なFPS制御になってしまうので
「43.きっちりFPSを制御してみよう」
http://dixq.net/rp/43.html
のコードを再利用して使ってます
私のパソコンのスペック不足か、ここのコードを再利用すると40FPSまでしかでないのです
この場合、すべてDxLibのデフォルト設定なので、表画面に描画し、垂直同期もDxLibまかせです
この状態だと私のパソコンでは40FPSしかでません
なので、なんとか60FPSだそうと思い、いろいろいじってたところです
「s6.FPSを表示する」のコードではきっちり60FPSにならないので「43.きっちりFPSを制御してみよう」のコードで
60FPSを保つように、上にあるように、裏画面に設定したり、垂直同期を「43.きっちりFPSを制御してみよう」の
コードだけにまかせるという方法をとったところ、うまくいったというところです
また、デフォルトが表画面に描画するので画面のチラツキもあり、これはマズいと思っていたところです
テアリングに関しては softyaさんとISLeさんの意見が異なるので、保留にしておきたいと思います