C++ における描画マネージャーの考え方について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
WizSele

C++ における描画マネージャーの考え方について

#1

投稿記事 by WizSele » 8年前

描画マネージャーに登録したオブジェクトの描画プライオリティを変更したい場合、
そもそもそういう処理自体しなくていい、こうしたらいい・・・など
その処理をどうすればいいか分からずご質問させて頂きました。

本題の前に、使用環境等を記載致します。

・使用OS:Windows 7 Home Premium(64bit)
・コンパイラ:Visual Studio 2015
・使用言語:C++


簡略化した擬似コードを記載致します。

: class Base{ ... }; // 基本クラス

そして、class Base を継承した class MyChar、class Enemy、と作成し、それぞれ描画マネージャーへ登録したとします。
: DrawManager mng;
: mng.add(MyChar);
: mng.add(Enemy);

登録後は、描画マネージャのメンバメソッドにある
drawメソッドの呼び出しで画面上に描画されるものとします。
: for(mng に登録されている数分)
:     mng.draw(); // 描画メソッド

どんどん追加して描画するだけの単純な構造で描画するだけならこれで全然いいのですが、
描画のプライオリティを変更したい時はどのようにすればいいのかが分からなくなりました。

今後、敵など描画する物が増えてくると、この構造では後から追加したものが一番手前に描画されるような仕組みとなっているため
例えば、最初に登録した MyChar を常に手前に表示しておきたい、
間に追加した Enemy を、ある Enemy よりも前に描画したいなど、どのような処理をしていけばいいのか困っております。

そもそもこのような問題が起こっていることが問題なのか、
フラグを設けて入れ替えるのか、追加するタイミングを考えないといけないのかなど色々な考えが出ている状態です。

何かお勧めの管理方法、実装方法などがありましたら教えて頂けないでしょうか。
よろしくお願いいたします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: C++ における描画マネージャーの考え方について

#2

投稿記事 by softya(ソフト屋) » 8年前

私の知るパターンで多いのは登録時に引数の重ね順位番号でソートするやつですね。
描画時にはソートされた順番で行います。
重ね順位番号を変更するときは、再ソートを行います。
毎回再ソートしなければ負荷は気にする必要ないでしょう。

【補足】
それと親子でチェインして、重ね合わせ順番を決めるようつもありますね。
子は必ず親の前に出ます。それと子は親の位置に影響を受けるって仕組みを併せ持っていたりします。
最初に書いたのと合わせ技の描画順番機能があるやつもあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

WizSele

Re: C++ における描画マネージャーの考え方について

#3

投稿記事 by WizSele » 8年前

> softya(ソフト屋)さん
早速の返信ありがとうございます!
ご回答頂いた点の理解が出来ているか微妙だったので改めてご質問させてください!
前半部分についてなのですが、
softya(ソフト屋) さんが書きました: 私の知るパターンで多いのは登録時に引数の重ね順位番号でソートするやつですね。
"引数の重ね順位番号" という部分なのですが、イメージとして合っているかを確認させて頂きたいのですが、
今回はマジックナンバーとして記載しますが、登録時に描画するIDみたいなのを設定するということでしょうか?
例えば、
mng.add(MyChar, 1);
mng.add(Enemy, 2);
mng.add(Enemy, 3);

描画メソッドではこの番号順に描画、もし間に入れたい場合は挿入後に新たに番号を割り振る
というような理解でいいでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: C++ における描画マネージャーの考え方について

#4

投稿記事 by softya(ソフト屋) » 8年前

理解されていると思います。

間に挿入されるのが分かっている場合には、
mng.add(MyChar, 10);
mng.add(Enemy, 20);
mng.add(Enemy, 30);
とわざと番号の間隔を開けておきます。
固定値ならenumで定義しておくのも良い手でしょう。

補足としてadd毎に毎回ソートするのは重そうなので、add時にソートフラグをONして、ソートフラグがONなら描画直前に一括ソートするのが良いかと思います。まぁ、そこまでしなくて良いかもしれません。ゲームによりますね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

WizSele

Re: C++ における描画マネージャーの考え方について

#5

投稿記事 by WizSele » 8年前

> softya(ソフト屋)さん
処理が重たいかどうかは一旦度外視して、とりあえず考え方としてどのように捉えるのかがあやふやでしたが
ありがとうございます、大変分かりやすかったです!
この方法を聞いて、登録時にあえて番号を空けておくのもありかな?
と思っていた矢先にサンプルまで頂けて大変参考になりました!
「解決!」とさせて頂きます。

貴重なお時間本当にありがとうございました!!

閉鎖

“C言語何でも質問掲示板” へ戻る