*.map
文件是记载地图信息的文件。 u: k3 J$ Q$ t, [& c# J9 \2 |
2 W, M' h! \( r$ \: X& b
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。+ t" w7 X% x' ?2 [
+ A; z9 T- Z3 Z+ B, p$ p4 M
第 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 地表一层的序号* I, b% _1 U' k; |7 |
6 y, X5 G) N) P: I0 o# c) @03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
, v: r& C& o9 D07
在地表二层 12 01 这个大序列下的子序列编号
$ h' K1 h2 x: U p& X0 m86
物件层的大序列5 R$ s3 s8 q/ o+ x$ \' Y
00
物件层的大序列下物件的子序列编号. ~3 z, u8 H# N5 ^/ F( Q
03 03 00
目前不详
/ K2 l# b x/ m7 p; i7 w, O0 I01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
) y! g s* x* q) l: G$ a( B4 E4 ^& m" V/ d M
//************************************************************
9 a# A: c5 x; ]7 ?( c- o//
加载地图基本数据函数;
0 a7 e7 h* Y# `% \) l//************************************************************
0 b+ P5 m. p7 j/ i" ?, ^ p
k, V+ U7 n, d) f* V//************************************************************
, h' M7 {6 g9 L4 M//
加载地图基本数据函数;
5 Y0 P! U j. u9 @& _//************************************************************
/ b7 J! [' h9 ^
$ N3 S# s) k1 @0 f
int Cmap:

oaddata(char *filnam)
0 V1 S/ _( w. K% S$ Z. r3 t
{
* G5 P9 k. P# r# ~4 t3 Z) q
int Temdata;
. i* n9 J) ^4 t4 T- i
/ g/ K5 b4 B! l4 L* J
if(filnam == "") return 0;
8 D" ~* z& B! Y3 M& I
% u9 _/ o& ]9 D. s: M0 C fp_map = fopen(filnam,"rb");
2 D# i* [8 M( M( i2 E5 H* Q7 K
; j0 I }; L: R7 j& ]1 b/ @1 I if(fp_map == NULL) return 0;
/ \5 e9 K$ o* h. x- P
2 ?! R1 a& o# I" W0 I fseek ( fp_map, 16, SEEK_SET);
) [7 O, X7 ^2 P! g2 Z9 w fread ( &ShortWidth, 4, 1, fp_map);
3 A5 S" W' q7 A' ]& j# b fread ( &Width, 4, 1, fp_map);
9 }1 k" b( m, Y4 m+ a fread ( &Height, 4, 1, fp_map);
" a9 {3 R/ y5 W4 n6 L8 G% ]
# c4 I8 b, o5 g: f5 _9 C8 i7 ^2 V7 V
int TW = Width / ShortWidth;
4 X# x& Y/ b9 Z/ F. d4 o- {% B int TH = Height / ShortWidth;
! V" n" c; z L# ^7 w1 O9 J; h& O+ @6 i* O8 O2 T; X
for (int j = 0 ; j < Width ; j++)
' `' g. F3 q+ {# U! @0 t$ q+ _) N {
8 s+ f/ m$ |- a% v3 ~# G1 o4 ?/ ~. z
_DELETE_ARRAY(Cell);
/ c2 J: _3 Y" i' o _DELETE_ARRAY(Role);
" B. ], V: q/ j; X }
4 L* Q, Z$ \0 T+ F8 }; r8 A1 \/ H2 A
( Q# P5 c7 i2 D$ i# K! B8 N* T
Cell = new stCell*[Width];
: c2 Y3 d" ^, I$ a Role = new stRole*[Height];
0 m. s. V" C3 ^3 c! h" a
for (j = 0 ; j < Width ; j++)
9 D' p- X( z7 E6 ?( q {
, j2 L8 Z; r2 y& S: q9 B8 {/ I7 y Cell[j] = new stCell[Height];
! V% @+ W5 \% `5 E c; \$ v Role[j] = new stRole[Height];
' f+ ]4 H7 w# A- t }
. w+ g+ K8 f$ m/ S- m. D
* ?, O+ J. A% k fseek ( fp_map, 28, SEEK_SET);
3 I6 f3 u7 t9 ?& p& V- x
( J% n: R0 e6 c1 t% ^: d+ d
for (int y1 = 0; y1 < TH ; y1++)
+ ~; A W3 l% d {
+ Y. [0 ^' m# ]7 f3 Q) d for (int x1 = 0; x1 < TW ; x1++)
: l$ B8 s9 }; t( W) f6 A
{
: K: V7 n$ m! ]$ f2 }
fseek ( fp_map, 20, SEEK_CUR);
* }" |& c% m% @ w( ~0 b- {, {9 b
for (int y2 = 0; y2 < ShortWidth ; y2++)
m" V( I' n( a9 L {
+ G) T2 S% E: K- N. h$ b! c
for (int x2 = 0; x2 < ShortWidth ; x2++)
( V6 D9 z5 L+ |3 H d- \
{
% _' Z3 W! W a- f% s$ H fread ( &Temdata , 2, 1, fp_map);
: J' @9 B3 q8 j5 Y I! n' ^! @ Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
+ S1 c9 h& E5 _7 d( S
, ^2 I; m9 q2 P0 p0 u7 B( Y
fread ( &Temdata , 1, 1, fp_map);
9 z, Z) q$ t$ S- o0 G8 ^* L
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
; E! F! A% E0 V- w( D
* v/ }8 a7 v# |# H fread ( &Temdata , 2, 1, fp_map);
- h; B9 m$ s- E3 r
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
8 b2 m0 f G5 Q- K/ S
& e9 d D6 Q% x6 j+ O" ?
fread ( &Temdata , 1, 1, fp_map);
9 X9 r0 x' g) t1 @! T; B Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
' r6 A8 N& L5 R3 v5 d // 6
个字节" b/ [* M( \& m2 w( J' z
1 A/ i, b! @0 X6 u
fread ( &Temdata , 1, 1, fp_map);
) ]5 k9 |9 h4 ?1 [! U( H2 ]
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
3 `4 z6 |! t6 `. l7 C; n
0 ^ b. z. C" W2 ?; |
fread ( &Temdata , 1, 1, fp_map);
f4 Y+ T8 c) s
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
' }$ q" n, x6 H! b5 R/ x/ [
- U6 P" q( [& z" |4 ` //fseek ( fp_map,3,SEEK_CUR);
4 P* s6 g: M2 B fread ( &Temdata , 1, 1, fp_map);
# ~7 g6 ]( k( O [* E$ F7 x/ ? Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
- }# |! s! ^. t+ n1 n! s2 l
; y$ r- L2 {5 o# v; w" d fread ( &Temdata , 2, 1, fp_map);
& G1 }3 e! x4 A6 S' ^" m: M
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
5 G) @, ~- h0 m2 A+ w c# H, X+ X; Z+ t& T& @+ J# w1 [/ g
// 1
个字节
: {* c- W9 s( U% _! U fread ( &Temdata , 1, 1, fp_map);
* d- X3 h% h1 {: [. X' z) d5 v
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
e! |; m+ ~$ R% u: J
//if (ftell(fp_map) > FilZize) return 0;
( I$ a q' p& E `( b
}
: b0 j+ y. x& ^& |& m- j }
- b7 ^- N3 m- c- f4 }- J }
/ ?; C: q' P# D0 Q+ G4 [ }
7 Y# I' L; b# a6 r' O% ^" D
+ ^, U$ |; u$ C1 n: Y fclose(fp_map);
* c; w5 ], E* P
+ m" o: L$ R) C4 G; b2 v% H
) a% T( X. r2 E9 M3 c: c: n D* `
return 1;
; z8 k: C0 C9 r' P% c% Y
}