*.map 文件是记载地图信息的文件。% ]+ l# L" i6 I0 v3 n% x
$ R. I" K# M9 f% Q0 @
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
; e! `* T! z. E
% F7 c7 Q% r& q& @5 f) 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 地表一层的序号
: N$ \0 Q6 U- o2 @9 I0 k6 @! b5 G
03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
% A I" {7 T) N# C" }; R07 在地表二层 12 01 这个大序列下的子序列编号
) [9 c, J/ ^$ ^/ c7 `' z86 物件层的大序列
2 ^9 k. ~; U! V1 b5 r9 U& D00 物件层的大序列下物件的子序列编号
4 w7 Z5 Y& C& f8 O03 03 00 目前不详& ~' `) O& \& f
01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
2 J: T- S* U ^6 p( l$ [7 L* k5 h
//************************************************************
) ]9 U3 l# q K$ d- h// 加载地图基本数据函数;( K: d& G1 |/ P: b* P
//************************************************************$ n0 \. o: I" T5 A+ ]5 Z, F( h w
& K) |# F6 r2 I6 ~% _, h Y; ~! P//************************************************************/ H5 O* `7 [) I+ N; k
// 加载地图基本数据函数;8 R5 b2 b* C' B. m
//************************************************************
* v l4 l8 k2 ~& `& Q7 M
8 f! C% ]6 a! f& f# Fint Cmap: oaddata(char *filnam)5 X* A% D7 G4 @4 t. _
{
5 G2 V% k. l! i0 L: P! Z5 x int Temdata;$ E. _+ @3 ~: X9 h
2 D) Z4 R. w: V" k if(filnam == "") return 0;
F0 R+ E/ Q9 g o, X; ^0 K2 }, S* `2 q% L
fp_map = fopen(filnam,"rb");
' g, T3 M( E, \. |& G. w
( j( c7 \1 r& F6 r5 A/ y( L* @ if(fp_map == NULL) return 0;2 I( x: k8 B) T
s8 @, n4 u7 U4 W }1 a) | fseek ( fp_map, 16, SEEK_SET);
: K: r. Z5 y, ^, Q& j fread ( &ShortWidth, 4, 1, fp_map);6 y# T7 p1 _1 P- G/ C1 E B! u* g
fread ( &Width, 4, 1, fp_map);; A" Y2 f" z+ K" Z& ^, \
fread ( &Height, 4, 1, fp_map);
. k. d0 n% |: K0 _: M: n% ?# v, |) e& m4 |
int TW = Width / ShortWidth;
A, j9 ^8 P! S7 ]0 P' c5 d int TH = Height / ShortWidth;
: c9 \, t4 a" l/ l. a1 `
' {! I3 N* k0 _$ u$ K' z0 F1 j for (int j = 0 ; j < Width ; j++)6 o6 \, y1 N! z7 y$ P' U* l. L6 L, F
{
& j, r; |3 G( g9 D0 e1 k! I _DELETE_ARRAY(Cell);
7 A+ Y8 B, v/ q" C) j% s% Q- M6 H1 E: R3 E _DELETE_ARRAY(Role); m/ y% j$ n9 P0 O
}
1 y; F4 A( v2 w# k
3 }* x% k, x* p- c Cell = new stCell*[Width];
4 X) |: |1 O! K f Role = new stRole*[Height];
* Y% \2 m; t1 J for (j = 0 ; j < Width ; j++)
1 q- ~& \7 s7 z9 g: V+ P2 I9 D {
0 {+ a: Y: f' R9 y7 D Cell[j] = new stCell[Height];
! k- |' e: a; o) `8 R4 s" B. p Role[j] = new stRole[Height];
: C. h w; r! C4 u } 0 k; g2 Q+ \/ _) S- E3 _. J
! F1 b0 P" x! }, n% u/ A C; t; d( F7 D. c
fseek ( fp_map, 28, SEEK_SET);' g( o, k4 z/ N# \7 @, M% O$ l
3 N$ y# q. h! z7 I) v% h
for (int y1 = 0; y1 < TH ; y1++)
/ _, d7 c5 B, g" h. J5 S1 K0 z# ] {, A% O( `% I0 a. I" J# v
for (int x1 = 0; x1 < TW ; x1++)6 Y& y3 u" \5 F$ o1 A6 n9 r
{
6 B4 C3 m! K1 x fseek ( fp_map, 20, SEEK_CUR);, S: x0 V0 q/ u8 m
for (int y2 = 0; y2 < ShortWidth ; y2++)
6 b x. v+ |6 s/ O% y {
8 M5 n: M/ t. H/ v- D# ` for (int x2 = 0; x2 < ShortWidth ; x2++)
' [$ c- l" Q( s {
+ ]$ J: p* s1 R8 Y! E1 {/ a fread ( &Temdata , 2, 1, fp_map);7 B3 d* H4 k; H" E3 c p# V
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
# y3 o, Q" e# g+ o! K
& T. T9 A/ i4 w3 r fread ( &Temdata , 1, 1, fp_map);
- z' a8 w: a7 \! b( f# H! {5 G8 ^ Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;9 e; W$ n$ s& S5 P2 }9 [
6 ?) }9 p# c: W+ D5 [, W
fread ( &Temdata , 2, 1, fp_map);, W7 }; q/ v! ~: E
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;$ y& X* \. Z7 N8 ]4 [) y! s. t
! d; l; w, G4 N1 x" Q fread ( &Temdata , 1, 1, fp_map);
/ S: h$ o& V/ |1 V Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
e/ N6 m7 b+ I& D+ P; ~) `5 m( h // 6个字节
$ i/ g9 s1 l9 {" q6 `( T
E3 T m3 T7 B+ _1 `2 y fread ( &Temdata , 1, 1, fp_map);! P" ~" {; Z8 Y) O
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;1 b& l* C$ g- X4 u; z' O# [
! N; s( C* ?, V4 O: o# z" v fread ( &Temdata , 1, 1, fp_map);
! V# u; x; q3 {5 [/ [ Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;2 m) }9 z1 K& M* a6 e! O+ p
/ r" a! e5 ^, X: E+ t6 O
//fseek ( fp_map,3,SEEK_CUR);
6 B4 x" n6 W# _2 W% ?& g9 B" A fread ( &Temdata , 1, 1, fp_map);! R* V; o3 M# }0 k. h3 l. Q
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;. e5 E ~7 J1 u; u
4 F5 u' w, @0 k' A: f2 o- a fread ( &Temdata , 2, 1, fp_map);2 m! `$ r9 K$ ~5 s+ x' k
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
+ V$ k; R/ x* [* U+ M
$ e& P$ f$ A* H // 1个字节0 e1 I- ?: t0 O, q$ Y
fread ( &Temdata , 1, 1, fp_map);
7 J# }: b/ \ ~3 Y3 M% ` Cell[x2+x1*40][y2+y1*40].CpType = Temdata;% A K0 B5 J, M/ \% \
//if (ftell(fp_map) > FilZize) return 0;
: x* D/ M7 d: T/ }8 m }- H: J v* a4 {$ d
}
& H- n* r! {* d( g }+ @; o, y9 D* b2 g/ |
}# I+ f6 ]0 m# a7 O) h) f
/ |0 s% c* y) s) r3 t- ^- ]& c9 p
fclose(fp_map);
0 z* i6 c/ D1 o$ N% `0 N% x/ b
1 X. R, C' y& k x" n7 U n7 C7 C5 L. M8 U
return 1;
7 d# C" T4 Q. o Z} 5 h* f8 z3 M; F9 L+ q% o
|