*.map 文件是记载地图信息的文件。0 k. w& K0 [, h7 a- `, H
# h* P! e; Q8 l+ K# O 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
7 I* J2 I5 X. g- W( a. F8 F8 {( M" U7 f3 ]5 R
第 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 h) ~4 k: r8 c- A; H- C- }8 B: ~$ n* D
03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号% t ? C9 V' m9 ?$ _
07 在地表二层 12 01 这个大序列下的子序列编号; h6 F# Y7 K+ c/ O6 _# y' i7 G
86 物件层的大序列8 y. j, C" S6 b, g ~+ F: s% O2 W, m
00 物件层的大序列下物件的子序列编号" y# i9 T4 l0 C7 K
03 03 00 目前不详2 x6 {: B9 i! ?$ D' a+ n
01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
% x# R( w. @5 L. d9 L5 I; o! g- a
2 h6 K; [' L6 o2 Y K' A6 `& O9 B7 r//************************************************************& b8 d5 V$ Z0 }
// 加载地图基本数据函数;5 G# {+ g2 q" S+ }8 c* j
//************************************************************; N& ^9 c; w' Z3 q, B
# H( c/ U$ V" C- c5 g//************************************************************
* @- J1 Q8 W% J7 R// 加载地图基本数据函数;; Z5 |; `; H/ L( G4 O
//************************************************************
. A& l3 d* |5 M! p2 {3 n) ]3 s2 {7 x( V0 W
int Cmap:oaddata(char *filnam)/ P, ]) D: [* P
{
2 {. \: c) J) T _( X4 ] int Temdata;% E" y' Q% l0 q$ N
% V$ p" N: J& {& ~' B; W1 a% b if(filnam == "") return 0;3 ^7 ]) F* r" v; {- u# F% Q% C
5 Y9 J8 W! c) Y. z* |5 W) @+ o4 p
fp_map = fopen(filnam,"rb");
$ ]9 n! U& C+ u( b# i0 M$ Q) J9 x
! v0 z+ y: F, F. |3 p6 B if(fp_map == NULL) return 0;( i% v7 @+ W. Z$ l6 y7 u
; S. Y- y7 g, G9 H! `( {
fseek ( fp_map, 16, SEEK_SET);6 s' d# P0 N8 W; p
fread ( &ShortWidth, 4, 1, fp_map);1 ?8 @- o' I% l# n1 p% _
fread ( &Width, 4, 1, fp_map);) ]1 e( W f/ o' `
fread ( &Height, 4, 1, fp_map);- I# Y. r3 }0 Z$ n* _
3 n* }7 j# f. C, M! T) ^
int TW = Width / ShortWidth;
4 I- d( O3 w1 s* X int TH = Height / ShortWidth;# H% h0 n; k& ^( c- a6 V: o
* Z! p# U8 F5 Q& j* ~2 [
for (int j = 0 ; j < Width ; j++)) N, ]' z* x, d8 z7 |1 W `7 {
{0 q7 x2 {" _+ c5 y* {! m8 e
_DELETE_ARRAY(Cell);
& r4 Z5 U7 f/ n5 A* I, j2 b- A _DELETE_ARRAY(Role);* ~3 J/ ?" J+ E- u% k) t8 b4 q1 m
}
: I3 r5 k' R7 t) U" q# P0 T3 v3 _. \* d; m5 m! Q
Cell = new stCell*[Width];
0 q. i/ v6 H0 t$ o0 M! z$ Y4 E" B3 F Role = new stRole*[Height];: J7 \: h- q# v( t$ f
for (j = 0 ; j < Width ; j++)7 l% i2 ^2 q/ I' a4 L- ~
{
1 Q4 B* f0 Z9 k% F: g8 w/ T Cell[j] = new stCell[Height];
% i: h4 E/ k. [ g# D2 e Role[j] = new stRole[Height];
8 _: i7 j5 z% y5 C) v" M3 W } / |) p# f3 G6 [9 Q0 r3 P7 W) ~7 l
/ L6 `+ c- b+ Y fseek ( fp_map, 28, SEEK_SET);
: E _1 Y% ]$ @$ _) b
+ m: Y# O4 p3 T# T4 Z1 F for (int y1 = 0; y1 < TH ; y1++)
$ y: G) ?" I3 U' j1 [ {0 h; ?0 \1 B$ n9 R+ C `' D3 ?0 ~ c
for (int x1 = 0; x1 < TW ; x1++)4 @% {1 a0 C# A% {7 ^; V
{
. y7 o0 k1 k6 N fseek ( fp_map, 20, SEEK_CUR);% r ~5 B. ] e X% A" U
for (int y2 = 0; y2 < ShortWidth ; y2++)
) `9 [, i+ j" w8 K" N& b {
; e0 ?: ~2 H- F for (int x2 = 0; x2 < ShortWidth ; x2++)
% _9 I; S# h0 z: {8 c1 \ {
* g* ~7 B$ i- A# q2 Z9 z% C" i fread ( &Temdata , 2, 1, fp_map);( B! Z7 L! a& [ R- J, f+ C
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
4 d$ j$ e6 W. c d1 ?
" t' ?" `/ [' R; @# N fread ( &Temdata , 1, 1, fp_map);& ]" _% ]* k0 M5 ~
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;4 c# \- Y- _7 e- U* V4 _
0 L9 P( |& P& d- ]
fread ( &Temdata , 2, 1, fp_map);9 Q' S; q5 j, S# ^1 Z9 I* m
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;3 A V' |+ g) a( w
% \- |' ?; o% d: ~+ |; k* S fread ( &Temdata , 1, 1, fp_map);
) k/ u, O+ e$ h% z% P. m Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;7 a2 _$ M/ s8 k1 O: w0 i* Z- O
// 6个字节! H+ R) f3 v- x3 a
; Z3 Z6 M& p3 X `- o5 r% {$ \1 I
fread ( &Temdata , 1, 1, fp_map);
# K0 V/ E6 X7 ^; z Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;( Y1 Z& j* S1 R" C5 d5 ]- o
1 D% I& H, x5 ~! c' v0 `7 Q( N fread ( &Temdata , 1, 1, fp_map);# k* F/ o. }/ r/ O
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
, O4 i0 J4 B6 B4 ]
! |. H8 w: D* L5 b( Y //fseek ( fp_map,3,SEEK_CUR);
$ V. O% I8 @1 w0 h2 t5 x fread ( &Temdata , 1, 1, fp_map);
+ U6 c, l& Y8 E4 B8 R+ U Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;3 u9 `/ a. B& ~0 n* I" s' y
) V( V; b) U9 M% ^& l" m3 z7 a fread ( &Temdata , 2, 1, fp_map);3 M; L3 o# E# y1 y1 M' e
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
6 B7 b* T/ N2 e( H2 y
7 ~/ J$ Y* c" p0 G // 1个字节
6 l7 D* z2 Y+ A1 W: X fread ( &Temdata , 1, 1, fp_map); z4 I$ N2 _: A7 u+ _& A3 j
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
% p& ?! B. C3 b) _; z6 ]6 { //if (ftell(fp_map) > FilZize) return 0;( L# _1 ]$ ?1 P) I
}9 B+ P4 b2 H3 w5 Q& t& ]3 s
}/ T3 \1 u' t! _7 R* Q- |( F. U
}3 w" ]+ Q7 [+ Z
}" I9 {3 C) }" t! e1 O& v$ u" e
r5 G: i3 S# {) j4 m) U+ i. P
fclose(fp_map);# F* X2 [6 Q2 d& p! H3 y0 k2 q
7 O& R& _- C# p2 D5 \* ]) R
: O+ i7 U2 H! t return 1;
9 I: `6 r- c: X2 V}
7 \5 Q, n6 A; T3 i6 ?; }0 |, o |