このサイトで不適切な実装として「DXライブラリ3大処理が複数個所にあってはいけない」と紹介されていましたが、
それは1ループの中に複数あってはいけないということなのか、
それともプログラム通してメイン関数のみにループを作るべきということなんでしょうか?
私は今、タイトル画面、メニュー画面、プレイ画面などとそれぞれ分けてループ関数を作っているんですが、
それはだめなんでしょうか?
もしダメだとしたらどういった問題が起こりうるんでしょうか?
初歩的な質問で恐縮ですが、よろしくお願いします。
DXライブラリ3大処理について
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3大処理について
1プログラムに1つじゃないと基本的にダメですね。
起こる問題と言うか
1.終了処理が不適切に行われる可能性。すぐ終了すべきなのに描画処理などを通ってしまうバグ。
2.3大処理ループに3大処理ループを含んでしまう可能性。これが一番やってはいけません。謎の処理落ちなどが発生します。
3.1つで済むものを複数箇所に書かないと組めないプログラム設計のまずさ。これは他の部分の設計もマズイという可能性を示しています。
4.ひどい人は無秩序に3大処理を入れたがる。
などなどでしょうか。
起こる問題と言うか
1.終了処理が不適切に行われる可能性。すぐ終了すべきなのに描画処理などを通ってしまうバグ。
2.3大処理ループに3大処理ループを含んでしまう可能性。これが一番やってはいけません。謎の処理落ちなどが発生します。
3.1つで済むものを複数箇所に書かないと組めないプログラム設計のまずさ。これは他の部分の設計もマズイという可能性を示しています。
4.ひどい人は無秩序に3大処理を入れたがる。
などなどでしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
kwg
Re: DXライブラリ3大処理について
すばやい回答ありがとうございました。
成程、1プログラムに1つでしたか・・・。
つまり画面の移動などはフラグ管理等でやる必要があるということですね。
設計のまずさなんて耳が痛い話です^^;
ありがとうございました。
成程、1プログラムに1つでしたか・・・。
つまり画面の移動などはフラグ管理等でやる必要があるということですね。
設計のまずさなんて耳が痛い話です^^;
ありがとうございました。
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 15年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: DXライブラリ3大処理について
簡単に言うと、最初のうちは以下のような設計にした方が簡単でメンテナンスもしやすいですよねって意味です。
きちんとした設計をすることなく、この形を崩すと、同じ処理がいくつも分散したり、シーン管理が困難になったりします。
FPS制御などの一括管理したい処理も常に複数の場所にかかないといけなくなることでしょう。
> タイトル画面、メニュー画面、プレイ画面などとそれぞれ分けてループ関数を作っているんですが
FPS制御やキーの入力監視などの処理はどこからコールしていますか?
3つループがあれば、3つから呼ばないといけなくならないでしょうか?
また、タイトル画面からメニュー画面、プレイ画面の遷移処理が難しくなりませんか?
main(){
while(3大処理){
switch(***){
case メニュー:
メニュー();
break;
case ゲーム:
ゲーム();
break;
case 設定:
設定();
break;
}
}
}FPS制御などの一括管理したい処理も常に複数の場所にかかないといけなくなることでしょう。
> タイトル画面、メニュー画面、プレイ画面などとそれぞれ分けてループ関数を作っているんですが
FPS制御やキーの入力監視などの処理はどこからコールしていますか?
3つループがあれば、3つから呼ばないといけなくならないでしょうか?
また、タイトル画面からメニュー画面、プレイ画面の遷移処理が難しくなりませんか?
-
kwg
Re: DXライブラリ3大処理について
返信ありがとうございます。
>FPS制御やキーの入力監視などの処理はどこからコールしていますか?
>3つループがあれば、3つから呼ばないといけなくならないでしょうか?
そうなんですよね。これらは各ループから呼び出すことになるので、
確かに効率が悪いですよね^^;
>また、タイトル画面からメニュー画面、プレイ画面の遷移処理が難しくなりませんか?
これに関してはsoftyaさんが仰っていた「一番やってはいけないこと」をやってしまっていましたorz
ループの中で別のループを呼び出す構造になっていました。
のように書くと、画面の切り替えと、それに伴う初期化処理をしやすいかと思いまして・・・
現在は管理人さんが仰るような構造に修正しております。
ありがとうございました。
>FPS制御やキーの入力監視などの処理はどこからコールしていますか?
>3つループがあれば、3つから呼ばないといけなくならないでしょうか?
そうなんですよね。これらは各ループから呼び出すことになるので、
確かに効率が悪いですよね^^;
>また、タイトル画面からメニュー画面、プレイ画面の遷移処理が難しくなりませんか?
これに関してはsoftyaさんが仰っていた「一番やってはいけないこと」をやってしまっていましたorz
ループの中で別のループを呼び出す構造になっていました。
タイトルのループ関数(){
タイトル画面初期化();
while(ループ処理){
ループ内容();
メニューのループ関数();
}
}
メニューのループ関数(){
メニュー画面初期化();
while(ループ処理){
ループ内容();
if(終了条件)break;
}
}
現在は管理人さんが仰るような構造に修正しております。
ありがとうございました。