*.map
文件是记载地图信息的文件。
3 x5 J W9 s, p( U
4 e6 [% x' A$ S 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。, l! \8 C" O# M! S
f: f. S' N) B! ?2 w% w 第 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 地表一层的序号$ F& |( A0 y+ o+ A
2 a' R' c' H3 E. [- A' ?: H$ e. A, ?
03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
# `0 d/ B( X5 n3 f6 O% c( W07
在地表二层 12 01 这个大序列下的子序列编号
# C9 i: ]+ {3 z% C5 b1 z86
物件层的大序列9 J5 }: ?) D) O8 H9 K$ y' n
00
物件层的大序列下物件的子序列编号
( u6 u" j, A' z# d. d' h1 j03 03 00
目前不详: g8 n" @% s3 B: \) o& l
01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。; f I% o4 ~- n7 s% |, o5 Z" b
& }1 i1 X4 A0 c" A! }$ p//************************************************************
" A% K1 ^3 J, R9 L6 X7 w- h4 j//
加载地图基本数据函数;$ p6 s) l0 r6 ^
//************************************************************
6 I) _; ]$ R. w2 R$ I
; u7 ?- u4 Y4 [1 q9 F//************************************************************
6 @) h$ b9 d) ~3 N
//
加载地图基本数据函数;
8 Z1 @! u" o; \* [) X8 h! K3 m+ D//************************************************************
2 m: v; S7 C$ t; s* W3 R# \# B
# d, j+ V4 w, l- K4 Sint Cmap:
oaddata(char *filnam)
3 G# c' N/ M1 s7 H' P4 U1 R( b
{
$ q! O0 Y. a$ i" o/ K# ^. M6 p# Z
int Temdata;
I" }8 Y: S; ]% f+ H- U. G$ e: ]% r1 `
" ^1 |7 g: V' q/ e+ @' _ if(filnam == "") return 0;
9 K8 k0 |- c2 E- G
1 M9 ^. j5 [* X fp_map = fopen(filnam,"rb");
2 M& f/ v/ a* o6 b$ G$ j4 x! A" N% F1 x
if(fp_map == NULL) return 0;
8 l6 Z" T: g% H* c9 j
( |/ r" b& H! t0 t# a fseek ( fp_map, 16, SEEK_SET);
+ q$ a+ `' q9 l, M6 e- z8 i fread ( &ShortWidth, 4, 1, fp_map);
+ c0 g- X4 x: }+ a1 b
fread ( &Width, 4, 1, fp_map);
. U! w" c' y1 b/ s8 }4 ? fread ( &Height, 4, 1, fp_map);
6 e/ B9 l+ p" [: }6 C4 t2 m) ]# p2 Y! H" S! `# J9 x
int TW = Width / ShortWidth;
+ D- G- K/ T- P; @ int TH = Height / ShortWidth;
5 ^3 l! A _$ {. \) C% V
% e6 k4 h7 a! _$ |; @ for (int j = 0 ; j < Width ; j++)
# v( Y2 g. `$ p9 m, l! o
{
Q2 E( j/ X; `# n _DELETE_ARRAY(Cell);
1 h4 R9 N$ U2 [0 l8 U _DELETE_ARRAY(Role);
. j) W" o& a- I: j. ?+ J) x/ G
}
- B" ~0 m8 \9 p: w |5 m* E1 i! d( y) j1 {1 y1 J5 f" Z
Cell = new stCell*[Width];
, [8 |! f# F# y* E Role = new stRole*[Height];
% _) K! w; _& Z6 O7 x. k
for (j = 0 ; j < Width ; j++)
% q( Y. d, G3 l) M4 U
{
4 ^# L" E* ^7 i$ q) @" c Cell[j] = new stCell[Height];
+ t% ^5 {$ M* {: C5 K' V
Role[j] = new stRole[Height];
, l3 }: W+ z% |5 x4 z. E, u }
3 c$ m3 ]" v: x
! P5 m& ]: i% o9 L( }; K fseek ( fp_map, 28, SEEK_SET);
/ J8 R, }; ^7 J( H* G
* c0 X+ k7 n+ R/ s6 w5 v* a for (int y1 = 0; y1 < TH ; y1++)
9 ^3 e. a- p+ e: e, T0 O {
) O1 i& k* D' C' Q% F3 Z6 d* ^4 S
for (int x1 = 0; x1 < TW ; x1++)
/ n4 b% u! Y) X$ ~ i# } {
; f- c O; F; w fseek ( fp_map, 20, SEEK_CUR);
$ {3 i. I7 D7 T8 U; L4 `) |
for (int y2 = 0; y2 < ShortWidth ; y2++)
! Q, [! f v! H3 ]( V2 w5 h {
, I: ?/ x: \& i) F% g q5 W for (int x2 = 0; x2 < ShortWidth ; x2++)
3 x9 W: @+ _& Y$ f2 q
{
5 [& V+ t6 L7 O$ j' u5 W
fread ( &Temdata , 2, 1, fp_map);
/ z$ ]) t. t7 y A5 _$ U; f Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
& M, Z r* S! U
) ]8 y# V3 a: a4 b. ? fread ( &Temdata , 1, 1, fp_map);
% r# L2 A) F- Q R2 O9 p
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
$ m. i! c z* ?: E0 Y# m) H$ ?" @1 Z- n1 N: s
fread ( &Temdata , 2, 1, fp_map);
: ?. t/ j% R5 }1 _5 j
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
0 E- O' P' Y( r4 L4 X; A3 Z5 i+ R, H* D: t) b* \
fread ( &Temdata , 1, 1, fp_map);
0 g; X( z/ _- R; q
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
- J1 }/ z& D% T/ c
// 6
个字节9 Q) N& w8 o! T, L: U" w4 G- Z
U$ d2 y2 R [8 u/ {" N& d+ V fread ( &Temdata , 1, 1, fp_map);
- s/ l! @7 C+ w7 o1 R" v
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
6 J' V* C$ @# Y3 k ~( P: G% J 5 y5 r7 h* M* K* t, S9 N
fread ( &Temdata , 1, 1, fp_map);
1 n, `2 ?2 }9 ]+ J1 ] s! T
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
2 S- c) d5 g" {5 [
% X6 ?% g1 _, \& X //fseek ( fp_map,3,SEEK_CUR);
: D6 E* ]0 W+ m2 L1 M4 c fread ( &Temdata , 1, 1, fp_map);
) i! }2 a# w+ d. l1 Z0 V
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
" w; z- [' ?* R+ ^5 M( J, y7 g
6 ]9 S$ Q8 j1 s# G+ P3 B fread ( &Temdata , 2, 1, fp_map);
8 e0 U6 ?2 L l1 R
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
8 l# b7 B2 N: g3 p$ W# C1 J3 N- W$ u6 o2 \7 T) D$ b f
// 1
个字节; e4 Y8 C* d- S4 ~' G4 L! r B0 F
fread ( &Temdata , 1, 1, fp_map);
1 U" s& `& x( F0 P Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
* S% K) }6 o5 {- M/ G
//if (ftell(fp_map) > FilZize) return 0;
: {- m# R- w, m }
; w% Q' [/ X, D: T; S
}
+ f1 o/ I( a1 z3 ~/ G) }
}
# S: |2 u* c! R) T/ r! _/ T
}
+ l# ~& E" n" I0 n" H4 j/ G4 p$ {
+ [4 k6 l+ Z) v fclose(fp_map);
" U7 `/ M* Q+ O: C* o
" v3 d& b3 _, d$ Q: J& p
R/ U& x+ z% W8 k/ |3 P6 c
return 1;
' T8 s& [% w" ~* Q
}