游客您好
  • 点击联系客服

    在线时间:8:30-18:00

    客服微信

    Wkr-3000y-kf

    电子邮件

    3000y@wenkeruan.com
  • 手机版

    随时掌握游戏动态

  • 扫一扫二维码

    添加微信客服

Lv.7 版主
8号会员,9活跃值,2022.09.01 加入
  • 127发帖
  • 123主题
  • 0关注
  • 0粉丝
这个人很懒,什么也没有留下。
独家推荐 更多>

深度解释map地图文件

[复制链接]
异仟年认证商人 发表于 2022-9-5 20:39:53 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
*.map 文件是记载地图信息的文件。% H6 I0 I6 g8 |

) I) e+ P; q4 t    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
4 o* V# B: O9 [! i, o$ w5 H# Y
9 S' P1 J* V/ ?+ K0 _6 t, b) v' p    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 地表一层的序号
  f. Y' |  _" U- K
& t9 d( M% |/ M' P03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
1 V( q) V8 N/ n7 n4 b/ Z3 v' L/ {07      在地表二层 12 01 这个大序列下的子序列编号0 j/ m; w7 A3 P# s
86      物件层的大序列0 M- d3 J3 ]: T6 E$ Y7 U5 @
00      物件层的大序列下物件的子序列编号: E, f: [& v; f( i6 R
03 03 00  目前不详
: q6 Z% k# D  z- k* A2 k01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。. `6 m' t5 C6 ^' M. S

, Y! L' W7 B3 }7 R2 F0 D9 W//************************************************************) b' W3 R$ t: l' W6 I
// 加载地图基本数据函数;
( j8 ?5 R- x6 j0 ~//************************************************************
! L+ D5 E+ u% k, g
9 p$ d# c- L. l7 P//************************************************************+ {* q8 [# t" ^. d- `
// 加载地图基本数据函数;
' L& @5 P% [+ |3 m9 @! @6 f) d//************************************************************! {' ^1 V) K( ^- N$ f
! c: k9 i* i: Y5 e% u+ k
int Cmap:oaddata(char *filnam), g! I5 u: }& P8 w8 T5 N
{# ^% Z) s. _6 U/ F0 f
        int Temdata;
2 j2 K' J4 C$ o
4 z4 `' l/ N2 v6 d- b( w6 F        if(filnam == "") return 0;  ^& o' {( ]5 S# t" }  x" _
) r, _; z0 c& R8 b# W+ A& b7 J) b$ {3 S
        fp_map = fopen(filnam,"rb");
( d3 ^' ^9 h' Z5 C' c! }& r. I1 h: r5 t9 m# ?& X
        if(fp_map == NULL)        return 0;
% V$ v$ c3 P/ U* Y: o1 g
8 H4 e7 y# n, P. q! ~( D        fseek ( fp_map, 16, SEEK_SET);
* P& b- }- ?" E5 \/ F6 t        fread ( &ShortWidth, 4, 1, fp_map);
# s8 C2 @& u! J- k        fread ( &Width, 4, 1, fp_map);
; B% P- V' F; R6 c        fread ( &Height, 4, 1, fp_map);$ H  f2 C2 R2 \" O
3 r* i' Q) L+ R+ z- V
        int TW = Width / ShortWidth;
; J/ N" j3 u  w0 s2 ]; J# `        int TH = Height / ShortWidth;* K% e) d5 p+ V3 m# {- |
4 [, u5 o* W# e9 p
        for (int j = 0 ; j < Width ; j++)& L; q! f, J8 c1 T
        {
  e6 o; T8 ~& o# u                _DELETE_ARRAY(Cell);9 w  D+ k$ c" s# D- R/ f+ W6 P
                _DELETE_ARRAY(Role);1 [# Q+ J; B- Q! U
        }
4 g4 Z5 s9 [% Z& F% e) ^' }: b  w; H. T: r1 J- E3 m& u* F7 d8 X8 G' t
        Cell = new stCell*[Width];
! m+ ]+ Q; r1 ^( u4 A/ d8 X        Role = new stRole*[Height];9 n& h) r: T8 w+ @$ E# H' ]+ D
        for (j = 0 ; j < Width ; j++)
" w" F9 M& y2 G        {2 V6 Q) B2 u) n* m2 Z! C
            Cell[j] = new stCell[Height];
6 ~- @8 @7 i8 O                Role[j] = new stRole[Height];        
1 U2 }) N3 T( O1 u: x, t        }        & L# b- d# R% J
* d' \2 {$ i  K! I
        fseek ( fp_map, 28, SEEK_SET);
! w) \* {! k7 W7 |1 R5 p! s
4 _- r  s! W9 k# H        for (int y1 = 0; y1 < TH ; y1++)
- n7 l- N7 T2 N0 `$ |3 p        {) b. F3 q6 d. v
                for (int x1 = 0; x1 < TW ; x1++)
# ?5 Z1 V7 u5 u; _6 g                {, h; D! v7 T3 T% Y$ t
                        fseek ( fp_map, 20, SEEK_CUR);; m* p, I  ~4 R
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
$ s3 d5 y! u4 E" F                        {9 O0 }" f: h' ^; t6 @, C
                                for (int x2 = 0; x2 < ShortWidth ; x2++)( b+ x+ i; B% t, n1 z
                                {. p1 b! u: j: y' W5 }" s
                                        fread ( &Temdata , 2, 1, fp_map);2 E9 O& M  S' I$ n* {
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
5 v4 p# F5 x9 [( t: G
0 n- d- H! k' ^7 Y7 l- @8 d                                        fread ( &Temdata , 1, 1, fp_map);
2 E( v2 D3 E" F0 k( v1 e" d                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
: L; `# I' Y- f6 i* b$ @  N
  K. l& Z' v, `6 W+ m+ p+ d                                        fread ( &Temdata , 2, 1, fp_map);) Z$ |" S: B6 t" A% k. u
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
+ v$ V4 E1 n) D/ \# B5 {
0 ~- ^7 ^+ z+ ~0 O3 x( E) O# d* V0 T                                        fread ( &Temdata , 1, 1, fp_map);0 g9 ~$ g3 W4 j1 z/ j! D$ r! \8 R
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;1 C" H2 p# B5 _; Z
                                        // 6个字节
) O$ O7 A  W/ W' L) U7 K3 S+ k+ d. H% H0 @
5 T% Z8 V1 s6 i7 b" V/ q  m                                        fread ( &Temdata , 1, 1, fp_map);( K, ~4 E& x7 v" u
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;  D( D3 ?: D0 T
                                        " o) [: j$ h% @2 g7 W2 o
                                        fread ( &Temdata , 1, 1, fp_map);) m% N; P7 X7 Z
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;0 F3 ]; o' G/ S
# d* I- q& o/ T: q, \0 z0 K7 E9 u
                                        //fseek ( fp_map,3,SEEK_CUR);& W8 L. X# [) K2 ~2 l& N. y5 B2 w8 I1 G
                                        fread ( &Temdata , 1, 1, fp_map);: S7 t" f1 @4 w5 g  g9 T
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;# Z; U& {( O) h, q! x6 |
                                       
! a# G6 d' n0 V9 m$ m                                        fread ( &Temdata , 2, 1, fp_map);
- q4 i: F2 @3 K& o' C" ?                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
' l( q6 O( O0 C3 b5 y3 Y# d5 g
# c- _: k7 C9 A                                        // 1个字节) ?! G4 O: Z9 O, Y( L6 i- F
                                        fread ( &Temdata , 1, 1, fp_map);
- p9 N; e7 {, _* E# P0 M                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
) F  R8 H2 {7 G7 M2 ^/ K! D1 Q                                        //if (ftell(fp_map) > FilZize) return 0;
- \( [. y8 Y+ w( S) u# |                                }# h2 B( e( Q: R+ d0 Z* C+ W
                        }$ f# b' U% B1 s7 [  S
                }
, X1 N& E3 ]9 _) e+ Z        }
% D( t. k4 q# q  P8 P5 K1 x% ~# i$ W/ G' R8 \
        fclose(fp_map);
- c* i0 Z) r  a$ K6 J5 o4 M" R1 j* q. s" g' S) l
' q9 ^, Y' ]" _/ l/ C- q
        return 1;! {" H& B7 W) l7 D$ z
}

+ j5 d4 ?( C* x! x" E' f# ~/ I4 p
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

Powered by Discuz!X3.4 ©2001-2013 Comsenz Inc.闽公网安备 35099902000100号增值电信业务经营许可证 闽B2-20220593 闽ICP备2023014375号