*.map 文件是记载地图信息的文件。
% R9 L. w# J9 {& W4 x p) q. a: a" T7 L' j7 o; r7 R
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
3 v# T7 Q9 V' D& G! O: B& f. B6 e+ L" E1 f8 y9 }2 S
第 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 ]7 R/ U4 Q& C3 r: a, t7 x, V
; G/ k' }1 U' _( e9 o2 }- [" }03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号' H$ r6 r# b5 U6 Z- T
07 在地表二层 12 01 这个大序列下的子序列编号% Q9 t% ~% P6 y7 G/ S6 p
86 物件层的大序列
- \+ i: p8 E+ {8 F# ~; S) {# {00 物件层的大序列下物件的子序列编号
' A5 i% i9 f' `- h( U# k! H1 l- P03 03 00 目前不详
# A& [; F! m; B0 O$ o# N3 Q01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。' l4 \3 j: K! ]) ]; j
' @5 H& K3 ?( k" ^$ w4 {# K
//************************************************************2 W8 F' d2 H2 V% g$ i- [
// 加载地图基本数据函数;
2 X( p" ~5 ]7 d5 i8 A//************************************************************( E6 e8 v( ?' I. O
3 K" u. o' y1 b0 |1 p
//************************************************************
3 o( M' Q. S0 w) T$ P5 e// 加载地图基本数据函数;9 U$ N1 F6 W" `+ m# a
//************************************************************
8 \' R2 P& E8 }' U
7 W* F' O& C' D2 Tint Cmap: oaddata(char *filnam)
) }+ ~4 o0 x# [6 D% @( H{! X( }4 {" H* @
int Temdata;
* S5 y5 c- a/ V5 S' U! G6 e/ P- `8 _! I3 H4 c; i! n
if(filnam == "") return 0;
9 C( w$ Y) ?8 H- j: S/ q: X+ I+ v/ q
fp_map = fopen(filnam,"rb");& E5 z& Y; ]4 n6 c) q
N4 a* N6 j4 q
if(fp_map == NULL) return 0;. L! p/ y9 z4 h- r& \! k
5 s! y$ G. |, E
fseek ( fp_map, 16, SEEK_SET);
( J: {! U0 F) F, c! U7 b4 x( y fread ( &ShortWidth, 4, 1, fp_map);2 h: m, k. B" n" s( X
fread ( &Width, 4, 1, fp_map); M0 D$ p% w* D7 X
fread ( &Height, 4, 1, fp_map);+ n' p' W; N0 H5 P8 M% v) v2 a5 g
0 B* l; z6 `& d' S
int TW = Width / ShortWidth;! p( o: @3 V9 B* u
int TH = Height / ShortWidth;! P! t( p& `( H$ ?- j9 `
7 v: f! U1 A9 T6 r for (int j = 0 ; j < Width ; j++)
+ S: D- G& W, k# m- p8 O {
: n" }/ C+ E( b0 p7 Y9 e6 v _DELETE_ARRAY(Cell);9 |7 V( j9 l! R+ U* w2 O' O+ N2 @
_DELETE_ARRAY(Role);
6 ~7 ^9 Y# O# Q/ U6 P7 P }: u3 E0 O0 z& X/ \+ ^3 v3 q% q
, d8 z/ f' ^4 |* A7 x Cell = new stCell*[Width];' f3 q2 P: d' O, v
Role = new stRole*[Height];
* x- R( Z3 E9 A8 D1 c9 m for (j = 0 ; j < Width ; j++)8 z% l1 b, n1 A; ^% V
{
" R, m0 N2 g w( ^ Cell[j] = new stCell[Height];# u' J* c4 L: [0 e
Role[j] = new stRole[Height]; 9 a- {9 b- L8 \; H' A
}
# V& M" ?/ N$ W, q9 ?3 S' T2 F7 w3 s4 Z1 R
fseek ( fp_map, 28, SEEK_SET);' { I8 s9 k: v4 K3 o R
. z g6 i A- e5 y) {, B0 I, {
for (int y1 = 0; y1 < TH ; y1++)
- @# r# u9 B/ v( Q {
( A' L4 F$ q. i& V5 K0 O, Y2 L for (int x1 = 0; x1 < TW ; x1++)$ q, u( Z9 J! s7 \# G( n6 N
{
( A! E3 W0 y1 i2 X) j8 } fseek ( fp_map, 20, SEEK_CUR);
5 q: j9 `, s1 {# B4 g for (int y2 = 0; y2 < ShortWidth ; y2++)+ v8 S" V0 [; u6 v2 w% U5 k G |
{/ A+ [& w8 ]5 Q
for (int x2 = 0; x2 < ShortWidth ; x2++)1 r c( m. z- _0 E1 z
{! }- M% `' `! U: j1 `% x4 K9 G
fread ( &Temdata , 2, 1, fp_map);% _0 w ^7 K5 y$ w4 K; S
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;/ x+ g$ [# B1 |* F# U7 D
4 Y) j! r* C$ L; m+ a: f e
fread ( &Temdata , 1, 1, fp_map);
9 W* |9 d) R7 F1 |5 T/ K1 g Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
! R6 [: V* W. a' }# n0 f3 P) y# w, Q
fread ( &Temdata , 2, 1, fp_map);' e" l0 X- Z. P' s
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;% B; P/ h2 s9 R5 G( y; h
3 S& S' N9 h% O$ L$ i# l) H, |! p2 h
fread ( &Temdata , 1, 1, fp_map);
7 Z5 J: F1 Q% }5 R( f0 I Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
' A# t* v- E% H. d: }' ` // 6个字节
! j4 t+ O) f4 X% ?7 L
! }; \5 a, R/ ~ B- f3 t- T fread ( &Temdata , 1, 1, fp_map);
7 B1 s0 a# j9 H' O Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
A: _! I/ i! x* I0 `4 K, N 3 q) _" N/ n# k1 ~% y f" S- k$ T
fread ( &Temdata , 1, 1, fp_map);
# L" ^! V$ a$ f9 K8 y( K$ U3 {+ e# D/ Z Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
' |+ q# {' M; M6 [* W" O
7 c. v$ X# w p# \* ^( e- e' a* e //fseek ( fp_map,3,SEEK_CUR); [8 q% Z1 Y$ N3 B4 Z9 ]; `5 q
fread ( &Temdata , 1, 1, fp_map); E. S% |" y8 | G
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
$ ]) ]" {* F* l, y" P2 R# p3 |' ?) J
) S7 o8 f1 e. e6 K fread ( &Temdata , 2, 1, fp_map);9 @- B2 d+ \1 C, s b3 a
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;6 y* Z; E4 B9 c6 S f
2 k" v. c) l4 |& ?+ J8 G. o // 1个字节
2 g$ S0 U1 N: R5 D* N { fread ( &Temdata , 1, 1, fp_map);
8 N2 f& J: r# \ Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
^' z/ ~5 Y. S //if (ftell(fp_map) > FilZize) return 0;# B* c9 h' I7 x/ a
}3 K5 j+ y8 `6 N1 z6 e; ?
}
3 d) z, d; P+ b }4 m3 I; t# J3 f
}
) }! y$ v/ ]0 R" y
! ?1 z) {- ?5 }0 n. D fclose(fp_map);* k, [, |6 S4 X+ c; c
! t& h2 D4 x. J2 G0 ~' J t' {( g: \7 m* d4 r5 [
return 1;
' U. G# b# `7 H- {} ; j* Q- e4 h* U; r7 M! G
|