*.map 文件是记载地图信息的文件。
4 K ^) L5 V; z! Q! M- }& R4 r& A8 z5 i( {% F
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
7 a* G7 y( ]8 S! |3 @' O2 Q/ l1 j2 l, ]/ X, j* t% 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 地表一层的序号
2 u1 \, R; z9 F2 u: l% S }1 l& l8 j/ U9 |$ b8 ~* V* ]3 E8 Q) ~
03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
) c' I' T( }; Q% V& _07 在地表二层 12 01 这个大序列下的子序列编号
4 s2 G& @* a' {' m$ a7 {; N% |86 物件层的大序列
# J# y3 B7 v9 {1 Z4 J! _+ i00 物件层的大序列下物件的子序列编号6 B" c- K$ G. o$ H0 G( ]6 d% a8 L
03 03 00 目前不详
8 C! b A+ Z q- C8 Q! v1 ~, B01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。, x. `2 Y+ k% L, d6 w
) P1 h3 H* N7 \2 c4 _* K# K
//************************************************************, N: `0 ], D; q/ u2 G- k
// 加载地图基本数据函数;
+ k) p/ n1 n6 a//************************************************************
$ e( D( Q) I3 E2 Y7 {1 {# g. S9 \& g2 N; Z7 G
//************************************************************" E: @" F! {6 {
// 加载地图基本数据函数;
/ i/ `( o% d" K! I4 c' G6 v//************************************************************6 I# O3 T/ ^% c0 U
5 y9 T' B- C* |( J! r
int Cmap: oaddata(char *filnam), z. B6 B3 c. y7 E% y
{9 G( e& I: f) ?9 ^- R6 a% R) ?
int Temdata;0 x6 N( s4 R5 D9 ~
% V i& v1 @8 \8 J
if(filnam == "") return 0;
5 Y' a4 U8 q/ Y& d5 E' J! R3 l
fp_map = fopen(filnam,"rb");
: J- R" t& {& @: N' V6 M; ~# F
4 F3 X* L& g R* p; [ if(fp_map == NULL) return 0;( q" L) p8 ~. J3 ?
- f# G! i0 m, U- M8 @* a fseek ( fp_map, 16, SEEK_SET);# c L9 K. ]" ?1 Q; x4 `" x
fread ( &ShortWidth, 4, 1, fp_map);
6 e5 y* Q( i$ F7 H8 v fread ( &Width, 4, 1, fp_map);
1 d7 {/ t# V# s* y% K# a fread ( &Height, 4, 1, fp_map);
! A( M. t/ v& N+ ?6 Y! d) d
! e6 o5 x0 l2 q0 e1 _; r4 h int TW = Width / ShortWidth;9 e1 ~5 ~6 V( s6 u
int TH = Height / ShortWidth;
5 D6 o$ q/ N. m# ?& l7 u( x1 `. p0 X0 c1 b3 |$ p9 B7 t9 e
for (int j = 0 ; j < Width ; j++)
: d' G( b( v# }6 J& @ {
/ C5 e" V w ?( C/ t9 {9 ^7 h _DELETE_ARRAY(Cell);
1 J6 y# c! [) e5 B/ B; G _DELETE_ARRAY(Role);/ I9 e; H; f1 N f
}% W D S' a! _- b) M3 H; b0 j
1 `$ A& [; N! P" x4 z- U
Cell = new stCell*[Width];
% q5 O* ~. C5 L8 Y/ H, G7 u Role = new stRole*[Height];4 b" r# |& t$ |7 e% H
for (j = 0 ; j < Width ; j++)4 ]9 p- U( ]$ _" T7 i) A# X
{
; N8 Z) ~* H& o# I* \7 e Cell[j] = new stCell[Height];+ L! i* M4 i6 s B* r1 d# [; J1 Z
Role[j] = new stRole[Height];
7 i5 e# y. z5 i+ i9 O }
7 [, r X6 v, ^5 x6 n# I& E+ W6 u2 e, O% w E G; \) K# u9 Z6 n F
fseek ( fp_map, 28, SEEK_SET);
( A7 U/ n' ~2 `( } I& r8 c8 m# u& S8 e" B
for (int y1 = 0; y1 < TH ; y1++)( c) O3 x: ], @" B! g. ^+ ^
{( M5 W8 }, n0 P0 ^! O+ K4 g- ]
for (int x1 = 0; x1 < TW ; x1++)6 [% {% b! E) T
{
3 x, F# s. q; E fseek ( fp_map, 20, SEEK_CUR);
9 z R" \4 K/ o for (int y2 = 0; y2 < ShortWidth ; y2++)
( A; u' g( J& a8 a: s {5 }* v+ |1 F2 j9 B/ W! n: A
for (int x2 = 0; x2 < ShortWidth ; x2++)0 J: C9 @. e0 N) W1 B+ J" a
{% A! o' [) g- R- k/ h4 ~/ H# k
fread ( &Temdata , 2, 1, fp_map);
$ Z" i5 `7 g2 v Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
' U5 z6 h4 `# u3 o1 [
! n5 P; w# K! f: b2 @7 ?7 M b/ L fread ( &Temdata , 1, 1, fp_map);0 F; A) I8 w% ?6 [: y J- c8 `
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
9 k; E A# j1 s3 K9 H* K2 A% V* e2 s5 N7 k
fread ( &Temdata , 2, 1, fp_map);! J9 N3 s$ `6 w7 A" j
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;; b" u3 v6 K7 _5 ?9 U/ ]
* s" M6 k/ ]4 F. m4 H. Q7 m fread ( &Temdata , 1, 1, fp_map);. i( E4 L) O# N8 ?# R
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;* S2 s9 F5 q: m# Q3 K! W
// 6个字节3 k" V+ j: W; k1 Y2 m
* ~- L6 W% i: g1 i2 e fread ( &Temdata , 1, 1, fp_map);
$ r* ~( J0 E1 X4 f Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;/ L/ u0 }; h+ }* q7 A( S* p
6 O' g1 a" o0 A- ]/ X fread ( &Temdata , 1, 1, fp_map);
7 q/ D& w$ N. Z* a1 \% i Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;& b) H# B: a4 _6 l
- R4 \8 l, S t3 I! Z3 Y# l% ? //fseek ( fp_map,3,SEEK_CUR);
1 B6 t2 D" d: b5 o' A fread ( &Temdata , 1, 1, fp_map);
) Q2 W, y' ?$ Z3 R Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
7 N7 F* E6 D! [( Z0 W2 {
9 q6 ]! W. H; j+ q8 P; e x. W, ` fread ( &Temdata , 2, 1, fp_map);$ q' U* h) A' U6 w
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;1 d2 m2 o& i5 u
2 H W# Q! A4 u- r$ c // 1个字节
# a d' i' J7 A+ `8 L& W" {5 k( j fread ( &Temdata , 1, 1, fp_map);& h( J6 S; b- J" x' r
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;2 W4 I! |6 @: L! f' I
//if (ftell(fp_map) > FilZize) return 0;5 _( I& _8 Z T8 c; E. l
}9 n5 T4 b, W1 o5 Z
}1 l* Z8 e, j' m# O& w% v6 x5 H
}
& T$ u9 H7 @6 |; G" k2 s }
! t* I* Q3 ^6 `. ]6 q' ]6 L F" k' m% n2 {" H
fclose(fp_map);" l' q3 H; j( q( |( I W: q6 {- M
1 T$ B9 z4 Z7 L: J- U1 D. A9 R6 {, h3 ~2 X5 P V& J
return 1;
- I' `8 _; |. q3 l" N1 q} , ]. D( Z9 H0 s
|