*.map
文件是记载地图信息的文件。
3 o! s$ S; H/ h7 g. M8 d3 R. l+ ?4 x1 n# y5 C" d) f
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
- s0 x9 R$ j6 u; q
6 m5 V( I8 J0 X6 K% H 第 2层地表就复杂一点,它是“物件”层的补偿层。“物件”是指树木、花草、房屋等东西的统称。为什么说第 2层是“物件”层的补偿层那,因为图象显示要有前后关系,近处的覆盖远处的东西,但长在地上的花,无论离的多么近都会被覆盖,所以给加在了地表 2层。下面开始说一个实际的文件start.map,用 UE打开它后会看到 16进制数据,右面对应是asc 码,前 7个字节的 16进制数据是:“41 54 5A 4D 41 50 32”,看右侧对应的 asc码是 “ATZMAP2”,这个是地图格式标识,是说明文件格式的。之后 9个字节为空,我们跳过,不用理会。之后的 4个字节是 :“28 00 00 00”,这个宽度是组成大地图的小正方形的宽度,为什么这么说呢?看下面的图你就会明白了,比如是一个 9 * 9 的大地图,是这样记录在 .map文件中的:1 1 1 2 2 2 3 3 31 1 1 2 2 2 3 3 31 1 1 2 2 2 3 3 34 4 4 5 5 5 6 6 64 4 4 5 5 5 6 6 64 4 4 5 5 5 6 6 6前面我们所说的组成大地图的小正方形的宽度(兰色那个矩阵),在这里就是 3。我们再继续看 map文件,接下来的 8个字节是:“ C8 00 00 00 C8 00 00 00”,前 4个字节是这个地图的宽度,后 4个字节是这个地图的高度 。下面是正式开始的地图数据了,这里有一点要注意的,我们前面提到了“组成大地图的小正方形”,他们在map 文件中被记录的时候,每个这个正方形的数据前面都会空出 20个字节,在读文件的时候跳过即可。地块数据由 12个字节的数据来表示,比如:“13 00 03 12 01 07 86 00 03 03 00 01”这个地块。13 00 地表一层的序号
6 P4 y, _% ~: Q% O
) [6 d! r5 v9 ~03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
- F0 l/ m1 a0 ^! Z- p07
在地表二层 12 01 这个大序列下的子序列编号
$ k; e5 ^9 n" |3 l6 T8 m( G86
物件层的大序列
; F! f/ f4 ^. j4 B00
物件层的大序列下物件的子序列编号
# M! U- o5 b' N03 03 00
目前不详1 u6 ?% i( x! T* m% J
01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
+ M9 w. n! j6 k. k9 I; v" N
) N2 z3 m; E* c$ R' U+ H4 b//************************************************************
6 D% Y( G S' C1 |9 u5 G
//
加载地图基本数据函数;
6 N% y. X% h$ V//************************************************************
0 s. F4 w; f8 j7 U/ _
/ s) o# V! U6 g: T9 b# o$ B. ]//************************************************************
4 s, G5 g6 W/ m0 Y
//
加载地图基本数据函数;
5 Y* ^! X- M+ ~, p8 _. t8 J: q//************************************************************
% Y, k2 e) D! K: n4 m$ S6 p
) `( f" x F9 o& _+ c
int Cmap:

oaddata(char *filnam)
1 q q3 u8 k9 Z: w' w2 C9 Q# |{
4 T& |) w8 Z; k1 q% D: [ I int Temdata;
' d0 |6 Z6 M9 O8 ^! P' k: Z0 X
! I3 h6 X' N$ [1 K* B" p" [ if(filnam == "") return 0;
. c3 G! X. N7 j
. Y6 E; s8 }6 j2 g fp_map = fopen(filnam,"rb");
" C6 X. ^9 f9 D: O: z2 I
$ _5 R0 X: j L# J0 f7 Q if(fp_map == NULL) return 0;
* F" C- I$ v. W2 J
8 ]% I6 }6 U/ `* B2 B9 n fseek ( fp_map, 16, SEEK_SET);
4 E% C, d/ p) G. \0 P fread ( &ShortWidth, 4, 1, fp_map);
$ f2 a. ]1 ?3 e* Y6 F. o1 N
fread ( &Width, 4, 1, fp_map);
/ F; D; N6 H+ M' d fread ( &Height, 4, 1, fp_map);
' L4 s' a, f2 @" l
8 o$ n* T, Z! h2 }( l int TW = Width / ShortWidth;
0 c2 s! p+ ?; i3 i" J; x
int TH = Height / ShortWidth;
3 W' d$ D4 ? g c1 z; c0 S3 } w: a7 j
for (int j = 0 ; j < Width ; j++)
4 ~% I$ O/ {$ B# d
{
! r: t* \! c- d
_DELETE_ARRAY(Cell);
1 {$ f( T% ^' F$ f5 X c5 h9 h _DELETE_ARRAY(Role);
, e. D; m/ P9 E2 o
}
?4 J" d9 S% T% W/ S
& K9 O' e+ v; k. T1 H l5 o3 y
Cell = new stCell*[Width];
4 y( F# Z R$ [+ _( I Role = new stRole*[Height];
/ @- U& L; A5 L* e% t1 \6 e% @ for (j = 0 ; j < Width ; j++)
6 A$ N* h8 o( A P3 R' z; O1 D {
+ I. L- L. E# P Cell[j] = new stCell[Height];
. J5 |7 Z+ z, O- E. z- u) e
Role[j] = new stRole[Height];
4 n7 A( z3 B8 v4 ^) d& k }
$ C/ [ q/ ]8 _1 ^ k% y. M% n
9 S& I) h) ]# k- z; G# v' x fseek ( fp_map, 28, SEEK_SET);
. @: I# T- r/ W
6 a' ^. l& [0 g) L7 }7 H. [ for (int y1 = 0; y1 < TH ; y1++)
; u/ B$ C/ i( c0 P# A( D# x2 P {
; t9 ?! L) p( S$ q
for (int x1 = 0; x1 < TW ; x1++)
0 S& H5 q# x. l. j. c" g" f" ? {
# ?) E: p' _" z' j S
fseek ( fp_map, 20, SEEK_CUR);
4 s# ?) }1 v5 |4 v* ~ for (int y2 = 0; y2 < ShortWidth ; y2++)
' ~* @, p* q, |+ i- K0 C* B* n
{
B1 D( u3 S; }
for (int x2 = 0; x2 < ShortWidth ; x2++)
% S' {' J5 `; O4 F" B# o" i5 n0 d
{
" V3 z. B. I1 r9 u8 M( ~2 ]& ~ fread ( &Temdata , 2, 1, fp_map);
: g7 m+ E9 p5 R/ v0 u Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
8 l& J* v [( ]$ m9 U
1 W3 J! e2 q& u6 R$ o8 P% U0 l( Q4 b fread ( &Temdata , 1, 1, fp_map);
8 k8 `$ Y! x3 D- n Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
4 f" J3 P) F6 ^" ?8 q: @4 H
6 U( Y2 F! \. C$ P6 {" I* I fread ( &Temdata , 2, 1, fp_map);
! Y! R1 W4 a8 U* B Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
4 E; e8 d* z7 R
) p* L$ X' l& A: [* `. ?0 J fread ( &Temdata , 1, 1, fp_map);
. ~* \" i$ ~; e) q
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
! L5 l# ~! t% ^$ @- L) x/ l // 6
个字节: h- l' h8 |& b
% v! Z& f8 X" b3 d/ y9 l* u2 N0 S, x fread ( &Temdata , 1, 1, fp_map);
1 z2 `- ]7 V6 y9 }4 u Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
* {+ d9 p0 S4 ]9 A. Q0 I* i7 k
1 D0 J$ \. o- x2 A4 ]- \
fread ( &Temdata , 1, 1, fp_map);
' M; e1 M* O2 J0 o1 S: L, U
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
9 m! ]' Q3 Q" d" f: S
# b8 I6 B5 f6 H% K
//fseek ( fp_map,3,SEEK_CUR);
0 T' b; k; n7 l) ]% X: W fread ( &Temdata , 1, 1, fp_map);
* |! ]. k L: A. j Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
1 \ o7 l( _7 F3 p; N) H6 h; E- i
# f" K' b7 S6 E: Y" A fread ( &Temdata , 2, 1, fp_map);
1 ~; a( T c5 k. Q Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
6 r9 W% [9 d1 a }! |4 S' r+ `5 ^. s# {$ ?. B1 F6 ]
// 1
个字节
& M% r$ H. `: U! F# W& r+ P1 J k2 | fread ( &Temdata , 1, 1, fp_map);
$ | G8 a( E" Y/ X0 Q2 P
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
: S) j L9 c. p0 c, { //if (ftell(fp_map) > FilZize) return 0;
8 F$ |0 z/ y! h }
* \+ d) F2 d3 S0 H2 | @
}
" Y, H6 N$ _9 T6 b4 V }
3 Q; B+ i: g9 c4 q9 J5 j I X+ K3 G( d
}
4 ]6 r" t9 \% g' B1 d `! L! K7 |" q" F6 l0 t/ Z! n7 M& H! |
fclose(fp_map);
9 ~+ a9 B) ?7 j* `$ ~' r2 r7 H
0 I. I4 I7 K9 ^9 E: W; q+ [
$ M- c! E: Q' } a$ | return 1;
3 v, U$ M/ K' o" ^) z}