*.map 文件是记载地图信息的文件。
: q2 o# A- |4 @
8 s' ?2 Q' Y/ v* s! q 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
: T6 w c+ m3 O7 |1 |4 B5 j E$ ^! A ~, J: s* T$ p
第 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 地表一层的序号
) C# V$ D5 k& m' W. B" [- D# b5 ^1 g, [1 t- H: h
03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
2 N. A( h, b* V2 _+ M* t! F/ g07 在地表二层 12 01 这个大序列下的子序列编号
2 a- _( \2 r" i- E86 物件层的大序列
4 N, C- t% D- I# p- E; H9 r: [00 物件层的大序列下物件的子序列编号
" p5 M4 f. x; s03 03 00 目前不详
! m+ @( T; ]4 y$ H3 d+ f- z01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。5 z1 L& B% y/ W2 K4 `' B9 O3 s' @
% V8 f3 ~# m+ \7 s$ f/ `- d//************************************************************4 I% `% m, n* }8 J. N9 e
// 加载地图基本数据函数;
: | ]" R# f$ M+ l) D//************************************************************8 e7 o8 D( X# H! z; D
1 \- P" V9 z, L2 |% y [8 m
//************************************************************
4 z2 Y9 ~' w+ u% E1 U2 S+ a) p9 K// 加载地图基本数据函数;8 J- }/ D; }6 \, n% |( U
//************************************************************. T# k. f/ ?$ U) X! s$ d- x! `
) @. ~6 S, b1 K0 P# O4 vint Cmap:oaddata(char *filnam)
4 q4 ^* _7 Q+ D8 i{' m' C+ s/ g' |1 O, [. d
int Temdata;; |8 Y# Q# e# j, \: q
1 ^2 L: d7 b/ j4 Q
if(filnam == "") return 0; G5 q1 ^2 g, g5 _. p8 C
" {8 {4 b! Y+ @# f fp_map = fopen(filnam,"rb");* m, B3 E( v0 h! L1 d: y( s1 o
1 F, O; S' X8 F _' I& a$ m* y; v
if(fp_map == NULL) return 0;* _0 T7 C) y. V4 K! L+ ]4 N
" C" q3 u! b& `& M( S1 b/ R
fseek ( fp_map, 16, SEEK_SET);
. E0 `* }# {2 k7 P- k, D6 L: c fread ( &ShortWidth, 4, 1, fp_map);
. l: a' c3 _% B4 J6 R! F+ @7 [ fread ( &Width, 4, 1, fp_map);2 A1 _9 T: l H6 m5 r
fread ( &Height, 4, 1, fp_map); ?! @; A7 M8 z0 M& C7 {" E
' {3 {, W* `9 k$ `2 e+ p0 `
int TW = Width / ShortWidth;
, C1 D. ?% V; d* f+ f int TH = Height / ShortWidth;
. S3 T8 h( Q1 x8 k! m: p) O% S+ F* l2 _9 r2 d: A4 M5 [
for (int j = 0 ; j < Width ; j++), ~; r3 Y- M# @5 _
{
( X4 V3 a( x- h v* `% r0 ^ _DELETE_ARRAY(Cell);2 q' A. M9 d" N$ T
_DELETE_ARRAY(Role);
- w- T0 F$ d) i7 U: T; {: U. y }
1 @9 Q3 G( j4 \% ^+ A( `( J/ O7 E0 \, [* U( q0 ?/ U
Cell = new stCell*[Width];
* t5 D& H2 t+ w1 h: p3 N Role = new stRole*[Height];
' L0 O' P) A I for (j = 0 ; j < Width ; j++)" R7 [, k* X- v; ?. T
{" F" H& Q- {# k& X
Cell[j] = new stCell[Height];0 y A9 q8 C) P1 E
Role[j] = new stRole[Height];
* C8 V3 u1 S+ ]& Q }
2 s$ W' P+ L! v1 |% i* s8 V5 y5 y& C w6 A
fseek ( fp_map, 28, SEEK_SET);
6 |: d7 V1 d9 Q8 O8 t5 c6 K% {
+ I' d% d0 b! e for (int y1 = 0; y1 < TH ; y1++)
. U4 }0 ~" f& }3 A- ]- x+ w {
' J5 ^" G5 x- a& G! h" ?3 | for (int x1 = 0; x1 < TW ; x1++)7 B, J4 C* n3 S1 H( `; R4 j
{ L- l$ G4 B9 p F8 ~- f3 n
fseek ( fp_map, 20, SEEK_CUR);! a8 |1 S# g& D! v$ D
for (int y2 = 0; y2 < ShortWidth ; y2++)
2 ?$ `8 D: |' `$ V R {, K5 R# o. x# L0 |5 s* Y
for (int x2 = 0; x2 < ShortWidth ; x2++)5 K1 P! J! W: z/ L/ h# f
{3 ` c$ m/ R- K0 x* p
fread ( &Temdata , 2, 1, fp_map);
4 P- T; b' a k8 h) ^! j Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;+ D6 n9 J# s" Z# K0 o' D
/ L" I9 k2 ^, h- W: R
fread ( &Temdata , 1, 1, fp_map);1 L% c% J4 G1 B
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;- B$ s* f; L6 c0 L' y& E
5 h, \: x; C) C& \+ r, R, v+ E fread ( &Temdata , 2, 1, fp_map);+ M' W0 `& s9 X4 @3 b5 a$ e
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;7 W% Y, z& I! u Q; v1 {
1 G, ?- [- w! ^: [
fread ( &Temdata , 1, 1, fp_map);
% n+ I5 o% ?1 s, ] Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
( c8 O# N! a! P) K- J' j // 6个字节
@' z$ W. b' x3 ^6 }. ~+ C! W
5 h% u) T; O% n2 ^( J fread ( &Temdata , 1, 1, fp_map);
: f' W, O G) B) O Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;0 o5 P) c$ Y( c
R' A: n% I: U8 q% `- d
fread ( &Temdata , 1, 1, fp_map);
- f& ]* V, u( I% e; q5 F+ I+ z7 T Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;4 C: {! |+ s/ j& m
4 W2 x: c* R9 {) N' W6 J; d, t //fseek ( fp_map,3,SEEK_CUR);2 o* p; d; B' G& L7 `' p' _
fread ( &Temdata , 1, 1, fp_map);
n8 K) ^. C/ O/ w Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
: ^- h% y- e: @; n0 E- D2 i 0 v5 w" `0 K Z# f6 l, G3 M
fread ( &Temdata , 2, 1, fp_map);
4 a( x5 M/ V x/ |8 j: |8 l Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;) G0 ]8 q6 n3 E' v
: Q) J3 K, o( ^3 Z0 x! i- ^ // 1个字节9 N2 n1 _( S0 z4 } w
fread ( &Temdata , 1, 1, fp_map);
% ]' P% f% }/ P& l Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
# z- z" P! {: C F& H/ K //if (ftell(fp_map) > FilZize) return 0;, \5 W) b. u' J% D
}% O3 z$ w' ~! j$ h
}
# q, \/ o6 U2 r0 v1 |; D2 J }
+ R! O' y( w5 g! O: p5 \8 c }
+ d! R8 |( I- W' V6 t! j7 n" W) G9 e0 v/ L$ w$ F) z
fclose(fp_map);: k( n. u( X; L4 x- b7 ]+ G+ E
0 p1 m% p2 f" N4 j, s! Z
" X* S* i+ [5 v2 B; w& e return 1;2 O: n3 x7 G# N/ r, Y# J6 c/ c
}
* X V% l3 I" L/ e |