ページ 11

DXライブラリ3大処理について

Posted: 2012年12月15日(土) 11:09
by kwg
このサイトで不適切な実装として「DXライブラリ3大処理が複数個所にあってはいけない」と紹介されていましたが、
それは1ループの中に複数あってはいけないということなのか、
それともプログラム通してメイン関数のみにループを作るべきということなんでしょうか?
私は今、タイトル画面、メニュー画面、プレイ画面などとそれぞれ分けてループ関数を作っているんですが、
それはだめなんでしょうか?
もしダメだとしたらどういった問題が起こりうるんでしょうか?

初歩的な質問で恐縮ですが、よろしくお願いします。

Re: DXライブラリ3大処理について

Posted: 2012年12月15日(土) 11:25
by softya(ソフト屋)
1プログラムに1つじゃないと基本的にダメですね。

起こる問題と言うか
1.終了処理が不適切に行われる可能性。すぐ終了すべきなのに描画処理などを通ってしまうバグ。
2.3大処理ループに3大処理ループを含んでしまう可能性。これが一番やってはいけません。謎の処理落ちなどが発生します。
3.1つで済むものを複数箇所に書かないと組めないプログラム設計のまずさ。これは他の部分の設計もマズイという可能性を示しています。
4.ひどい人は無秩序に3大処理を入れたがる。
などなどでしょうか。

Re: DXライブラリ3大処理について

Posted: 2012年12月15日(土) 11:38
by kwg
すばやい回答ありがとうございました。

成程、1プログラムに1つでしたか・・・。
つまり画面の移動などはフラグ管理等でやる必要があるということですね。
設計のまずさなんて耳が痛い話です^^;

ありがとうございました。

Re: DXライブラリ3大処理について

Posted: 2012年12月16日(日) 00:03
by Dixq (管理人)
簡単に言うと、最初のうちは以下のような設計にした方が簡単でメンテナンスもしやすいですよねって意味です。

コード:

main(){
	while(3大処理){
		switch(***){
		case メニュー:
			メニュー();
			break;
		case ゲーム:
			ゲーム();
			break;
		case 設定:
			設定();
			break;
		}
	}
}
きちんとした設計をすることなく、この形を崩すと、同じ処理がいくつも分散したり、シーン管理が困難になったりします。
FPS制御などの一括管理したい処理も常に複数の場所にかかないといけなくなることでしょう。

> タイトル画面、メニュー画面、プレイ画面などとそれぞれ分けてループ関数を作っているんですが

FPS制御やキーの入力監視などの処理はどこからコールしていますか?
3つループがあれば、3つから呼ばないといけなくならないでしょうか?
また、タイトル画面からメニュー画面、プレイ画面の遷移処理が難しくなりませんか?

Re: DXライブラリ3大処理について

Posted: 2012年12月16日(日) 10:16
by kwg
返信ありがとうございます。

>FPS制御やキーの入力監視などの処理はどこからコールしていますか?
>3つループがあれば、3つから呼ばないといけなくならないでしょうか?

そうなんですよね。これらは各ループから呼び出すことになるので、
確かに効率が悪いですよね^^;


>また、タイトル画面からメニュー画面、プレイ画面の遷移処理が難しくなりませんか?

これに関してはsoftyaさんが仰っていた「一番やってはいけないこと」をやってしまっていましたorz
ループの中で別のループを呼び出す構造になっていました。

コード:

タイトルのループ関数(){
   タイトル画面初期化();
  while(ループ処理){
      ループ内容();
    メニューのループ関数();
   }
}

メニューのループ関数(){
  メニュー画面初期化();
  while(ループ処理){
    ループ内容();
    if(終了条件)break;
  }
}
のように書くと、画面の切り替えと、それに伴う初期化処理をしやすいかと思いまして・・・

現在は管理人さんが仰るような構造に修正しております。
ありがとうございました。