*.map
文件是记载地图信息的文件。1 U8 s! W: E- N3 t! x
: p$ p" g' n$ @1 [1 P, I) S8 {3 W/ R n 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
& c+ v) R" B: Q+ W7 r
3 z' z( ]9 _6 I3 y 第 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 地表一层的序号3 r1 R" ?8 `5 |5 ]) d
/ i; h, x* G. U4 h
03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
p: D% H9 W3 R: Q4 I1 u" q8 _07
在地表二层 12 01 这个大序列下的子序列编号
4 `% w) i% Y% p9 @8 P86
物件层的大序列- }: b- Y) p# b. `
00
物件层的大序列下物件的子序列编号
; I/ I' t9 z- A& f03 03 00
目前不详
5 ?0 \+ ?! w0 ?. L* N01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。% i2 _- Y9 Z9 j- a! v
# X4 t% t- z/ }3 u3 P. f, u8 f
//************************************************************
6 o q6 q5 z# U8 k4 o% ?//
加载地图基本数据函数;
& p, R5 E [8 u( V//************************************************************
" o6 t. R4 h8 q% p0 j' h: H! V# i. C) D& _ I/ h# g% B
//************************************************************
- Y8 L) n- x* t+ T
//
加载地图基本数据函数;
! b8 l' [. }+ p* e( O& h* O3 ^//************************************************************
6 z' V7 M* D% y/ C6 |8 v" r
' a) u; O3 @ Y% iint Cmap:
oaddata(char *filnam)
8 \$ K* k) f( S! k2 _
{
9 j* W# E3 \2 R1 Q' I+ Q/ j int Temdata;
. W" f9 X2 F" j3 S8 z3 d0 o
; U/ J n5 V7 ` t/ w* q if(filnam == "") return 0;
7 U( S3 q; d$ A- m5 \+ s6 `( V$ u9 w/ w! w
fp_map = fopen(filnam,"rb");
) R' D" Z4 \- k# a/ I: q+ u
# @* q5 K8 t3 j% m7 v if(fp_map == NULL) return 0;
* N& p* o& f! J( t. p* r1 r
; k% L; T+ K0 z fseek ( fp_map, 16, SEEK_SET);
$ [2 G2 z1 t4 B6 I0 w: w
fread ( &ShortWidth, 4, 1, fp_map);
G1 R Y. a, o' F6 t fread ( &Width, 4, 1, fp_map);
' r- `. Q$ n# }5 U. m; s; `. \
fread ( &Height, 4, 1, fp_map);
& h5 F8 s9 _1 S3 L* I+ {" U" a' g
8 Y+ d9 M1 P9 C) \; d: L9 a
int TW = Width / ShortWidth;
6 c0 r" x, H5 ^
int TH = Height / ShortWidth;
% ]* a, ^9 H. ^$ g% w) w
# y, y) h# ?+ y2 B7 l
for (int j = 0 ; j < Width ; j++)
6 L" e6 \5 T4 n& ?0 S: E9 d# t' \7 a
{
% I, {4 p: B8 r0 _! e7 T5 C6 L0 w: u
_DELETE_ARRAY(Cell);
1 }7 h- l* [' y) E7 L. I _DELETE_ARRAY(Role);
9 _0 O4 L3 J) P' d' u, q$ o
}
6 C' o# r- I3 g# j Y! p
$ c( I3 {/ \- ]! _; _: E Cell = new stCell*[Width];
* i; G; [& N& D- f" L5 { Role = new stRole*[Height];
/ ?7 q; p( S9 e) y- I
for (j = 0 ; j < Width ; j++)
3 l" ]7 j- k2 O {
, ^7 v4 I. y. o( ]- [ Cell[j] = new stCell[Height];
, O" C' M+ w9 f+ F7 P1 A7 J Role[j] = new stRole[Height];
" [) Y7 \# H6 c5 f4 k5 ~ }
' q% _' E# c$ O1 w! ~
1 a) R, \2 ^( v0 z0 {) K+ U0 ]) o fseek ( fp_map, 28, SEEK_SET);
6 N) e3 P* z5 A3 W
/ L8 @- o# L6 G8 C, |
for (int y1 = 0; y1 < TH ; y1++)
2 N8 V) T$ G3 Z# U K: l6 [
{
8 Z0 N# B& V Y1 C J
for (int x1 = 0; x1 < TW ; x1++)
; j7 `. M1 l& ~/ K6 W8 O/ p {
[% I8 d, O/ t2 E' R
fseek ( fp_map, 20, SEEK_CUR);
" T6 f2 Z0 z0 g) H& Z' c for (int y2 = 0; y2 < ShortWidth ; y2++)
4 L# _5 ]5 j) }% l( r: _
{
9 ] N# S8 p) y( t for (int x2 = 0; x2 < ShortWidth ; x2++)
$ a/ Z: k- ~+ y+ z
{
. o: a" N; I. c0 m6 ~' ~! V; t0 m2 v
fread ( &Temdata , 2, 1, fp_map);
4 n; e- v9 r( A0 z! m5 F* D Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
/ e3 g4 D3 \; K0 d3 F
8 E( u* _! v. j; }8 S) U2 S fread ( &Temdata , 1, 1, fp_map);
9 R* ~$ i* j5 Q' q5 \# ?7 }0 [ Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
3 c9 F: t* o: ^, p$ U( L% o5 L/ J1 H( W& @) H
fread ( &Temdata , 2, 1, fp_map);
5 c/ m: w. U. K4 s2 G9 A
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
% m* ?% m, b, ?; J! O" ^( ]: Q6 P0 S5 n0 J1 x3 [5 {! l
fread ( &Temdata , 1, 1, fp_map);
G. i. o" j2 u' j Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
- H! x9 b; L& E/ C' A* F! r3 N6 g // 6
个字节
0 U: K" ~% W Z1 `! y8 U7 Y
. B5 {( N9 c# E# e# ` fread ( &Temdata , 1, 1, fp_map);
" r: c$ u" S' Z; f. O# W" ~ Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
( W$ }3 |4 r- }6 G
1 |6 V: {$ M8 a( A; W9 z! v8 L. ` fread ( &Temdata , 1, 1, fp_map);
! u! J" `9 A4 V8 ?; U, g. i Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
3 u Q$ p; s1 k1 M
1 r/ q6 u5 o A' L
//fseek ( fp_map,3,SEEK_CUR);
9 U0 ~3 H6 R) u) q' _ fread ( &Temdata , 1, 1, fp_map);
' v) P. B% F& b, l" Q/ {9 U1 h6 E C
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
3 L- d2 K% ^, n. y/ g4 ` c: ~* [& a
# j% W6 k- i2 c. b4 R fread ( &Temdata , 2, 1, fp_map);
8 }( D6 i. Q: s* t' R% n Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
# }' k b& K8 i& ~: j0 ?6 L5 N1 m- W; A# t4 N4 V* v ]8 P- @
// 1
个字节7 O# \$ z1 W! `9 [
fread ( &Temdata , 1, 1, fp_map);
- I0 u! u$ }6 [9 Q4 |
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
l8 \$ H9 {( S0 ? //if (ftell(fp_map) > FilZize) return 0;
/ {, ?) _, C/ j4 }- K
}
% S/ @/ M& D! M) n" s% j }
6 _& b) R- j8 b+ Q
}
1 q/ l3 b5 U6 D# I- P$ G
}
4 K9 d8 c$ Y* S# s
: A/ A: X1 }) }9 A. j/ w fclose(fp_map);
7 {2 C: p) k) L3 a
. Z z- w2 g( u0 B
% L, P3 v! n4 n2 g% a9 ? return 1;
2 s" O6 g7 ]+ \5 e
}