ページ 1 / 1
描画とロードの分け方
Posted: 2011年9月15日(木) 00:12
by 再謝意
突然なのですが描画関数とロード関数をつくりたいのです
今まで、ロードと描画は関数わけしずにmain関数に書いていたのですが
描画とロードは違うところに記述しますよね
だから、どのように書けばいいのかなぁと思ったものですので
しかし、自分ではどんな構成にすればいいかさっぱりです
教えてください どうかお願いします
Re: 描画とロードの分け方
Posted: 2011年9月15日(木) 09:26
by softya(ソフト屋)
構成という意味では、下記のようにするのが良いパターンだと思います。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/d_01.html
Re: 描画とロードの分け方
Posted: 2011年9月15日(木) 18:37
by 再謝意
そちらのサイトは一通り拝見させてもらいました
その中のゲームの設計(3)というページが役に立ちそうだったのですが
main関数で構造体の実体を宣言していますよね
そのやり方はプログラムが大きくなったときに不利と聞いたので違うやり方をしたいのです
引数を使えばできるのでしょうがmain関数への書き方が分からず困っています
(引数とポインタぐらいは知っています)
わがまま言ってすみません 教えてください
Re: 描画とロードの分け方
Posted: 2011年9月15日(木) 18:41
by softya(ソフト屋)
「d.5章 ゲームの設計と分割コンパイル (3)」でmainで宣言した構造体の実体を引数で受渡していますが、これ以外の方法と言うことでしょうか?
「d.5章 ゲームの設計と分割コンパイル (3)」
http://dixq.net/g/d_05.html
Re: 描画とロードの分け方
Posted: 2011年9月15日(木) 19:14
by 再謝意
よくよくコードを見ていると、他関数で書き換えてしまうということはなさそうに見えるのですが
書き換えられませんか?
じゃあ構造体はmain関数に書けばいいですか
Re: 描画とロードの分け方
Posted: 2011年9月15日(木) 19:38
by softya(ソフト屋)
ちゃんとしたプロ的な設計を考えればデータは関係の関数に見せないほうが良いですし、構造体の構造を明かさないほうがプログラム・ミスで破壊される可能性が減ります。
何処まで隠せるかは色々テクニックがあって、一種のオブジェクト指向言語で言う所のカプセル化(隠蔽)です。
C++ほどのカプセル化は難しいですが、C言語でも関係の無い関数から極力見えないようにプログラム構造を設計することは出来ますよ。
私の書いたRPG講座の一部ですが、char.hとchar.cppに注目してください。
http://dixq.net/forum/blog.php?u=114&b=467&c=2
char.hにあるstruct tag_CharObjectの内部構造に意図してアクセス出来るのはchar.cpp内にある関数だけです。
char.cpp内でしかstruct tag_CharObjectの構造体の構造を定義してませんからね。
他のファイルにある関数からはCHAR_OBJECT、つまりstruct tag_CharObject *のポインタ値でしかアクセス出来ません。
このポインタ値を強引にキャストすれば構造体内部の情報にアクセス出来ませんが、むき出しよりは不用意な破壊を避けることが出来ます。
Re: 描画とロードの分け方
Posted: 2011年9月15日(木) 19:55
by box
softya(ソフト屋) さんが書きました:このポインタ値を強引にキャストすれば構造体内部の情報にアクセス出来ませんが、
アクセスできますが、と書かないとまずいですね。
質問者さんへ:ファイル入出力でよく登場する FILE * という型、これも構造体へのポインターです。
その構造体のメンバー構成について、アプリケーションを開発する人が知らなくてもすむよう、隠蔽を行なっています。
Re: 描画とロードの分け方
Posted: 2011年9月15日(木) 20:30
by 再謝意
ソフト屋さんのRPG講座を見てみたいのですが
結構、複雑で分からないのですが画像の描画とロードの項目ってどれですかね
Re: 描画とロードの分け方
Posted: 2011年9月15日(木) 21:17
by softya(ソフト屋)
特にひねった名前を付けてないのでchar_Load()とchar_Draw()ですよ。
Re: 描画とロードの分け方
Posted: 2011年9月15日(木) 21:42
by 再謝意
〉〉boxさん そうだったのですか!よく詳しくないから分からないんですけどもね(笑)
ソフト屋さんの講座に結構、苦戦しております
ロード関数から戻り値として他関数に値を返していますが
これはmain関数に返しているのでしょうか?
main関数はどのページに記述されていないのでしょうか?
このやり方だとオブジェクトがたくさんあるときに
たくさんの値を返さなくてはいけない気がしますがこの考えはあっていますか
それと、もう一つ疑問なんですけど
メモリの破棄ってありますよね あれってソフトを終了したあと(ウインドウの×ボタンを押したときです)
もメモリは永遠と残るのでしょうか?
Re: 描画とロードの分け方
Posted: 2011年9月15日(木) 22:02
by softya(ソフト屋)
必ずしもmain関数に返す必要はありません。必要な関数に情報が渡れば良いだけす。
ゲームプログラムが複雑で大きくなってくるとmain関数はメニューの切り替えとか全体的な処理になりゲーム自体の細かい制御をする事自体がなくなります。
そういう場合は、ゲームメインは別の関数になるので、そちらに返すようになります。
再謝意 さんが書きました:このやり方だとオブジェクトがたくさんあるときに
たくさんの値を返さなくてはいけない気がしますがこの考えはあっていますか
複数必要なら配列を含んだ構造体にしてやればよいだけですね。
【追記】
ちなみに私の方法が唯一のベスト方法では無くて十人いれば十人の手法があります。
知って貰いたかったのは、メモリの確保や受け渡しや情報の隠蔽はこんな手法もあるということです。
再謝意 さんが書きました:それと、もう一つ疑問なんですけど
メモリの破棄ってありますよね あれってソフトを終了したあと(ウインドウの×ボタンを押したときです)
もメモリは永遠と残るのでしょうか?
破棄しなくてもゲームが終われば解放されます。
それでもゲームがステージとかかマップに区切られていれば、ステージやマップを移る毎にメモリに画像などが溜まっていくので破棄するのが望ましいです。
1ステージの消費メモリが20MBだとしても10ステージで200MBもメモリを消費します。初期のXPパソコンあたりだとメモリが辛いでしょう。
Re: 描画とロードの分け方
Posted: 2011年9月15日(木) 22:43
by 再謝意
softya(ソフト屋) さんが書きました:複数必要なら配列を含んだ構造体にしてやればよいだけですね
配列を含んだ構造体っていうのは
メンバに配列が入るということですか?
自分は構造体配列を扱いたいのですがfor文とか使えばいいのでしょうか
Re: 描画とロードの分け方
Posted: 2011年9月16日(金) 11:04
by softya(ソフト屋)
再謝意 さんが書きました:配列を含んだ構造体っていうのは
メンバに配列が入るということですか?
自分は構造体配列を扱いたいのですがfor文とか使えばいいのでしょうか
メンバ変数を配列にする場合は、配列の有効数もメンバ変数として必要です。
forループで有効数だけ回せば良いですね。
ゲームのプログラムの全体像が分からないので抽象的な話しか書けませんので、簡易サンプルコードでも書いてもらえば具体的な話が出来ます。
構造体に配列を取る場合でも、動的配列にするとか、固定配列にするとか、配列を止めてリスト構造にするとか選択肢は沢山あります。
それはゲーム全体の都合とか、プログラムの構成の問題ですので、何時の場合でもベストな方法はないと思ってください。
一番簡単で初心者向けなのは、ゲームプログラムを組む上で扱いやすいかどうかは別にして固定数配列で有効数を持つ方法だと思います。
Re: 描画とロードの分け方
Posted: 2011年9月17日(土) 12:26
by 再謝意
返信ありがとうございます
いまさらですが、このトピックのタイトルに関することに対してなのですが
変なことに悩んでいました
描画とロードはループ内外、違うところに書くのでどうすればいいのかと思っていたのですが
if文で分岐させればループ外に書くのと同じじゃないかと気づきました
何を言っているか分からないかもしれませんが、疑問は解決したということです
配列の種類と仰っていましたが一つのマップに登場するオブジェクトは
そんなに数や種類は変わらないと思いますので動的配列にする必要はない気がしてきました
数は少し多めにとって固定配列にします