配列に間して

アバター
BEAT
記事: 4
登録日時: 13年前
住所: 兵庫県S市杜王町
連絡を取る:

配列に間して

投稿記事 by BEAT » 13年前

今日「出入り処理」を作ってたときに思ったんですが。

まず前提として、
「屋外用のマップ情報」「屋内用のマップ情報」を持った配列変数があります。

最初に考えたことは
それらを「現在どちら側(屋内or屋外)にいるか?」を判別し、各処理でif文で分岐させ処理する方法を思いつきましたが
これは「各処理毎にifで文で分岐させるとソースが見づらくなる」ということで却下。

次に考えたのは
二つのマップ情報を「建物に入った、または出た」というフラグを立てて、その上で「現在どちら側にいるか?」を判別し
「現在のマップの情報」として入れる配列をつくる方法を考えました。

この方法により、各処理でif文による分岐はいらなくなりかなりソースが見やすくなりました。

が、「現在のマップ情報」を入れる配列には「1エリア(オセロ盤の1マスのイメージ)の情報を入れる」のがいいのか
それとも「全エリア(オセロ盤の全てのマスのイメージ)の情報を入れる」のがいいのか・・・

ちなみにオセロのマス1マスの中にも300のマスがあります。

状況のイメージ
画像

前者の方法だと「エリアを切り替える毎にエリア情報を更新する必要があるが配列は小さくて済む」
後者の方法だと「情報の更新は建物に出入りしたときだけで済むが配列が大きくなる」

ここで疑問に思ったことが、「どっちのほうがいいんだろう?」ということです。
何を持ってして「いい」と判断するのかは分かりませんが(´・ω・`)

前者はメモリの使用量が少ないけどアクセス?の回数が増えると思うんですよね。
逆に後者はメモリの使用量が多いけどアクセスの回数は少なくて済む。と予想。

自分はソースがきれいになるので「小さな配列」を使う方法を使ってます。
最後に編集したユーザー BEAT on 2011年5月11日(水) 17:52 [ 編集 2 回目 ]

アバター
MoNoQLoREATOR
記事: 284
登録日時: 13年前

Re: 配列に間して

投稿記事 by MoNoQLoREATOR » 13年前

システムがよくわかりません。
建物の外観が小さく描かれていて、その中に入ると、ちゃんと等身大になるっていうことですか?

アバター
BEAT
記事: 4
登録日時: 13年前
住所: 兵庫県S市杜王町
連絡を取る:

Re: 配列に間して

投稿記事 by BEAT » 13年前

そうだね。ゼルダの伝説みたいな。
重要なのは「屋内、屋外」があってそれをどう扱うかなんだよね

アバター
へろりくしょん
記事: 92
登録日時: 13年前

Re: 配列に間して

投稿記事 by へろりくしょん » 13年前

状況がまったく読めませんが、「屋内・屋外」ではなく、「マップ1・マップ2」ではダメなのでしょうか。

例えば、ドラクエのようなフィールドと街中も「どちらも等しく同じマップ」ですよね。
現在の状態というのに、どのマップを持たせておくか。 だけだと思うのですが。

どうにかポインタの切り替えのみで済む方法を考えてみては。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 13年前

Re: 配列に間して

投稿記事 by MoNoQLoREATOR » 13年前

あら、へろりんさんイメージ画像変えました・・・よね?個人的には前の物が好みかな。

私もへろりんさんと同じ意見で、屋内・屋外で区別するのではなく、「どのマップを表示するか」ということだけを考えればよいと思います。私のイメージでは次の通りです。

自キャラと同じような大きさの建物が描かれているようなマップをつくる。
自キャラと建物の大きさの比率がリアルなマップをつくる。(いわゆる屋内マップ)
現在どんなマップを表示すべきか変数に記憶させておく。
↑↑↑↑↑↑↑ここまで下準備↑↑↑↑↑↑↑

現在表示すべきマップが変更されたらそのマップを読み込む→配列に格納

描画

マップの大きさがそれぞれ異なると思いますので、vectorクラスを使って、読み込みの度に配列の数を調整する必要が出てきます。面倒くさければ、一番最初に全てのマップの情報を読み込んで配列変数に格納しておく方法をとることもできますが、マップが増えていくにつれてものすごい数の配列変数を宣言しなければならなくなるので、あまりおすすめはしません。

アバター
BEAT
記事: 4
登録日時: 13年前
住所: 兵庫県S市杜王町
連絡を取る:

Re: 配列に間して

投稿記事 by BEAT » 13年前

お二方へ

なんか説明のしかた悪かったですね(´・ω・`)
複数のマップを扱って、屋内、屋外を表現する方法はもう見えてるんです。

単純に「小さい配列に何度も値を入れて描画する」のと「大きな配列から必要部分を取り出す」のと
どちらのほうがいいのかなと思っただけです。
最後に編集したユーザー BEAT on 2011年4月28日(木) 22:02 [ 編集 1 回目 ]

アバター
へろりくしょん
記事: 92
登録日時: 13年前

Re: 配列に間して

投稿記事 by へろりくしょん » 13年前

やっぱりさっぱり分からない訳ですが。

小さな配列に入れる値はどこから取り出すのでしょうか。 大きな配列から取り出した値はどこに置くのでしょうか。

複数のマップを切り替えるところまで出来ているなら、後は現在位置の座標(描画開始位置)を計算するだけでは?

アバター
MoNoQLoREATOR
記事: 284
登録日時: 13年前

Re: 配列に間して

投稿記事 by MoNoQLoREATOR » 13年前

いちいち描画用の配列に入れなおすのではなくて、要素を取り出す位置を調整すれば良いだけの話ですね。

アバター
MNS
記事: 35
登録日時: 13年前

Re: 配列に間して

投稿記事 by MNS » 13年前

いずれにせよ、マップの実体があるなら、そのデータをコピーすることは速度的にもメモリ的にもよろしくないんじゃないでしょうか?
読み始めるところを、ポインタなり添字なりで記録して、それで元の大きなマップ配列にアクセスするのが一番速そうです。

アバター
BEAT
記事: 4
登録日時: 13年前
住所: 兵庫県S市杜王町
連絡を取る:

Re: 配列に間して

投稿記事 by BEAT » 13年前

なるほど・・・
「せっかく元からデータがあるのだからそっち使えば良いじゃない」ってことですか
確かにもう1つ作るよりメモリは節約されますね。

ってことは最初に考えてた方法のほうが良いのか・・・