*.map 文件是记载地图信息的文件。; L) |4 ~) q1 y! I
% G5 I& r; B( ]+ ?+ _: H2 p$ h 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
9 N/ ]6 ~" w1 Z, }' ~
7 G) C; ^% |6 u7 j! E4 f9 _% b8 J. y 第 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 a, A a& ]8 E% F: V
5 D3 w9 F6 H! X3 P4 _5 X03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
% x" p6 _, V$ x07 在地表二层 12 01 这个大序列下的子序列编号
* @* P0 i' c3 |" C- _5 T9 t6 H, Y" \86 物件层的大序列/ C7 H# }# H" b! S* r
00 物件层的大序列下物件的子序列编号
4 r; C5 t6 ] g7 _( p- k/ G- r+ Q03 03 00 目前不详
3 A3 Y# d9 g% H8 X& h7 ~0 L01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。8 g6 l j: [3 d z4 V8 @
, a. l) k B; J2 y$ g6 K//************************************************************
+ A4 c) z5 Z1 t" X6 H4 n// 加载地图基本数据函数;
5 |" U. k7 X3 ~( \% W+ J2 R+ }//************************************************************" Z2 K* [6 x6 n7 W
# X: V# V; V9 R' W//************************************************************! S5 R( i% n, S! i
// 加载地图基本数据函数;
3 U& m5 B& k9 n8 Z% L//************************************************************/ H% B; Q& a! k) C9 U9 I/ T2 d4 T7 x4 n
( N2 T1 Y5 P) B# `int Cmap: oaddata(char *filnam)
' L v! Y7 }7 T/ a{$ N. t5 Z6 X, l3 M* W# i# A
int Temdata;1 d/ _! s* I7 V( L6 d
7 h" d; v0 f# q+ ~$ Y# P' v if(filnam == "") return 0;
2 a. C6 k" _$ K! L0 _0 i0 k
$ ~0 Y8 x0 L( a9 |+ }- p9 M fp_map = fopen(filnam,"rb");
W1 K% X3 f+ p- z; T* R* M
8 w0 @( a* w5 T8 o+ s' F( S if(fp_map == NULL) return 0;, U- F0 ^1 o- m8 u. ]/ z0 ^
( Z& D+ ?3 V6 |! A3 d* C4 _7 F& ]
fseek ( fp_map, 16, SEEK_SET);6 a9 M( Q" t( W+ E5 v
fread ( &ShortWidth, 4, 1, fp_map);
, y! m+ h+ S5 C) P$ H) x7 U& N0 K fread ( &Width, 4, 1, fp_map);
W8 l5 i3 `$ `% } fread ( &Height, 4, 1, fp_map);& x9 t/ ^; K6 q$ n$ x t
3 C1 q/ h+ o" K/ o/ e# [( `& d& b( F" H
int TW = Width / ShortWidth;! }+ O+ N4 n" o
int TH = Height / ShortWidth;
" {0 C/ K& O% W) j2 p9 @: B/ e) C$ ]) [) D& \) d
for (int j = 0 ; j < Width ; j++)
, z/ i- B Y* _ {
0 e! c& z, A i2 L _DELETE_ARRAY(Cell);
9 o5 U1 r5 b3 g; y _DELETE_ARRAY(Role);2 n6 a2 S- v. _) L
}3 C& @, F$ |' }9 B* u
1 M5 ]! w& B, m/ C Cell = new stCell*[Width];
% Z6 w/ {. R |" O( T3 R0 y Role = new stRole*[Height];
5 }1 N5 ^9 F4 _" w$ i for (j = 0 ; j < Width ; j++)5 J" L' J/ I4 {
{
+ T+ K" V( B7 c( [0 w. k Cell[j] = new stCell[Height];
8 u; D1 E u/ W' ^4 T5 u# P4 E Role[j] = new stRole[Height]; 9 W) f* B& k7 s3 `0 r0 K
} 8 S4 S. F! i6 A t9 V# ?: w8 J
z) s! ~2 h7 Q! p fseek ( fp_map, 28, SEEK_SET);* Z% y) o" n7 R; }' `+ L( ~
7 J5 P- J! X3 r
for (int y1 = 0; y1 < TH ; y1++)( m- T2 i: G9 V9 ] _5 [& G4 f
{; {, j' J! U5 ]
for (int x1 = 0; x1 < TW ; x1++)
6 Q. c& K* G2 b, b0 V5 w8 F$ [ {! m) c& @% X0 A B: ?; k; ?- W
fseek ( fp_map, 20, SEEK_CUR);
7 P0 I! r6 V; Z* q for (int y2 = 0; y2 < ShortWidth ; y2++). v* O4 u: C. L/ [+ H; S! M6 f
{* T7 l$ b$ G3 |
for (int x2 = 0; x2 < ShortWidth ; x2++)0 ~/ q, \3 v, G {7 Q" U
{
7 M5 B# X+ i! c1 T! D fread ( &Temdata , 2, 1, fp_map);
4 c: l5 v8 ?# v& B# K# }1 ^$ [ Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;/ B, ]7 [7 D6 G! u' R8 d# g2 t2 p' V
; h9 I2 z; T" r* [) e" F2 O2 [
fread ( &Temdata , 1, 1, fp_map);# j0 l! e+ @5 z' x0 ]4 J
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
3 m' I3 N8 b2 k; N# o: u! c7 ?8 P8 B0 w
fread ( &Temdata , 2, 1, fp_map);' |" B0 J! T; u) j, ~
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
7 k8 _/ W2 R$ D" R8 ?4 R; O0 J4 {# t( l: v; _
fread ( &Temdata , 1, 1, fp_map); i* j+ Y4 g8 @# u' l- h, o
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
( B0 R; ^& V3 S: i // 6个字节
8 t+ P6 r; w) d. D, z
; e' @+ N0 ~9 x _/ {; r$ N1 N+ S( _ fread ( &Temdata , 1, 1, fp_map);
0 v6 j# F. Z% g2 Z4 ? Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;" [: Z3 p5 |% \2 o! F" l1 z
# l9 w6 q( m+ s+ E$ n
fread ( &Temdata , 1, 1, fp_map);; K! T3 ^" W, Z0 j
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
8 _0 O2 l3 q1 L6 j# |0 K; b& s# y; z" }
//fseek ( fp_map,3,SEEK_CUR);
2 e( x" u- O8 X# R0 D, o fread ( &Temdata , 1, 1, fp_map);
1 F( o. X. T& Y, e0 I' ~ Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;5 b; Y' R3 g- s$ n {
5 O8 c! o& U* T* A' | fread ( &Temdata , 2, 1, fp_map);
. \- D6 j3 A" C' }8 R# V$ K Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;" r, L% K7 c9 Q8 L1 @
/ \% E* v1 ~4 x; v6 _
// 1个字节2 n% X8 C+ B) P" _& d% j! b. |
fread ( &Temdata , 1, 1, fp_map);5 S( c8 O8 p; @4 A$ S
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
2 T; m- R5 j, S3 I' C p9 c) R //if (ftell(fp_map) > FilZize) return 0;
/ e; B r. l/ X) X4 F8 A }
1 \6 n. \; Q1 V ^ }
c1 f' P$ i% R0 @- u }
# D3 F+ Q. L7 W/ m2 Y% s* _ }8 O; l D4 Y8 l; i" v- I( D
# n5 Q! J# w) X7 a( O7 I
fclose(fp_map);. _( C) M+ w1 c% ]; n
4 Z! Y. C* x2 q/ ?6 x
3 {) g! e2 {5 j) ? return 1;0 d! A# R$ \1 x8 X X- A/ C
}
' n2 U& @/ ~- N( c: @ |