マップ情報を格納する上での合理性
Posted: 2013年5月24日(金) 10:31
今、二次元配列に格納したマップ情報から、
その要素要素の値に対して、あとで画像や当たり判定等を割り当てている
プログラムを書いています。
が、途中、この考え方が熟練者のプログラマから見て
どの程度合理的であるアルゴリズムかどうか知りたくなりました。
もしかしたら自分はそうとう面倒なことをしているんじゃないか?、と
不安になりましたので相談させて下さい。
ネットで調べるとMAP制作において大体が
二次元配列に格納したMAPの値(数字)を確認して
画像を表示したり、当たり判定を行ったりしていますよね。
ただ、自分は、MAP制作において、
ひとマスひとマスをオブジェクトとして存在させて、
そのクラスの中で座標、当たり判定の種類、使用する画像等の
情報を持たせることを考えました。
いわば、敵を作る状況と同じです。
そうしたのは、自分が慣れている、という理由が大半で
作るのが簡単だからです。
それにオブジェクトとして存在させると、
そのブロックに対していろいろなギミックを加えることが出来ますよね。
耐久力の変数を作って、壊れるブロックにするとか、
点滅フラグを作ってて、点滅するブロックにするとか。
でも、作りながら、それなりに広いマップのゲームの場合
(ここでは二次元配列[1000][1000]でマップを作る話で進めます)
マップ情報の二次元配列の要素の数字から判断して
画像表示や当たり判定を淡々と行う方が
メモリを食わないんじゃないか?と思い始めました。
自分の作り方だと、二次元配列の値を読みながら
ひとつひとつをブロックオブジェクトとして考え、
newでインスタンス化させて格納していきます。
ゲームはスクロールするタイプのもので、
画面はカメラに制御されており、
[1000][1000]の二次元配列に格納していたとしても
表示させるのはカメラのフレーム内のものに限定させるつもりですが
毎回インスタンス化させて[1000][1000]に格納させていることに
変わりはないので[1000][1000]にはすべてオブジェクトが
詰まっているはずですよね?
それって、容量的にはどうなんでしょうか?
毎回、UpdetaやDraw関数のところで
その要素内のオブジェクトの種類IDやチップNoを確認して
当たり判定や画像表示をさせるのと、
ただ単に毎回、2ケタ程度の値だけが入ってる二次元配列を
UpdetaやDraw関数のところで読ませて、その数値で判断させるのとで
どちらが容量を食わず、いや、ゲームのMAPを作る上で合理的なのでしょうか。
このふたつのやり方で考えられるメリット、デメリットを教えて頂ければ嬉しいです。
また、オブジェクトとして格納させるのは、
構造体として格納するのも同じですよね?
容量に変わりは出るでしょうか?
ちなみに、オブジェクトの中では
画像を読み込んだり、格納したりはしていません。
マップチップ自体はゲームステージのクラスのコンストラクタにて読み込ませていて、
オブジェクト内のIDでどれを使うかを判断、表示させています。
その要素要素の値に対して、あとで画像や当たり判定等を割り当てている
プログラムを書いています。
が、途中、この考え方が熟練者のプログラマから見て
どの程度合理的であるアルゴリズムかどうか知りたくなりました。
もしかしたら自分はそうとう面倒なことをしているんじゃないか?、と
不安になりましたので相談させて下さい。
ネットで調べるとMAP制作において大体が
二次元配列に格納したMAPの値(数字)を確認して
画像を表示したり、当たり判定を行ったりしていますよね。
ただ、自分は、MAP制作において、
ひとマスひとマスをオブジェクトとして存在させて、
そのクラスの中で座標、当たり判定の種類、使用する画像等の
情報を持たせることを考えました。
いわば、敵を作る状況と同じです。
そうしたのは、自分が慣れている、という理由が大半で
作るのが簡単だからです。
それにオブジェクトとして存在させると、
そのブロックに対していろいろなギミックを加えることが出来ますよね。
耐久力の変数を作って、壊れるブロックにするとか、
点滅フラグを作ってて、点滅するブロックにするとか。
でも、作りながら、それなりに広いマップのゲームの場合
(ここでは二次元配列[1000][1000]でマップを作る話で進めます)
マップ情報の二次元配列の要素の数字から判断して
画像表示や当たり判定を淡々と行う方が
メモリを食わないんじゃないか?と思い始めました。
自分の作り方だと、二次元配列の値を読みながら
ひとつひとつをブロックオブジェクトとして考え、
newでインスタンス化させて格納していきます。
ゲームはスクロールするタイプのもので、
画面はカメラに制御されており、
[1000][1000]の二次元配列に格納していたとしても
表示させるのはカメラのフレーム内のものに限定させるつもりですが
毎回インスタンス化させて[1000][1000]に格納させていることに
変わりはないので[1000][1000]にはすべてオブジェクトが
詰まっているはずですよね?
それって、容量的にはどうなんでしょうか?
毎回、UpdetaやDraw関数のところで
その要素内のオブジェクトの種類IDやチップNoを確認して
当たり判定や画像表示をさせるのと、
ただ単に毎回、2ケタ程度の値だけが入ってる二次元配列を
UpdetaやDraw関数のところで読ませて、その数値で判断させるのとで
どちらが容量を食わず、いや、ゲームのMAPを作る上で合理的なのでしょうか。
このふたつのやり方で考えられるメリット、デメリットを教えて頂ければ嬉しいです。
また、オブジェクトとして格納させるのは、
構造体として格納するのも同じですよね?
容量に変わりは出るでしょうか?
ちなみに、オブジェクトの中では
画像を読み込んだり、格納したりはしていません。
マップチップ自体はゲームステージのクラスのコンストラクタにて読み込ませていて、
オブジェクト内のIDでどれを使うかを判断、表示させています。