*.map
文件是记载地图信息的文件。- _1 y ], o; D* l: ^3 y. i
+ y2 G9 X9 i6 n4 T# R) ^/ Y 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
, l2 |/ r% n7 Y. m5 X1 f3 I: i, m/ d6 C
第 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 地表一层的序号
; t1 P! Q; e; J+ E6 `* T/ Y% m. ~: @, t) L8 l
03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
3 ]2 ~5 }/ J6 J9 b5 F& S, D6 G07
在地表二层 12 01 这个大序列下的子序列编号" I8 d* ^6 Q4 a( x% G
86
物件层的大序列
: Z1 a1 t1 C3 p1 `. `, k' N00
物件层的大序列下物件的子序列编号" y* F' q/ ]4 o0 A
03 03 00
目前不详, z. W3 l# l3 i5 b
01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。: t8 q7 M5 s( q% `
' S4 W6 X( |9 l+ M* r( U
//************************************************************
( r2 N) ?1 X2 x& B! B
//
加载地图基本数据函数;
/ o; M5 l- u, l: Y; S//************************************************************
- _7 H# k. O. M$ v+ t7 b {" B' z( w6 J, Y" @/ X, e
//************************************************************
+ z- ]1 r( W s
//
加载地图基本数据函数;
; c$ w' x. o8 ~2 w6 j R* o//************************************************************
! z. Y' C( i. F& m8 b
& X8 b8 X F' O3 [- c, [& w3 }int Cmap:

oaddata(char *filnam)
; D+ E: V" Y5 W{
" @4 z- }6 I. n! c( m7 w; L int Temdata;
# N+ @ V8 B* `2 {$ I6 G# I
# _) ~$ R6 ]' M if(filnam == "") return 0;
8 ^( \4 I x6 U+ W5 s% r
; i) b4 d! ~) W& d! a5 y fp_map = fopen(filnam,"rb");
" A. z' P6 v8 A/ n) d- W
# \; B6 W: B9 T' D: {8 m if(fp_map == NULL) return 0;
) G" k# n, v7 i. |9 \: `+ i
, ^8 J- p/ w. ?! |# @2 |! U fseek ( fp_map, 16, SEEK_SET);
9 I# V; o, U8 j0 D6 Z% A
fread ( &ShortWidth, 4, 1, fp_map);
5 Z" |% x" P. ]" y
fread ( &Width, 4, 1, fp_map);
6 A* U- w# k! k& y! `* ?, A4 ^6 N
fread ( &Height, 4, 1, fp_map);
' H$ @2 U; n* w( g; b6 M6 U
* [, m1 o2 O: F' s, B, c/ o7 g int TW = Width / ShortWidth;
% N2 u" V# [2 ~6 q; q+ l/ I' ^" T int TH = Height / ShortWidth;
+ R/ I! Z( h& X! q& ~, h3 v' ` a8 M6 a
for (int j = 0 ; j < Width ; j++)
) P& o7 H$ V4 j
{
: {7 f5 m( F3 `9 h; J! A _DELETE_ARRAY(Cell);
; I A) j" \4 Q; b* |! e" E7 M# J, O
_DELETE_ARRAY(Role);
7 z, s3 z* a: ]! R; D, k, O
}
) y5 g! l- Q3 [
/ ^% N& `9 N- h. |+ ^ Cell = new stCell*[Width];
0 K N- O+ @- _( `9 u
Role = new stRole*[Height];
* V6 D! S6 W7 B
for (j = 0 ; j < Width ; j++)
9 w* @6 q8 |4 W3 |3 R, w1 J9 u
{
" Y- `8 B+ G5 Q# c5 O0 V6 P
Cell[j] = new stCell[Height];
; f4 Q1 P! s9 y
Role[j] = new stRole[Height];
2 l c: [4 ^3 e }
4 y1 L6 N6 U; m0 |
- X. V3 r/ w: O5 M: S7 t
fseek ( fp_map, 28, SEEK_SET);
1 R" m: {; `! o$ j6 c
7 ?) R/ v3 u3 Y3 S for (int y1 = 0; y1 < TH ; y1++)
4 J$ p3 B$ l, X) {& J( s/ i2 K {
: V; E( n1 K, h, Y# A- p
for (int x1 = 0; x1 < TW ; x1++)
/ P) e4 U. F+ N0 x
{
& y+ d, Y, f3 c, h6 N; H; o- x
fseek ( fp_map, 20, SEEK_CUR);
) P- F: M% e, ]6 f, `5 [4 U3 g
for (int y2 = 0; y2 < ShortWidth ; y2++)
5 {. Q# r9 a [ {
: U% j7 e* i; x7 H) o$ l! O
for (int x2 = 0; x2 < ShortWidth ; x2++)
' u9 [& o" q9 _" n
{
5 `5 O5 r& L5 C fread ( &Temdata , 2, 1, fp_map);
, `$ J% J& z2 Y: @ q
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
# f* c _9 n- Q8 u) C S- K
3 D4 \/ ]* p3 m2 Q% \4 d* Y8 b
fread ( &Temdata , 1, 1, fp_map);
! Z8 z8 l; p5 U6 W4 d z' G Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
* x# Q# ^4 m( W4 Q* ^$ e( h6 q7 E' S6 e5 u- W1 w
fread ( &Temdata , 2, 1, fp_map);
; ?! e- K2 M9 L% j( s( z+ a
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
- C3 w1 q h! Y) b% h
: M {( @" x: ]0 Y9 N
fread ( &Temdata , 1, 1, fp_map);
. O: i, m o/ g6 w Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
: t# c" M9 ?0 R$ K" p3 [. ?" s
// 6
个字节' j: A& Z/ g( I1 @) |
1 b( l! f9 a: C- ?* p6 l0 X
fread ( &Temdata , 1, 1, fp_map);
7 r" L9 T, @! N; }" C! U Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
) d( c% G3 f0 {% F7 ~5 ^1 Y
* E; Y k5 U: ^% l5 n; a7 S fread ( &Temdata , 1, 1, fp_map);
+ t5 S: ?8 w# x* m Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
/ W( z: D" U9 ?5 K( H P/ S8 l
! |1 n; d, x- V
//fseek ( fp_map,3,SEEK_CUR);
6 u7 T( k' b* t3 _/ }8 b
fread ( &Temdata , 1, 1, fp_map);
3 n& L1 ^7 V' Z
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
9 s: }' }* i# ^, j9 s/ o& N& E
6 p: b. l* e( r9 V* o! ? fread ( &Temdata , 2, 1, fp_map);
2 N3 O7 D& X9 o/ ]8 B/ e Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
- G8 S ?2 |! E, y2 X o( F2 y
3 R/ C { c, O2 _ // 1
个字节
1 y: Z! u+ A& U+ Y0 A4 b fread ( &Temdata , 1, 1, fp_map);
4 E* z% c0 O1 Y; W F- ^: u Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
3 q& U5 D, _, l! W, f //if (ftell(fp_map) > FilZize) return 0;
& D/ F# u4 F$ _ }
5 y+ R- D/ Y( W! b }
7 J% O2 C) r; O; e+ g! N2 M
}
6 M* [% b. b3 m9 E
}
& m% K, ?5 O# t x4 ]: U* @/ Z+ @( k- o+ n; b! L3 Y4 o% z G6 u( Y
fclose(fp_map);
. w6 N7 \1 k! @0 A% f
. z9 N9 g- j# f/ p- e
$ z L% J$ L3 J5 o6 `+ n return 1;
% D& Z; @6 L3 f) ~}