*.map 文件是记载地图信息的文件。& B2 E0 n% z7 H+ z( A
, Q. L' r. W" @: |( _" k 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
# O2 Q) k5 L3 z% `. u& w, b( i4 [0 J7 o/ E) Q
第 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 地表一层的序号7 {0 o2 ~! F6 F9 U8 A
) J0 n. \7 M! n' V! W; J9 y# i* |
03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
, U: t) p5 {9 @$ A, }07 在地表二层 12 01 这个大序列下的子序列编号" U/ Y; i+ C7 d. M" F0 Z/ k( ~! M
86 物件层的大序列) k: D; O1 S: |3 U6 r
00 物件层的大序列下物件的子序列编号. C+ J, O/ d" V: {" g Q
03 03 00 目前不详4 H( ?) ~. Y7 {7 S! s4 o
01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
' l7 C4 U4 t8 n
8 a: V0 v G, z/ x7 x7 G9 n//************************************************************0 J6 z _1 Q& l+ ~
// 加载地图基本数据函数;0 ?2 [9 Z7 S |; h6 R. j
//************************************************************& F9 r+ h( g4 m
3 h8 f! `' b5 Z# C9 ?//************************************************************! t- r+ ?0 ]8 N' A5 i0 ?1 }) C
// 加载地图基本数据函数;
5 s- ~/ I9 O$ U* x# h/ M/ S. w9 q//************************************************************
. {* S! f0 }9 J/ I/ k) k! S+ _& {- p+ |! u3 E* Y
int Cmap: oaddata(char *filnam)+ \) _" L d5 z3 ~) `5 p) T
{
# p& i9 S. y# Z1 s# y/ v2 x4 R int Temdata;1 c& {/ O7 O+ u, k! \2 P5 d
`: I- C8 B- {) ^
if(filnam == "") return 0;0 I, H# l& k" c& h, f$ `, G0 W
, d" u4 {) {7 W2 J' v- U1 P fp_map = fopen(filnam,"rb");0 m5 g. O9 ?4 b/ l) ^ v, z7 i
" ~" m3 `( O m" R: ?
if(fp_map == NULL) return 0;; I( l1 h: `* R* H, B+ ^% `
& N) l* ?" m4 G+ v$ n
fseek ( fp_map, 16, SEEK_SET);0 ^6 v' f3 B) t0 c( K
fread ( &ShortWidth, 4, 1, fp_map);
0 ?, Q( @+ u' D1 s3 h" T4 G. w s fread ( &Width, 4, 1, fp_map);& R; q4 V- p9 V- }+ p
fread ( &Height, 4, 1, fp_map);
. N: M1 W0 A/ a5 v& G' d% G+ D0 ~; D1 ^5 s
int TW = Width / ShortWidth;
$ ~( k& G( T0 D Z0 v9 Q int TH = Height / ShortWidth;
P2 { Z ~# q. y5 W: T8 c
, i# B+ | v$ D6 @- S4 M$ _ for (int j = 0 ; j < Width ; j++)
" a4 q1 I! U+ q. C" q8 M9 d: k8 A {
* C2 l" o& Z3 { [5 @ _DELETE_ARRAY(Cell);& p/ y1 G/ \6 h- C* M
_DELETE_ARRAY(Role);: ^( e Q) a* N# A' D t3 o: x5 W
}# b* t# M! Y8 C# `
; S5 m, { U! Q/ A% a5 s" x
Cell = new stCell*[Width];
1 @, D4 L% r- w$ P8 |" L Role = new stRole*[Height];" q9 q8 ^+ P, Z# m e6 H6 A; R
for (j = 0 ; j < Width ; j++)
" S3 \9 j+ l. l3 x) c* h {# O" d. X% R$ m, H
Cell[j] = new stCell[Height];
6 W F4 J6 y! Q. ?! w Role[j] = new stRole[Height];
+ x1 i* P2 U' O* \2 L: c } 3 U) t6 m3 P/ h! I
: X) D7 l; A6 `' a
fseek ( fp_map, 28, SEEK_SET);
/ v$ X, [. K/ w b* _+ Y/ t" {4 y( M' t% h9 e
for (int y1 = 0; y1 < TH ; y1++)
& \9 w7 z, V2 l$ b {) F* `) ]6 _( R7 H, m7 W! ?4 r
for (int x1 = 0; x1 < TW ; x1++)
- B8 D3 Q5 r' ~( s R) C4 b3 v* Z {
7 _/ D3 e$ g) _& q fseek ( fp_map, 20, SEEK_CUR);7 v1 _4 K% L `
for (int y2 = 0; y2 < ShortWidth ; y2++)1 n3 Y6 m/ D$ h. V# |
{
2 D6 c& c, [- ~7 b1 _/ @+ D& | for (int x2 = 0; x2 < ShortWidth ; x2++)" |( x& x: x7 t K g
{
) {8 D( g+ R* j$ t$ C' g- M fread ( &Temdata , 2, 1, fp_map);
. X9 P4 q5 [! S8 d) Z; p% i7 q5 J Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
: C' e4 y {) f% F. O. b: p, ^. T8 s7 k' C$ _1 U) U
fread ( &Temdata , 1, 1, fp_map);
1 z6 s$ E" \. A1 l, R Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;7 o2 a P$ j, }+ H& T
2 i4 ^5 N2 B) R/ K# R: v' i4 p fread ( &Temdata , 2, 1, fp_map);
4 {" f6 M( G" M+ b Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
& i! ?, N8 Y$ \' p1 x
% r$ ?' b S+ o( Y fread ( &Temdata , 1, 1, fp_map);4 x+ P, f9 d! V0 N& t- N
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
. z+ n! b# L) a( I* ~& J! V // 6个字节7 M" Q( g- _! g1 o
6 d- h' R, J, r" \6 m b
fread ( &Temdata , 1, 1, fp_map);
) Z H/ X# ^" o a8 g3 ~% Y6 i Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;) B2 i" h! D* D1 m$ d
. U9 l- P4 F9 A0 L7 K) y fread ( &Temdata , 1, 1, fp_map);9 u, b( l6 w) N3 I
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;+ \9 |( o. z$ _
; ]7 N. [* _8 E _0 }2 F G. E
//fseek ( fp_map,3,SEEK_CUR);
/ z. j/ Y0 X0 |8 L fread ( &Temdata , 1, 1, fp_map);' P9 x9 d6 _4 g1 j5 `- R6 D& S4 n
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
, x1 g) z/ E. u) t# \
, J& d4 w' G7 f0 P0 a4 n, a fread ( &Temdata , 2, 1, fp_map);
/ S' Q/ Q- E5 _- q9 ?0 U; \ Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
( e9 n) d/ I/ A4 h; [$ H Z0 f% e r0 x0 p4 y ^8 W0 U
// 1个字节
6 l% T8 J0 s7 J. m, E8 t6 c fread ( &Temdata , 1, 1, fp_map); B* m* I( t% E4 ?2 W
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;! x( r) L/ _3 P* h
//if (ftell(fp_map) > FilZize) return 0;8 O7 {7 g3 a& r5 U8 O
}
: m) G$ _) D, ^# d; l5 C }
$ g9 u4 {8 `" p }# }" A" I- i8 ~6 Q
}7 S' y% d2 v0 ` k1 r% p
9 h5 y4 H& M) P+ P S$ D
fclose(fp_map);$ E9 B$ g1 Y7 |& y
8 X: S5 }3 A! C
9 c- F* C: d' _* d4 H1 M$ } return 1;
! n" y4 F. Y+ z/ _( M9 X6 s6 e}
: Q: |. n; `2 y. x0 o2 p |