Platinumで作成したマップデータを読み込みたいのですが、
http://inu.harisen.jp/scene_1/14.htmlmのエディタだとヘッダーのx,yのサイズ情報がそれぞれ4バイトになってるのでどう読み込めばいいのか分かりません。
上記サイトで読み込みの作業では何をやっているのでしょうか。
データを開いて、バッファに記録する、という所までは分かるのですが、X,Yに入れる作業の意味が理解できません。
ヒントだけでもご教授頂けるとありがたいです。
マップファイルの読み込み
-
zwi
Re:マップファイルの読み込み
まず、2バイトバッファに溜め込んでます。これはOKですか?
続いて
map.data_x_num = ((buf[1] & 0xff) << 8) | (buf[0] & 0xff);
で2バイトの数値に変換して、map.data_x_numに代入しています。
map.data_y_numも同様です。
4バイトにするなら、状況の処理を4バイトにするだけです。
for(int i = 0 ; i < 4 ; i++)
と
map.data_x_num = ((buf[3] & 0xff) << 24) |((buf[2] & 0xff) << 16) |((buf[1] & 0xff) << 8) | (buf[0] & 0xff);
って感じです。
私としては、あんまり好きな処理では無いですが。
for(int i = 0 ; i < 2 ; i++)
{
if(FileRead_read(&buf, sizeof(BYTE), fh) == -1)
{
MB("マップチップデータファイル読み込みに失敗しました。");
FileRead_close(fh); //ちゃんとファイルを閉じる
return false;
}
}続いて
map.data_x_num = ((buf[1] & 0xff) << 8) | (buf[0] & 0xff);
で2バイトの数値に変換して、map.data_x_numに代入しています。
map.data_y_numも同様です。
4バイトにするなら、状況の処理を4バイトにするだけです。
for(int i = 0 ; i < 4 ; i++)
と
map.data_x_num = ((buf[3] & 0xff) << 24) |((buf[2] & 0xff) << 16) |((buf[1] & 0xff) << 8) | (buf[0] & 0xff);
って感じです。
私としては、あんまり好きな処理では無いですが。
-
belve
Re:マップファイルの読み込み
回答ありがとうございますm(__)m
4バイト分並んでるから、シフトさせてビット演算でひとつにまとめてるという事ですよね。
何となく理解できた気がします。ありがとうございました。
ところで、あまり好きな処理ではないという事はほかにもっと良い処理があったりするのでしょうか。
自分では思いつきもしません。。
4バイト分並んでるから、シフトさせてビット演算でひとつにまとめてるという事ですよね。
何となく理解できた気がします。ありがとうございました。
ところで、あまり好きな処理ではないという事はほかにもっと良い処理があったりするのでしょうか。
自分では思いつきもしません。。
-
バグ
Re:マップファイルの読み込み
こんな感じかな?
#include <stdio.h>
union DWORD
{
unsigned char byte[4]; // ※unsigned char型が1byteの環境とする
unsigned long dword; // ※unsigned long型が4byteの環境とする
};
int main(void)
{
DWORD data;
for (int i = 0; i < 4; ++i) data.byte = 255;
printf("%u\n", data.dword);
return 0;
}-
belve
Re:マップファイルの読み込み
共用体ってそういう使い方が出来たんですか。今まで聞いたことはありましたが、よく分からなかくて使ったことはなかったです^^;
長いスクリプトがすっきりしそうです。ありがとうございました。m(__)m
長いスクリプトがすっきりしそうです。ありがとうございました。m(__)m
-
GPGA
Re:マップファイルの読み込み
memcpyやキャストでやる方法もあります。
#include <stdio.h>
#include <string.h>
int main() {
unsigned char c[/url] = { 0x12, 0x34, 0x56, 0x78 };
unsigned int n;
memcpy(&n, c, sizeof(n));
printf("%x\n", n);
n = *(unsigned int*)c;
printf("%x\n", n);
} -
belve
Re:マップファイルの読み込み
色々ありがとうございます。
ポインタとかもあまり使わないのですが、使い方をしっかり覚える必要がありそうです^^;
全く関係ないのですがPlatinumでマップチップを2バイトモードで使った際に、1行目が埋まらずに画像が次の行に行くので、エディタの画像番号がプログラムで分割読み込みした際の番号と合わなくなってしまうのですが、他の使っている方はどのようにしているのでしょうか。
ググったりしたのですが、そのような事を思う方もいないようなので相当初歩的な事を見落としてるのかもしれませんけど;;
ポインタとかもあまり使わないのですが、使い方をしっかり覚える必要がありそうです^^;
全く関係ないのですがPlatinumでマップチップを2バイトモードで使った際に、1行目が埋まらずに画像が次の行に行くので、エディタの画像番号がプログラムで分割読み込みした際の番号と合わなくなってしまうのですが、他の使っている方はどのようにしているのでしょうか。
ググったりしたのですが、そのような事を思う方もいないようなので相当初歩的な事を見落としてるのかもしれませんけど;;
-
Justy
Re:マップファイルの読み込み
>マップチップを2バイトモードで使った際に、1行目が埋まらずに画像が次の行に行くので、
>エディタの画像番号がプログラムで分割読み込みした際の番号と合わなくなってしまうのですが
?
何がどう合わないんでしょうか??
>他の使っている方はどのようにしているのでしょうか
多分サンプルの CFmfMapクラスをそのまま使ってるんじゃないでしょうか。
あれを使えば自分でマップファイルの解析ルーチンを作る必要はなくなりますので。
-
belve
Re:マップファイルの読み込み
やはりサンプルを使ってたのですか。
WINAPIは分からないからDXライブラリでやろうと思っていたのですが、なんとか自己解決できました。
色々とお騒がせして申し訳ありません。
回答ありがとうございましたm(__)m
WINAPIは分からないからDXライブラリでやろうと思っていたのですが、なんとか自己解決できました。
色々とお騒がせして申し訳ありません。
回答ありがとうございましたm(__)m