*.map 文件是记载地图信息的文件。
3 e" z" x X; R- }2 r, b7 Q4 `' p' B
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
: D+ l$ k9 Q% I# C
+ d! \) E9 J5 K 第 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 地表一层的序号
9 t% N# c/ `# d5 d) z4 f7 ~+ B! d( `
* {( \! ]: x' a( k) f03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号4 L6 D& L5 n$ d% n0 C
07 在地表二层 12 01 这个大序列下的子序列编号* t U O7 a5 f
86 物件层的大序列) s8 h9 n, ?5 R# _. i; h
00 物件层的大序列下物件的子序列编号; |/ p% m$ W! V* C* c N
03 03 00 目前不详
$ L" w9 c! t4 N# F# H) w01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
5 q$ q9 S+ n$ ~; c; I: j8 a2 q- i2 U. x) y
//************************************************************0 z: v, }# R n) n4 E. ?8 y
// 加载地图基本数据函数;
# @- [ w) E; _/ s//************************************************************; W. P$ @; r% T+ G5 F$ B7 M5 g
X. E' f( {0 C/ g; q
//************************************************************5 X1 ~* t0 P# {) E1 f, g/ ?
// 加载地图基本数据函数;
* Q4 p0 r3 O5 {7 n2 R//************************************************************$ H; q- [. y+ ^2 m
5 u5 f; W! c5 rint Cmap: oaddata(char *filnam)' L2 L' w) M. f' q
{
1 M3 ?( j0 x: | int Temdata;: Q$ U( i- Y* _* I- S# S$ H
# ^, w! o' T) P! X' } if(filnam == "") return 0;
* |: e, A8 z; e) T3 K
- d& G7 ] [- x fp_map = fopen(filnam,"rb");& @; c' f1 Z% H
: r8 J- h9 L' x6 J; F/ s- z D
if(fp_map == NULL) return 0;
$ K) H' ~) ^8 ~* j& u( }
' N% M. y4 [2 N fseek ( fp_map, 16, SEEK_SET);
) R! F6 v$ A+ K, H fread ( &ShortWidth, 4, 1, fp_map);6 _4 k3 H+ C, _! Z3 ^
fread ( &Width, 4, 1, fp_map);
6 v. R( p; K# G( S0 @- }7 P. K fread ( &Height, 4, 1, fp_map);
* e& ^) C: `! N. S+ W$ |$ Z! I2 W: L& }! a( _5 S
int TW = Width / ShortWidth;
$ L* _# b7 a' c I/ l6 H8 v/ ? int TH = Height / ShortWidth;& |$ w% G: U6 m: Z4 n/ `( T
- J0 s- s0 m$ }1 W8 J for (int j = 0 ; j < Width ; j++)
, f- b; G' Y' g5 }4 }3 ^ {
4 G* E4 \* i5 p0 S e: t9 U _DELETE_ARRAY(Cell);
4 J+ n* \1 C. Y5 Y* T6 _% z9 O _DELETE_ARRAY(Role);9 b; ~9 A/ J9 V+ I. O$ k! ?
}
7 p0 q; n4 N1 h; h. X8 \9 g M. s
5 S# P0 i# k) a; E- P! a- `' j Cell = new stCell*[Width];' h! w0 B" L; v, t I, K% b
Role = new stRole*[Height]; I+ v: x: ]" n4 _
for (j = 0 ; j < Width ; j++)
- a# v8 E3 v- K( h1 a6 K! K {) d% a7 `9 @7 w* S* T
Cell[j] = new stCell[Height];6 O# L; n; E' k( ~" X3 Y
Role[j] = new stRole[Height];
0 e- k' ^9 s z. y! s }
- @9 |' \2 A9 Y, `4 v, `+ w5 B* e) ^* Q. F" I: h& u
fseek ( fp_map, 28, SEEK_SET);/ {9 }8 d$ C' H$ j% b
: D9 G9 O. x6 l* q& b
for (int y1 = 0; y1 < TH ; y1++)
9 f) v: M# P" Z6 ? {3 q# }* Y9 _2 c9 I& B0 m
for (int x1 = 0; x1 < TW ; x1++) Q: ^5 {4 h+ }. Z- L) d
{/ N u, U% N3 y! V( S
fseek ( fp_map, 20, SEEK_CUR);" l6 o4 F9 v7 ]/ p3 {4 K: N
for (int y2 = 0; y2 < ShortWidth ; y2++)% @& {7 X' @! X3 _/ h
{0 b& X# u* I. J
for (int x2 = 0; x2 < ShortWidth ; x2++)) b2 z. u3 u$ i0 s' m
{% o- \7 P! N+ ~5 i/ ]) r. |
fread ( &Temdata , 2, 1, fp_map);- V9 S4 r' M, }6 f9 W. s; L4 n. q3 z
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;. o5 i- m0 _9 G7 V8 |. p2 i
& A1 f& f Z5 K% W fread ( &Temdata , 1, 1, fp_map);' |3 t4 u4 {8 o2 G; s4 P' Z
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;2 N. Q0 k" L" l+ R* b* F5 C
! b/ ^2 u) \) P g fread ( &Temdata , 2, 1, fp_map);1 w- f6 G* ?# f
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;4 Q+ o z2 Q- {$ m8 B
9 }- o8 e2 u) o" E# |/ n
fread ( &Temdata , 1, 1, fp_map);
9 X' k, }+ x9 A8 {; H$ J8 D# z/ V Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;! O; V8 w7 j+ r. i
// 6个字节
4 j, @! x3 J$ P! L" p" X. s4 |* r6 C
fread ( &Temdata , 1, 1, fp_map);! |3 Q7 g. s+ A( B3 ?) j. r
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
0 T8 ]* s# A& o( q: e6 S$ o
2 ]. c+ j5 Q G( Y0 \+ l8 t3 z fread ( &Temdata , 1, 1, fp_map);) K8 K4 K3 h' c+ Z! M4 P
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
: ^& v1 \4 K1 b& k/ t$ F& ]- W& f7 ?& j7 r2 {( i
//fseek ( fp_map,3,SEEK_CUR);$ z/ b$ Q5 j! S# E1 T; t
fread ( &Temdata , 1, 1, fp_map);- u0 L y9 b5 a/ Z3 b$ F5 Z% @5 Q" z
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;2 x' o6 W- z1 k) W P/ R8 h9 h
" |9 { r: d9 K: M fread ( &Temdata , 2, 1, fp_map);
3 [" v5 X- B t4 p Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;# Y) b: b( P7 p2 S* l' _
4 r% P% O% ]' X' S) P1 }
// 1个字节
' ?4 S( P7 t7 I6 r fread ( &Temdata , 1, 1, fp_map);
4 L9 q7 l9 w/ [- F( g. C Cell[x2+x1*40][y2+y1*40].CpType = Temdata;5 D) H8 I8 `: x
//if (ftell(fp_map) > FilZize) return 0;
* B5 z Y+ d- k- p9 |; h }4 R2 u& a# O8 |
}: W2 [- P' j9 ?' p7 a8 B* Q/ ~5 a
}
- w3 q. {- F2 L' q, ? }& H! ^- l% E# F9 S" q X5 j
2 W6 M" V, H: P5 R fclose(fp_map);; Z0 ]' K, V9 T& G- r! v- n( W& |
) S9 u' g$ \+ t) {- r7 p0 a9 n* t& d) N4 I2 D8 m: U' t
return 1;
; S2 z9 E1 g5 ^& g0 e. p% h4 D1 s} % i6 ?3 U! ~+ R- v4 q8 t3 ]4 t
|