游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。
* M  R1 E1 r% g1 H$ u) ]# ~
- I& k1 ~$ m" m' Q    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。. O$ S) }$ ~& O# _4 @% ?. a$ Y
$ g" u  Q* C8 t
    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 地表一层的序号
/ o3 C. Y7 F3 V5 f1 M& U: o' \* v/ r& o3 S4 s1 ?0 C5 S
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号/ h; @2 e8 Y0 s: \4 H5 i6 R# U
07      在地表二层 12 01 这个大序列下的子序列编号& f0 \& ]1 C% A% g7 F# ?
86      物件层的大序列% b' K! {" q7 z
00      物件层的大序列下物件的子序列编号
- _' X  F- {$ x( Y03 03 00  目前不详
( ^- }/ u8 |2 I; J0 X01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
  L( t$ X8 t/ O4 R% b( r
7 d4 D/ T  ^. v//************************************************************
# q: |) g: G. R9 W$ J// 加载地图基本数据函数;
6 E1 v( b4 q/ c) m  }//************************************************************
' u3 j! i3 e, _. \  f& G
- F  ], o& {8 r//************************************************************
6 F' B' e, q! y8 [# O4 \$ t// 加载地图基本数据函数;0 n/ [2 l  B+ g2 h: d+ Z- G# r
//************************************************************. k2 T  a6 q9 O6 S6 L3 v1 g% `
+ y5 N0 v4 m7 H( y
int Cmap:oaddata(char *filnam); X) K' A5 v/ F! x8 }$ ]
{! K( I* Q  g( y0 @( @' ?$ i8 y
        int Temdata;
, s9 ^! E/ t3 {- `/ f( P  D* G; b5 W# o, i2 [
        if(filnam == "") return 0;. z. L0 T# `' U+ @4 L$ r
4 t# l, }, |2 \0 z7 P  [
        fp_map = fopen(filnam,"rb");
6 s5 p9 `9 a, \6 w( ?% k2 [- R; E) B  Z! j7 m8 w
        if(fp_map == NULL)        return 0;
( \1 ?/ D7 m% N2 Y/ y% O0 I" v5 a5 `+ s: v* I8 N- F
        fseek ( fp_map, 16, SEEK_SET);. m, Y! q, Y4 k) m* s
        fread ( &ShortWidth, 4, 1, fp_map);- y! G7 V3 Y, M3 u
        fread ( &Width, 4, 1, fp_map);
  i1 ^* f7 _5 B/ \        fread ( &Height, 4, 1, fp_map);
% C# x; \1 d$ n* w" e& K' Q$ j% m0 \- W9 z) v' Z" q" f
        int TW = Width / ShortWidth;' X2 l, d4 C; D$ V
        int TH = Height / ShortWidth;
  C8 n& O/ s; W# ]/ S% B' K2 k! `2 D
9 a4 H5 i. \+ O6 u, d$ D        for (int j = 0 ; j < Width ; j++)
7 a* g0 V) `# ?: E$ }6 L        {4 }/ x1 t* P$ p+ d
                _DELETE_ARRAY(Cell);" t! K/ y# p- e0 }* p+ W% g
                _DELETE_ARRAY(Role);. t4 J+ H8 I' ^! N4 O0 N4 }, v7 G
        }$ a. e  f1 X8 b! a

9 C+ o/ D2 m% K+ g7 j! M. z        Cell = new stCell*[Width];  z. ]+ L* {4 a
        Role = new stRole*[Height];: V+ |  m+ ?7 o& B5 X8 c3 {  H! K
        for (j = 0 ; j < Width ; j++)
8 E6 D# r: X2 H. h0 n3 K% }2 J        {4 O$ H0 |0 z/ k& M+ m8 W3 R' D) h) ~
            Cell[j] = new stCell[Height];
* D& {8 [: F4 @2 h: C, W' _' J6 t                Role[j] = new stRole[Height];        
1 y. {$ N, V7 b% [        }        
% H" O; m- X  j$ K' s  h1 S& H4 T7 s* q* z! C
        fseek ( fp_map, 28, SEEK_SET);
9 e% @. R# B) C% D
' Y. B% C! H$ N( p# v& d        for (int y1 = 0; y1 < TH ; y1++)
, ^! Z5 t7 F! a. w$ V        {8 ?% v: t" n* t1 S% ~4 B- z2 \
                for (int x1 = 0; x1 < TW ; x1++)
5 Y' B" ^" }5 t/ k                {
7 m1 C2 T! {- l+ `                        fseek ( fp_map, 20, SEEK_CUR);
- K+ v6 ?  s/ d1 \2 y                        for (int y2 = 0; y2 < ShortWidth ; y2++)
  N$ v/ O9 V- v( D* D  }  A& l7 V                        {
% `/ C' P: J0 X7 z  B3 B8 f                                for (int x2 = 0; x2 < ShortWidth ; x2++)3 i! ]- S4 m) v/ p: k  p
                                {; V" Z8 y& g9 F: g/ X1 s2 t) H. u
                                        fread ( &Temdata , 2, 1, fp_map);
0 f# X( V' B3 Y& W/ Q                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;# i7 H  z# g4 \9 \* a2 \

, q! D& x: w" c+ O, f                                        fread ( &Temdata , 1, 1, fp_map);4 _' H- K; v  p7 s: d1 E, K' c
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;/ m! z/ x# s) W
# t. D) }4 @. G$ @. g! e
                                        fread ( &Temdata , 2, 1, fp_map);
: {- Y& F. c! k" X. n8 H1 f5 F9 a+ g: S                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;' M1 }$ q" t( G

: T( J5 k0 L. ~6 R+ V( N. I+ P                                        fread ( &Temdata , 1, 1, fp_map);& O9 \6 D: B0 m' }4 A
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
3 t! ]# z7 [9 M2 i2 F                                        // 6个字节) ]  P9 s& Z: H* p- Q2 S) x+ ~8 p+ K
' X; ^1 d+ ~) z1 n( B! b- j# H$ Z
                                        fread ( &Temdata , 1, 1, fp_map);
. x4 A, J# N- R                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;9 z. I5 }1 R- d. U
                                       
9 K9 Y9 O9 A: @) _4 x0 \  ~6 Q5 N                                        fread ( &Temdata , 1, 1, fp_map);
' S9 R! |. t3 F+ ]- t+ k1 C                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
5 |( R3 t' A+ a2 Z) a2 |' X0 h3 L7 f1 \' w
                                        //fseek ( fp_map,3,SEEK_CUR);
' G' l* Z; O3 C3 U                                        fread ( &Temdata , 1, 1, fp_map);
( R# w# ]( D" M, ~                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;2 p, E( W& e. [- N7 J' `8 l
                                        3 G# s6 T& D' Z8 ^+ U- w7 ?5 {
                                        fread ( &Temdata , 2, 1, fp_map);* j' E0 E4 o0 \! S5 W" M
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
3 A9 S6 m8 q) q' D- J6 ~' o1 |. C4 n1 d- }' \
                                        // 1个字节4 ^. ]7 u$ [) C# O. W. v
                                        fread ( &Temdata , 1, 1, fp_map);
4 o0 J1 ^1 W* q  v4 I# d                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
$ {7 I$ g# Z* y8 G2 \                                        //if (ftell(fp_map) > FilZize) return 0;
7 w# i9 t) H3 q; _- l1 z3 B                                }- M- V1 J, K* f: T
                        }3 G3 a8 L; h" T" k3 P! c8 ~6 Y! _0 o2 Z
                }. z& \5 k3 _- ]& ]  Y
        }
: e; K/ p: @) B1 P, y/ H  ^) D$ o) s) ?! H3 C# F6 G  b
        fclose(fp_map);
  I' b" {  y1 X7 P4 O
1 n. L5 K' r! r+ M6 l6 P
- y" ?9 f1 }; v- ]. L        return 1;
* f" D% n+ j8 D# O" R% h! O( f}
9 m# ^  {5 S6 }; d# O+ S( J
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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