platinumで吐き出せるFMFを読み取るためクラスを置いておく。特に反省はしてない。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Data; namespace RPG { class MapFile { //FMFファイルのヘッダー struct FMFHeader { public string dwIdentifier; // ファイル識別子 'FMF_' public int dwSize; // ヘッダを除いたデータサイズ public int dwWidth; // マップの横幅 public int dwHeight; // マップの高さ public byte byChipWidth; // マップチップ1つの幅(pixel) public byte byChipHeight; // マップチップ1つの高さ(pixel) public byte byLayerCount; // レイヤーの数 public byte byBitCount; // レイヤデータのビットカウント } private FileStream fs; private BinaryReader br; private FMFHeader _head; private byte[] _data8 = null; private short[] _data16 = null; public int width { get { return _head.dwWidth; } } public int height { get { return _head.dwHeight; } } public int chip_width { get { return _head.byChipWidth; } } public int chip_height { get { return _head.byChipHeight; } } //マップファイルを読み込む。 //エラーが起きた場合は例外を投げます public void Load(String fname) { try { fs = new FileStream(fname, FileMode.Open); br = new BinaryReader(fs); //識別子を確認する _head.dwIdentifier = new String(br.ReadChars(4)); if (_head.dwIdentifier != "FMF_") { throw new Exception("ファイルが壊れています"); } //ヘッダーの残りの情報を読み込む _head.dwSize = br.ReadInt32(); _head.dwWidth = br.ReadInt32(); _head.dwHeight = br.ReadInt32(); _head.byChipWidth = br.ReadByte(); _head.byChipHeight = br.ReadByte(); _head.byLayerCount = br.ReadByte(); _head.byBitCount = br.ReadByte(); switch (_head.byBitCount) { case 8: //8bit layer _data8 = br.ReadBytes(_head.dwSize); break; case 16: //16it layer int count = _head.dwSize / 2; _data16 = new short[count]; for(int i = 0; i < count; i++) _data16[i] = br.ReadInt16(); break; } } catch(Exception ex) { throw ex; } finally { br.Close(); } } //マップファイルを閉じます public void close() { //読み込んだデータを破棄する _data8 = null; _data16 = null; } //マップファイルからチップ番号を取得します public int getValue(int layer_index, int x, int y) { if (_data8 == null &amp;&amp; _data16 == null) return -1; if (layer_index >= _head.byLayerCount || x >= _head.dwWidth || y >= _head.dwHeight) return -1; int index = 0; int layer_offset = getLayerAddr(layer_index); switch (_head.byBitCount) { case 8: //8bit layer index = _data8[layer_offset + x + y * _head.dwWidth]; break; case 16: //16it layer index = _data16[layer_offset + x + y * _head.dwWidth]; break; } return index; } //該当レイヤーが存在する_dataのindexを返す private int getLayerAddr(int layer_index) { if (layer_index >= _head.byLayerCount || (_data8 == null &amp;&amp; _data16 == null)) return -1; return _head.dwWidth * _head.dwHeight * layer_index; } } }
#訂正
http://anond.hatelabo.jp/20090706041056 pre記法を使ってるんだが+が>に変換されてしまう。 これじゃあ、このままコピペしても動かなさそうだ。 実態参照に変換して貼り付けるのもめんどくさ...