- 1 名前:名前は開発中のものです。 mailto:sage [2010/04/02(金) 00:21:35 ID:zsqivwcw]
- 疑問に思うことがあれば、スレを立てずに、まずはココで質問。
スレッドを立てる前にはローカルルールを読みましょう。 pc11.2ch.net/gamedev/ ※ >>980 を踏んだ人は次スレ立てをお願いします。 【アップローダ・避難所・Wiki】 ゲーム製作技術板公式Wiki wiki.game-develop.com/ ゲーム製作技術板公式アップローダ gmdev.xrea.jp/ ゲーム製作技術板予備(機能停止中?) yy13.kakiko.com/gamdev/ アップローダー予備 gamdev.hp.infoseek.co.jp/ gamdev.orgが落ちるたびにあげてみるスレ pc11.2ch.net/test/read.cgi/gamedev/1107022166/
- 259 名前:名前は開発中のものです。 mailto:sage [2010/05/31(月) 10:44:58 ID:BTSw9VY2]
- 大きなマップのデータファイルを作って
プレイヤーが移動するたびに動的にマップデータを読み込んで マップを表示するようにしたいんですけど マップを実際に表示するためのデータはどう作るのが理想的なんでしょうか 最初はマップ1マス毎の構造体を作ってそれをリストにして プレイヤーが動く度に見えなくなった列のマスを廃棄、新しい列のマスをマップデータから読み込み とやっていたんですけど いちいち開放、確保をやるのも馬鹿らしかったのと、見える範囲のマスの量は一定なのだから 配列で作ったほうが良いと思い作り直し始めたんです でも考えてみると今の書き方だとリストにせよ配列にせよ 表示するマップデータを1列変えるだけで相当な条件分岐を使ってるんですよ マップファイルから取り込んだ新しく追加する1列に含まれるマス数 × 要らなくなり、取り替える必要のある1列に含まれるマス数 × 要らなくなり、取り替える必要のあるマスを現在の表示マップデータから1マスずつ検索する為の分岐 毎Fごとにこれをやるのは結構な負担になると思うのでどうにか良い方法はないかと思ってるんですけど 自分の頭では思いつけませんでした 良い方法があったら教えてもらえませんか?よろしくお願いします
- 260 名前:名前は開発中のものです。 mailto:sage [2010/05/31(月) 13:19:29 ID:V4wY+c/3]
- >>259
どのくらいのマップ?1マスのバイト数は?
- 261 名前:名前は開発中のものです。 mailto:sage [2010/05/31(月) 13:38:41 ID:V4wY+c/3]
- どうしてもファイルから読み込まなければならない場合、マスの集合体となる
データセットを9個作りそれを3×3に配置する。データセットは1画面をカバー できる情報量を持たせる。 1 2 3 4(座標) ×□□□ ×□■□ ■プレイヤーキャラがいる場所 ×□□□ プレイヤーキャラが移動し、となりのデータセットのマスに移動した時点で 1 2 3 4 □□□× □■□× (左に移動 □□□× データセットの中身を変更する。X座標4のデータセットはX座標1のデータセットに 上書きする。画面表示時の読み出しはプレイヤーキャラの位置からどのデータセットの どの位置のマスを参照するかを計算によって特定する。
- 262 名前:名前は開発中のものです。 mailto:sage [2010/05/31(月) 13:41:16 ID:V4wY+c/3]
- データセットがマップのどの位置の情報を持っているかをバッファに納めておくと良いだろう。
データセット変更のタイミングを工夫すればプレイヤーがセットの境界で後戻りした場合 など余計なファイルアクセスを軽減できる。
- 263 名前:名前は開発中のものです。 mailto:sage [2010/05/31(月) 14:06:35 ID:BxJvMFWg]
- 2Dなら普通に平野=1、森=2、……形式のバイナリデータでいいんじゃないの。
マップの幅と高さはヘッダに入れるか別途管理しておいて、 1マスごとにnバイトずつpeekとかで読込み、列と行の2重ループで展開するだけ。 ■ヘッダ部:…54… (列と行のサイズ。他にレイヤー数など) ■データ部:00700117112272233733 ■展開:(実際は番号に従ってチップ画像を表示) 00700 11711 22722 33733 ■実際の処理: for(row=0:row<=rowMax:row++){ if(表示画面の範囲外){ continue; } for(col=0:col<=colMax:col++){ if(表示画面の範囲外){ continue; } cell=(row*colMax)+col; //何マス目か chip=ヘッダバイト+(nバイト×cell); //そのマスのチップ番号 // 以下、chip番号に該当する画像をnマス目の部分に表示 } } あと普通はマップデータをファイルから読込むのは画面切替の時とかに一度だけで スクロールごとにロードなんてしない。
- 264 名前:名前は開発中のものです。 mailto:sage [2010/05/31(月) 14:29:15 ID:BxJvMFWg]
- すまん、↑普通はと言ったのを念のためフォロー。
確かにぐぐるマップみたいに分割読み込みすることは場合によってはあり得るけど 初質だし、そういう凝ったことがしたいわけじゃないだろうと思ったから 普通のRPG程度のデータなら問題ないはずだし、いちいちファイルアクセスするのは 遅くなるだけだから無闇にロードはしない方がいいぞ、って意味
- 265 名前:名前は開発中のものです。 mailto:sage [2010/05/31(月) 14:43:01 ID:BTSw9VY2]
- >>260
マップの大きさは一辺が8185です。 1マスのバイト数は8バイトと少し大きめのファイルになっています。 ちょっとメモリ上に置くには大きすぎるのでファイル読み込み式にしたいです >>261 実は同じような感じでマス16個(4×4)で構成される構造体を作り 更にプレイヤーの歩くモーションのループ処理の直前にマップ情報読み込み判定を付けることで 毎回の読み込みをさせないようにしたことはあったのですが その方法だとある特定のフレームにだけ高負荷を掛ける事になり 後々に作る他のシステムとの相性によってはゲーム中に違和感がでる フレームの遅延が起きそうだったのでちょっと考えてたんです 情報を小出しにするようなマネをしてごめんなさい >>262 上の方法でやった時はunsigned int の上位2バイトにx、下位2バイトにy座標を持たせたデータを使っていました
|

|