*.map
文件是记载地图信息的文件。+ X$ U9 E6 i' N; r2 S
' x* b7 p! c5 r; `
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
: ^% z( w. S' c* }# A" B# @# p
4 g- p/ z# A1 ` g8 \ 第 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 地表一层的序号
5 K9 w9 d8 w" s; b
- K& `; t1 r Y$ g. s, C2 D03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号 f6 ~( h$ D# A1 t1 I4 w8 V9 Z
07
在地表二层 12 01 这个大序列下的子序列编号$ V! A) U/ R% {5 z2 o, ]
86
物件层的大序列) E) W8 O& }' y/ ~1 X4 y1 d) ]2 q
00
物件层的大序列下物件的子序列编号- v" S P, l$ H
03 03 00
目前不详
: N$ b) @, j" M. f# s, ^( @01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
4 ~' q, J" ]. k, J, v
7 H3 K( o; G( N5 |4 A3 ~ y//************************************************************
5 m$ @/ V& B B' [1 W; J7 [/ i+ k1 u//
加载地图基本数据函数;. i" @/ i$ N& F/ ]4 d8 s- x$ E
//************************************************************
% U& t9 X" | { V, C( S" E9 A
" F: N5 _0 L5 G8 S* J L//************************************************************
3 Q! b, q% C0 k. a//
加载地图基本数据函数;
0 `- {2 y ]% B2 [4 H6 I. r4 P//************************************************************
, v [. k9 M [. B0 p# a [
# g* Y/ {# C7 }. f0 A( |. |int Cmap:

oaddata(char *filnam)
4 R( @( J! _% J) ?
{
6 X& l% ~% T, [1 \. e! i
int Temdata;
3 F+ |$ F) ?1 x' l" ^* g& f7 w( T
4 M( u7 W% G; h- x5 f/ g
if(filnam == "") return 0;
( D7 V- I& ?9 i9 v( b4 z
+ ^: ^% ] U0 I. D0 X fp_map = fopen(filnam,"rb");
/ W6 y5 I' u# R6 ]7 X9 Z
0 j7 Q) [! X; B. @4 h& o# `# y7 v if(fp_map == NULL) return 0;
4 i3 J2 L1 Y% ?) @- ?$ V
, H+ [+ @7 j0 H+ u+ X! u fseek ( fp_map, 16, SEEK_SET);
6 s6 I# I+ t$ f: j# D3 L8 d- F& o
fread ( &ShortWidth, 4, 1, fp_map);
D) m: v0 [% |1 f7 p fread ( &Width, 4, 1, fp_map);
' x9 u- q/ r- ^9 \ C6 D* k& c fread ( &Height, 4, 1, fp_map);
/ d, p! U2 u8 X% \; U
. q4 L2 ^: V- Q0 H
int TW = Width / ShortWidth;
- t$ @) u) J) s$ P$ }; [ int TH = Height / ShortWidth;
/ Q( T2 \6 L2 i5 W i. g7 s( X3 q- U* ?$ K$ S+ d. I
for (int j = 0 ; j < Width ; j++)
& H2 O& P) |. x {
+ \! F) G8 j# ]) P) i% g
_DELETE_ARRAY(Cell);
7 @1 \0 ?9 y: S _DELETE_ARRAY(Role);
; C& a S- ?. r p3 _. f }
- S& R" r$ x! U0 |+ O r
+ D0 R/ \: X& D1 ~ Cell = new stCell*[Width];
* ]+ v7 v/ B3 S
Role = new stRole*[Height];
4 `5 D+ K2 P8 S
for (j = 0 ; j < Width ; j++)
. g5 l+ t9 ^7 [( s6 x {
; G5 f0 g, v! J1 k# l/ n
Cell[j] = new stCell[Height];
# m K8 o1 E V" b; k! x; v# @ Role[j] = new stRole[Height];
, }0 }- n4 L/ V! s$ x0 E }
( v* ~; t6 h' b2 Z/ d
1 r, s3 y* s1 f' Y fseek ( fp_map, 28, SEEK_SET);
6 }0 M, s2 @: B7 T' c0 I3 H
* \! Z3 z6 B( q6 X; q) ~
for (int y1 = 0; y1 < TH ; y1++)
$ h' L2 v3 k, M: e1 [8 X* C
{
) }7 b: P! i, `4 S. x
for (int x1 = 0; x1 < TW ; x1++)
# ?( P: c F- S9 U: h/ | {
1 r7 g! t1 M" ?+ T: g0 I/ h fseek ( fp_map, 20, SEEK_CUR);
/ y$ q# U8 ]- N5 j( Q7 B) d6 P for (int y2 = 0; y2 < ShortWidth ; y2++)
9 S3 P( F. l | {
1 {1 O& M8 o o3 h' N) E for (int x2 = 0; x2 < ShortWidth ; x2++)
: Q0 d0 d% d) S, b t) J {
. s( p3 n1 ^/ W$ O& a& k
fread ( &Temdata , 2, 1, fp_map);
( ?) k7 m' T/ m
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
a6 a' Q, Y7 S) }2 f+ O" V
7 Y- H; g B+ H, ^- ^ fread ( &Temdata , 1, 1, fp_map);
4 t" e" h$ E* I9 H& |" @8 S Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
. q7 j# m( Z/ ^0 k6 q% v3 b# b
$ ]: `, U8 ]. p, l% R7 ~
fread ( &Temdata , 2, 1, fp_map);
' M# X. Y* w7 ~) h0 k q
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
: k$ H; ^4 K. A& I
3 N9 k% {( j! M D6 {$ y
fread ( &Temdata , 1, 1, fp_map);
, f' E8 k. t- E5 ]; i- s
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
6 N4 u4 v5 F7 M: {. c6 N // 6
个字节
4 t6 C% v( u) \1 f$ N
& C' V# ?3 p" F" {( q" k fread ( &Temdata , 1, 1, fp_map);
7 h5 V; ?$ ]/ [% t( Q4 t Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
2 {) c& \) S7 s, x& p
' j. }+ o* w$ w" ^/ K* u* g; { fread ( &Temdata , 1, 1, fp_map);
3 \( r- H. v' {- M* D$ ]" F& d, A Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
B( b4 B% B$ `/ H5 a; `- R
4 k+ S( ^4 w# k3 B& k L //fseek ( fp_map,3,SEEK_CUR);
) b. m2 h' b7 \2 a# m& z' G& Q
fread ( &Temdata , 1, 1, fp_map);
0 X' c0 j; Y5 h' R
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
6 c( `4 |0 ]1 w# [! ]% V $ ^; [0 x& ?4 \8 Y* H% {1 b
fread ( &Temdata , 2, 1, fp_map);
: y! H o+ ?; w" ~' v4 r Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
: ]6 j- t1 }- E* l# I0 d% y
; @ y. Y/ x& T // 1
个字节2 {' s5 Z8 S, E
fread ( &Temdata , 1, 1, fp_map);
% K4 Z) }. d0 `- T. Z' d
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
+ I. _: G3 B0 S
//if (ftell(fp_map) > FilZize) return 0;
8 T& H4 E/ A m; l9 F) J; n# G
}
/ t) a8 w9 Q5 } s! L }
3 y: i: K8 H3 j6 T. @) K }
8 n) o+ k' X- w3 K( l }
) _/ t; d- h7 [* ^0 D9 c. h2 \: x$ R
4 T! f; j; {1 V* O- l: i fclose(fp_map);
$ s! }8 K: i% u/ X( {) ]( O
, k# b0 W5 p( B: p" J$ r
( m( @$ o X% U( }( z h return 1;
( d, D; S6 ~) U, u) b}