*.map
文件是记载地图信息的文件。+ H* I, y; f+ n |0 e, k7 c
4 L% y) Y- N4 N h* o8 l- H 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。6 v, I: a; S9 R _4 G
! ]" t! q6 H4 V7 t3 m# A
第 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 地表一层的序号
/ ~- S' j* w& o6 }1 ^* A
7 S9 p- |% A0 Y; W7 p4 n) H9 y" T" |7 L03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
5 H2 P8 F% Y! j2 |07
在地表二层 12 01 这个大序列下的子序列编号
+ ^ X5 g" k) P) H# r86
物件层的大序列# S" z: j% g6 p) \0 m
00
物件层的大序列下物件的子序列编号
7 q6 a% b9 g0 R8 _4 f( m0 M" i" {03 03 00
目前不详' A! v7 n( F+ x% H
01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
; Q* C0 j: W/ J6 c; k9 E% e0 e8 H6 T6 f8 e, S- Z/ O* b
//************************************************************
, E# _* Q3 q5 `; \* M
//
加载地图基本数据函数;
) |, o6 X1 o& e. r//************************************************************
: O0 e* r- Y- o4 ^) ~
( I) q7 E; ~( c0 w# ?9 q//************************************************************
% e5 v0 g, u8 S$ `) H//
加载地图基本数据函数;
8 U3 v- E, I% v" w//************************************************************
5 X9 A+ P: n% I) K: _
* H9 \! b6 \7 T! l U5 Kint Cmap:
oaddata(char *filnam)
4 u# J; T8 k B5 m3 a; @2 p, b
{
) o$ y5 [& g3 K- F int Temdata;
- T! U4 E" C, i9 _
+ F: b& {4 i' `8 W6 L0 D8 i* T( o: l
if(filnam == "") return 0;
1 M) m# X$ t8 A1 d2 ^
$ C' A; O, x& r1 Q- W fp_map = fopen(filnam,"rb");
% [& K* L Q3 u0 {. a9 @* H& ]
% J# S7 _2 f0 A2 }
if(fp_map == NULL) return 0;
) z+ P) a% }- ?# z
H9 i* P c3 V. z4 o$ N- F: l fseek ( fp_map, 16, SEEK_SET);
- E# A% s2 J4 Y/ N fread ( &ShortWidth, 4, 1, fp_map);
3 J* r" X$ P8 r9 l
fread ( &Width, 4, 1, fp_map);
" W; X, j/ O3 O. `! {, b8 r8 S" c fread ( &Height, 4, 1, fp_map);
; [# G ^. w% E9 p2 f
+ T0 w$ B% p! Z, r# s$ Y+ q5 s int TW = Width / ShortWidth;
2 c4 q! ^ s0 A int TH = Height / ShortWidth;
1 T' d3 X. r+ D1 E' `1 j1 ^* z
# }* J3 s2 [* V/ B
for (int j = 0 ; j < Width ; j++)
7 p9 [7 J# _& e; h4 [
{
' m! e) t K4 c6 R* t8 K
_DELETE_ARRAY(Cell);
3 K0 ^+ d' j& ^: }$ t# {5 | _DELETE_ARRAY(Role);
, S3 ~1 z+ M4 v }
* l% I$ w' B/ T7 d f
+ E$ t5 J& a8 N* Z6 n0 r Cell = new stCell*[Width];
1 U+ R* D. h! z
Role = new stRole*[Height];
% U& [% k% a6 g4 i; r! w
for (j = 0 ; j < Width ; j++)
. `: d4 _' W/ D5 n) E
{
" Z3 Z' F0 I \# Q: l# B
Cell[j] = new stCell[Height];
& U6 Q: t7 u! J9 D' H: b, n Role[j] = new stRole[Height];
- \' ]3 J9 w4 F' j
}
* v" A7 m2 R! m! k6 Z* E+ p8 H w/ i" Y
fseek ( fp_map, 28, SEEK_SET);
7 c" [. k+ @/ U- ]; L5 _ V( e! }! b
/ L5 q7 W9 h; r+ x for (int y1 = 0; y1 < TH ; y1++)
8 W' C5 y# d. v ~
{
, x. j1 X0 Q" N, Z. B
for (int x1 = 0; x1 < TW ; x1++)
4 u4 I% z& ^- V4 j0 t- y {
; ^$ L w2 K N: C fseek ( fp_map, 20, SEEK_CUR);
3 K4 Q& g4 u5 j# ^( s' }' t* f, x: k for (int y2 = 0; y2 < ShortWidth ; y2++)
. H7 z9 o6 F* l, M- K0 m {
1 u1 h& e% ~6 ^) H& ^: g% Z" J# c
for (int x2 = 0; x2 < ShortWidth ; x2++)
! q4 ~+ ^7 f4 n" h, ?: J {4 ~2 ~ {
2 F( n& I! w% S7 |4 f* {( y" A
fread ( &Temdata , 2, 1, fp_map);
! m( e4 z: N& e Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
; ~; l( c4 B% v4 n& {
) x3 s) h# F$ P4 c2 i3 W fread ( &Temdata , 1, 1, fp_map);
; y K [4 m! p D
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
3 ^. Z+ d4 d7 `9 l
! \: f9 L. m$ y5 A% g! T fread ( &Temdata , 2, 1, fp_map);
1 i0 b" j+ N3 U$ B8 O
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
7 y9 [* U2 ~4 y/ `
8 B {' l0 v( g fread ( &Temdata , 1, 1, fp_map);
/ |( ~1 v: g* s; O; f Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
4 M1 _# Y! x4 ^. _) A' T // 6
个字节
' B- z- I1 }5 ?' p4 y; h
7 o7 z6 ~, V6 S: W8 A( Y7 b fread ( &Temdata , 1, 1, fp_map);
8 A$ t, U- g/ I
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
" X4 [. o/ l, T! a2 H( [+ r 4 |. @$ D) F" E1 G! f8 O
fread ( &Temdata , 1, 1, fp_map);
4 @- ?8 E# }5 q5 k
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
3 {- O1 W8 K# j0 y4 `
. B; L$ C. A4 a# J& l# T8 O //fseek ( fp_map,3,SEEK_CUR);
6 M! j4 X) P' @+ p; p( s fread ( &Temdata , 1, 1, fp_map);
2 m5 c8 X" g8 h2 [" B Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
9 }) u5 }. x8 D3 w! o 6 j, C/ J: M6 w3 k8 S1 ]
fread ( &Temdata , 2, 1, fp_map);
: X" }( n' O& p# k: ^/ g% `
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
% E' ?" F7 X0 f) m) P0 |+ J5 }6 v' _2 M
// 1
个字节! q% ?! [8 T- x4 y A- I5 q* S
fread ( &Temdata , 1, 1, fp_map);
$ a7 i& k2 _- u; L3 y) _3 w8 A# {
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
( r" R. Y/ R- V# h% w //if (ftell(fp_map) > FilZize) return 0;
0 H) U, ?3 B4 V9 N. i9 [ }
, d% |2 F, q4 P
}
8 B0 y, N$ }. `6 M- k0 z/ _3 e, _ }
' ~5 I; K4 a7 J! J3 c }
/ R3 ]9 K6 N6 F
9 S9 u8 A9 F; r3 r fclose(fp_map);
8 Y( D- }# O( d" t& Y3 E' ?* p: q3 ]. z3 t6 y/ i
. F7 Y. T9 U- x: w9 W7 D
return 1;
& _ Q; u; L7 `4 s! q}