描画とロードの分け方
-
再謝意
描画とロードの分け方
突然なのですが描画関数とロード関数をつくりたいのです
今まで、ロードと描画は関数わけしずにmain関数に書いていたのですが
描画とロードは違うところに記述しますよね
だから、どのように書けばいいのかなぁと思ったものですので
しかし、自分ではどんな構成にすればいいかさっぱりです
教えてください どうかお願いします
今まで、ロードと描画は関数わけしずにmain関数に書いていたのですが
描画とロードは違うところに記述しますよね
だから、どのように書けばいいのかなぁと思ったものですので
しかし、自分ではどんな構成にすればいいかさっぱりです
教えてください どうかお願いします
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 描画とロードの分け方
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
再謝意
Re: 描画とロードの分け方
そちらのサイトは一通り拝見させてもらいました
その中のゲームの設計(3)というページが役に立ちそうだったのですが
main関数で構造体の実体を宣言していますよね
そのやり方はプログラムが大きくなったときに不利と聞いたので違うやり方をしたいのです
引数を使えばできるのでしょうがmain関数への書き方が分からず困っています
(引数とポインタぐらいは知っています)
わがまま言ってすみません 教えてください
その中のゲームの設計(3)というページが役に立ちそうだったのですが
main関数で構造体の実体を宣言していますよね
そのやり方はプログラムが大きくなったときに不利と聞いたので違うやり方をしたいのです
引数を使えばできるのでしょうがmain関数への書き方が分からず困っています
(引数とポインタぐらいは知っています)
わがまま言ってすみません 教えてください
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 描画とロードの分け方
「d.5章 ゲームの設計と分割コンパイル (3)」でmainで宣言した構造体の実体を引数で受渡していますが、これ以外の方法と言うことでしょうか?
「d.5章 ゲームの設計と分割コンパイル (3)」
http://dixq.net/g/d_05.html
「d.5章 ゲームの設計と分割コンパイル (3)」
http://dixq.net/g/d_05.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
再謝意
Re: 描画とロードの分け方
よくよくコードを見ていると、他関数で書き換えてしまうということはなさそうに見えるのですが
書き換えられませんか?
じゃあ構造体はmain関数に書けばいいですか
書き換えられませんか?
じゃあ構造体はmain関数に書けばいいですか
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 描画とロードの分け方
ちゃんとしたプロ的な設計を考えればデータは関係の関数に見せないほうが良いですし、構造体の構造を明かさないほうがプログラム・ミスで破壊される可能性が減ります。
何処まで隠せるかは色々テクニックがあって、一種のオブジェクト指向言語で言う所のカプセル化(隠蔽)です。
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 *のポインタ値でしかアクセス出来ません。
このポインタ値を強引にキャストすれば構造体内部の情報にアクセス出来ませんが、むき出しよりは不用意な破壊を避けることが出来ます。
何処まで隠せるかは色々テクニックがあって、一種のオブジェクト指向言語で言う所のカプセル化(隠蔽)です。
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 *のポインタ値でしかアクセス出来ません。
このポインタ値を強引にキャストすれば構造体内部の情報にアクセス出来ませんが、むき出しよりは不用意な破壊を避けることが出来ます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 描画とロードの分け方
アクセスできますが、と書かないとまずいですね。softya(ソフト屋) さんが書きました:このポインタ値を強引にキャストすれば構造体内部の情報にアクセス出来ませんが、
質問者さんへ:ファイル入出力でよく登場する FILE * という型、これも構造体へのポインターです。
その構造体のメンバー構成について、アプリケーションを開発する人が知らなくてもすむよう、隠蔽を行なっています。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 描画とロードの分け方
特にひねった名前を付けてないのでchar_Load()とchar_Draw()ですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
再謝意
Re: 描画とロードの分け方
〉〉boxさん そうだったのですか!よく詳しくないから分からないんですけどもね(笑)
ソフト屋さんの講座に結構、苦戦しております
ロード関数から戻り値として他関数に値を返していますが
これはmain関数に返しているのでしょうか?
main関数はどのページに記述されていないのでしょうか?
このやり方だとオブジェクトがたくさんあるときに
たくさんの値を返さなくてはいけない気がしますがこの考えはあっていますか
それと、もう一つ疑問なんですけど
メモリの破棄ってありますよね あれってソフトを終了したあと(ウインドウの×ボタンを押したときです)
もメモリは永遠と残るのでしょうか?
ソフト屋さんの講座に結構、苦戦しております
ロード関数から戻り値として他関数に値を返していますが
これはmain関数に返しているのでしょうか?
main関数はどのページに記述されていないのでしょうか?
このやり方だとオブジェクトがたくさんあるときに
たくさんの値を返さなくてはいけない気がしますがこの考えはあっていますか
それと、もう一つ疑問なんですけど
メモリの破棄ってありますよね あれってソフトを終了したあと(ウインドウの×ボタンを押したときです)
もメモリは永遠と残るのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 描画とロードの分け方
必ずしもmain関数に返す必要はありません。必要な関数に情報が渡れば良いだけす。
ゲームプログラムが複雑で大きくなってくるとmain関数はメニューの切り替えとか全体的な処理になりゲーム自体の細かい制御をする事自体がなくなります。
そういう場合は、ゲームメインは別の関数になるので、そちらに返すようになります。
【追記】
ちなみに私の方法が唯一のベスト方法では無くて十人いれば十人の手法があります。
知って貰いたかったのは、メモリの確保や受け渡しや情報の隠蔽はこんな手法もあるということです。
それでもゲームがステージとかかマップに区切られていれば、ステージやマップを移る毎にメモリに画像などが溜まっていくので破棄するのが望ましいです。
1ステージの消費メモリが20MBだとしても10ステージで200MBもメモリを消費します。初期のXPパソコンあたりだとメモリが辛いでしょう。
ゲームプログラムが複雑で大きくなってくるとmain関数はメニューの切り替えとか全体的な処理になりゲーム自体の細かい制御をする事自体がなくなります。
そういう場合は、ゲームメインは別の関数になるので、そちらに返すようになります。
複数必要なら配列を含んだ構造体にしてやればよいだけですね。再謝意 さんが書きました:このやり方だとオブジェクトがたくさんあるときに
たくさんの値を返さなくてはいけない気がしますがこの考えはあっていますか
【追記】
ちなみに私の方法が唯一のベスト方法では無くて十人いれば十人の手法があります。
知って貰いたかったのは、メモリの確保や受け渡しや情報の隠蔽はこんな手法もあるということです。
破棄しなくてもゲームが終われば解放されます。再謝意 さんが書きました:それと、もう一つ疑問なんですけど
メモリの破棄ってありますよね あれってソフトを終了したあと(ウインドウの×ボタンを押したときです)
もメモリは永遠と残るのでしょうか?
それでもゲームがステージとかかマップに区切られていれば、ステージやマップを移る毎にメモリに画像などが溜まっていくので破棄するのが望ましいです。
1ステージの消費メモリが20MBだとしても10ステージで200MBもメモリを消費します。初期のXPパソコンあたりだとメモリが辛いでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
再謝意
Re: 描画とロードの分け方
配列を含んだ構造体っていうのはsoftya(ソフト屋) さんが書きました:複数必要なら配列を含んだ構造体にしてやればよいだけですね
メンバに配列が入るということですか?
自分は構造体配列を扱いたいのですがfor文とか使えばいいのでしょうか
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 描画とロードの分け方
メンバ変数を配列にする場合は、配列の有効数もメンバ変数として必要です。再謝意 さんが書きました:配列を含んだ構造体っていうのは
メンバに配列が入るということですか?
自分は構造体配列を扱いたいのですがfor文とか使えばいいのでしょうか
forループで有効数だけ回せば良いですね。
ゲームのプログラムの全体像が分からないので抽象的な話しか書けませんので、簡易サンプルコードでも書いてもらえば具体的な話が出来ます。
構造体に配列を取る場合でも、動的配列にするとか、固定配列にするとか、配列を止めてリスト構造にするとか選択肢は沢山あります。
それはゲーム全体の都合とか、プログラムの構成の問題ですので、何時の場合でもベストな方法はないと思ってください。
一番簡単で初心者向けなのは、ゲームプログラムを組む上で扱いやすいかどうかは別にして固定数配列で有効数を持つ方法だと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
再謝意
Re: 描画とロードの分け方
返信ありがとうございます
いまさらですが、このトピックのタイトルに関することに対してなのですが
変なことに悩んでいました
描画とロードはループ内外、違うところに書くのでどうすればいいのかと思っていたのですが
if文で分岐させればループ外に書くのと同じじゃないかと気づきました
何を言っているか分からないかもしれませんが、疑問は解決したということです
配列の種類と仰っていましたが一つのマップに登場するオブジェクトは
そんなに数や種類は変わらないと思いますので動的配列にする必要はない気がしてきました
数は少し多めにとって固定配列にします
いまさらですが、このトピックのタイトルに関することに対してなのですが
変なことに悩んでいました
描画とロードはループ内外、違うところに書くのでどうすればいいのかと思っていたのですが
if文で分岐させればループ外に書くのと同じじゃないかと気づきました
何を言っているか分からないかもしれませんが、疑問は解決したということです
配列の種類と仰っていましたが一つのマップに登場するオブジェクトは
そんなに数や種類は変わらないと思いますので動的配列にする必要はない気がしてきました
数は少し多めにとって固定配列にします