*.map 文件是记载地图信息的文件。% X) x5 U, y% s1 R1 e2 u3 X
' v/ f; m/ W4 A' Y K 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
6 \ ~7 B& s4 ?- W. {7 @5 B0 X2 \3 L$ t- E$ D, ]+ m) h
第 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 地表一层的序号1 D# ?& w5 M+ r4 W' \7 n
4 s4 B. S# |* S4 B
03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
& f0 m- T$ \/ M07 在地表二层 12 01 这个大序列下的子序列编号
. _' ?/ I# Y: d# q' h+ b86 物件层的大序列- q+ I7 N% N K8 F
00 物件层的大序列下物件的子序列编号3 H6 _6 p* `1 ?( `* V+ n
03 03 00 目前不详. B1 Q2 y- J/ z) |
01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
9 G9 f$ t' W* ^. [1 M
, j9 U- L. @; G5 m6 W//************************************************************0 v P% B1 c2 U! ^% o
// 加载地图基本数据函数;
9 q* Z+ F. b0 L" J6 v//************************************************************
# I: F; m4 }/ {% T# f0 b! g1 G) W. B& S; P
//************************************************************1 ^0 T# k! f4 ~* k
// 加载地图基本数据函数;
% {4 g4 Y I& X- j$ _//************************************************************1 M- {- f1 J/ j
; [3 U" q8 _ t) o$ ?. N3 mint Cmap: oaddata(char *filnam)
5 Y- C& w6 {$ M" _5 O{
; M% K; L5 f4 b* @+ f int Temdata;
1 [ O% y- M; h, A! X
/ M, i- Z3 H5 ?9 U+ Y! V8 Q0 D if(filnam == "") return 0;2 V8 H$ u0 ]4 S" {* ~. e9 |! {2 m
+ j- D, T; O% K3 r
fp_map = fopen(filnam,"rb");
$ Q+ }9 g4 B, V; W. y; j
# c; Q; c x: ~8 K* Q" U0 B if(fp_map == NULL) return 0;
' Q* Y* o T# _' T) q2 ?: k1 M+ ? Q$ a8 G
" S& C, j( ]. u fseek ( fp_map, 16, SEEK_SET);" l3 H$ f) ~* D& @# q
fread ( &ShortWidth, 4, 1, fp_map);
+ E6 Z5 u; M$ L* e& _ fread ( &Width, 4, 1, fp_map);
* R' @5 w# r7 q8 s fread ( &Height, 4, 1, fp_map);
) y. c% L) s {7 `
" u6 Z8 E. w% |! ^2 Y: H1 b6 G int TW = Width / ShortWidth;
. D+ L1 l: S+ j2 K! l8 u! |; | int TH = Height / ShortWidth;+ F$ T9 W& I, \5 p, ~
: Z# q. P' |! n8 b
for (int j = 0 ; j < Width ; j++)( k5 N8 A$ v3 o2 x* D
{% O: N5 l" r& d4 V" Z; _; v
_DELETE_ARRAY(Cell);- n0 [$ D; ^. S8 A6 n# o+ V
_DELETE_ARRAY(Role);
4 [9 L! P, u/ n }0 z9 k# \' n/ A6 }1 r5 S
& G! }4 A5 s# v4 W: s5 a Cell = new stCell*[Width];
) e q8 i2 }3 I4 H( S Role = new stRole*[Height];9 l$ p: ]! p( X- ^3 |: r
for (j = 0 ; j < Width ; j++); d; t- R) K9 g9 j( e8 V4 P
{! ?0 q3 c5 g! L9 V0 D6 T) o
Cell[j] = new stCell[Height];
7 R2 E+ Z" `) }( Z( k( H Role[j] = new stRole[Height];
2 Y: J" {- }, Y! C L" I* H }
1 F' A" J5 e; K. s$ N( P) m% E! [ ]" u e6 A' W4 p1 Q- k
fseek ( fp_map, 28, SEEK_SET);
8 K, m0 z# ?% N4 r# ^' E
4 Z9 O: x' t3 H' o# K for (int y1 = 0; y1 < TH ; y1++)
" ~# P' u- M' ?) H. k4 L {
. ^2 R0 M! Z! E/ e% L# B7 I6 n% g for (int x1 = 0; x1 < TW ; x1++)
- S( _& S J* R8 x; X2 A3 f {
2 U ^% C) j' [1 | fseek ( fp_map, 20, SEEK_CUR);0 l) J! }7 P0 b) `+ D, |& k
for (int y2 = 0; y2 < ShortWidth ; y2++)
2 g, w% S7 |" U+ ~, T0 _ {+ h4 N+ Q1 q, J* A9 o5 Q0 Y) F
for (int x2 = 0; x2 < ShortWidth ; x2++)) j' R. ?2 w& V5 ^( f( r, P6 f
{
8 }' F' t' \1 ^- a2 `4 G" C fread ( &Temdata , 2, 1, fp_map);
O- R* ^' G' M* i% J$ a2 | Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
+ v: ]/ k) s/ o+ d+ _6 |2 t8 Y- Y+ R1 p* ]( u5 o
fread ( &Temdata , 1, 1, fp_map);, O4 E+ k" K5 }) c8 i0 z
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;% {% C0 k- X/ i
, v |- i; y. `+ Z8 D
fread ( &Temdata , 2, 1, fp_map);; `! L$ W2 t" v s, y
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;1 w! c8 C9 Z0 }, a' f
, E( _2 y) N$ s' y) t
fread ( &Temdata , 1, 1, fp_map);
5 L# P6 i2 ^5 W8 f9 G# X; b2 T; [- @9 X Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
3 K/ W8 _/ Z5 a$ J5 N: ] // 6个字节
+ `* z9 X9 {& e* s2 D
' G; m# y/ t* ] fread ( &Temdata , 1, 1, fp_map);- x0 D7 K4 T: z. g9 g5 Z
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;1 n/ i# d* g& A/ E: @$ D4 O* A
- l% r# Y5 |7 C8 o( ^# ~8 P; Y% Q
fread ( &Temdata , 1, 1, fp_map);# a$ L% u B/ k. V. _) Y3 g1 x
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;* r/ |! d, b5 s% i3 v+ m8 \
8 [( S. y, B3 ]* X6 z //fseek ( fp_map,3,SEEK_CUR);
c; U+ o; W; H$ } fread ( &Temdata , 1, 1, fp_map);
% w* v" @5 ]" Q7 ` Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
0 N2 F4 R: B8 k; ^ ? w
& [! q$ a3 y) H+ [0 A9 O fread ( &Temdata , 2, 1, fp_map);
: V& k2 p- ^3 Z, b Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
0 ?# t1 G, c* c$ m: V# t2 R8 r$ h6 `: ^" A) G8 z9 R
// 1个字节
, k' a* |6 F7 a, c. X+ ?& Z$ l fread ( &Temdata , 1, 1, fp_map);
) I+ \6 K8 Z* K! o6 s; Y/ ] A% b Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
9 K. I4 D8 ^# v# R //if (ftell(fp_map) > FilZize) return 0;
v# T0 D1 @7 t, ` }
$ ?% A# t+ v: a9 J }
8 C0 L* A6 ^, ^+ k! ~, X2 Z* M+ Y }
8 ]- W/ ?0 t& O0 |5 m: J6 ?3 _ }
8 f* ^# ^; m! A* K5 U9 O& G9 w
8 C# U9 Z/ u, Q9 S: ^2 G fclose(fp_map);
: a; a" b% n$ H3 V' ?( z
3 X+ ?6 }( Q6 H5 X' r
! R; \& {. r5 Y5 @( e return 1;
* G3 Q$ K5 x$ q) ~ w4 W! F} 0 g) O) g" _- S3 {; O
|