游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。
" T/ c# Q: ^- k& T' \% x4 J, q+ o0 N8 V  F( p: ^3 i( G, v  O, ]
    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
# U) s; R4 `6 N7 _  n& q& P  y( y; {& ]9 o
    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 地表一层的序号
" {# D3 w/ v& P1 j5 C) R$ P6 m
- N/ I! B, Z% w# a7 ^  z1 N03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号: a1 K! `/ W6 o" ^& G  {6 o
07      在地表二层 12 01 这个大序列下的子序列编号5 x+ G5 t# {! D3 a7 O6 R) n, q
86      物件层的大序列4 ^* s1 H* j) z" x, t
00      物件层的大序列下物件的子序列编号
* b5 T) o% X$ ]03 03 00  目前不详
) ]$ E. c& g. Y: A01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。* X) t1 e/ ^' p  U/ ^1 R

# P/ _! X4 J9 u//************************************************************! y5 G* K# P- R$ O# h8 w+ A
// 加载地图基本数据函数;
" ^0 @0 N8 S/ E* i; |1 i% r//************************************************************
) X" _( s4 _& ?2 u* e9 t5 `" p1 |
; _/ F1 W- K! h% c2 h, U//************************************************************7 h% h/ h0 E; |' D- h% z6 Y5 R
// 加载地图基本数据函数;
# F$ M" J7 P2 L$ ^  \//************************************************************7 r. {, [' ^6 v2 c

9 Y6 {& a, Q' `int Cmap:oaddata(char *filnam)
  V9 @2 K! @5 E( M{
7 _5 m5 h$ q) K        int Temdata;
2 f) a. V1 h% X  t. X! f
( J3 E+ l( o$ p8 N4 p        if(filnam == "") return 0;
+ V7 [. Y6 u: o3 U8 k5 v7 p# e4 N! _: r! Y8 |
        fp_map = fopen(filnam,"rb");+ K3 g7 R0 \+ x
! a5 R5 E. \; d- o: g- r7 j( f6 o
        if(fp_map == NULL)        return 0;
  q/ l8 F: H5 @" u' M9 ~0 k3 T- G: D2 s8 R
        fseek ( fp_map, 16, SEEK_SET);
. P2 W( F6 F0 D  s8 v  @        fread ( &ShortWidth, 4, 1, fp_map);
8 l2 ]1 \$ A$ Z- O; U! A" j0 Z/ J        fread ( &Width, 4, 1, fp_map);" Q5 f! R- a3 u. O* ^, r/ f
        fread ( &Height, 4, 1, fp_map);- Q' T8 O- ]0 j( O0 F) C

* Z9 j. r4 l' x0 u# N! S        int TW = Width / ShortWidth;
& v: ?5 a/ C. Z5 M4 Z, C9 p. y8 q        int TH = Height / ShortWidth;
! x4 \  @  Z$ e* T  _. ^. C3 R9 Q/ g; P% C
        for (int j = 0 ; j < Width ; j++)
  d" P9 g3 i/ J5 @! L& |        {& h; N' ^0 X0 S( |8 s8 {
                _DELETE_ARRAY(Cell);
$ g" n3 h' s/ X  ?8 ~/ ^                _DELETE_ARRAY(Role);5 w; E- E) I9 c% X! \0 J
        }
5 C* J- Q6 Y: h0 l
$ K6 {8 V' Y* T0 c/ E5 ^' B5 X        Cell = new stCell*[Width];1 n; b2 D/ \  D9 H9 ]# G' @! |
        Role = new stRole*[Height];
- b4 |- e( Y, p" D% d/ ~' L        for (j = 0 ; j < Width ; j++)
! J# b9 h2 S" y! U5 z1 `" F        {
! a* d# n% \0 |6 s            Cell[j] = new stCell[Height];
2 {5 J, L  X7 \) X8 h1 G# ~4 O                Role[j] = new stRole[Height];        # }9 f+ r+ u  [- Z& h0 N
        }        
. }- d6 u& d6 @& A
" E3 p) m; Z$ b  t8 p        fseek ( fp_map, 28, SEEK_SET);
+ {. n" `+ H- q
" {6 ]2 D$ l1 C2 x3 o" w        for (int y1 = 0; y1 < TH ; y1++)" t: b/ j) P3 C! u/ s9 c4 U
        {
& {: P3 e8 n( u8 e                for (int x1 = 0; x1 < TW ; x1++)
$ w* y1 k& r& ^2 q" B                {& X$ Z% V6 o- b" j1 |
                        fseek ( fp_map, 20, SEEK_CUR);0 y" ]8 W  |1 b# @! M4 [
                        for (int y2 = 0; y2 < ShortWidth ; y2++)' D) N  i% l5 t9 k$ X6 F
                        {
8 V$ k# X( ?+ x5 x                                for (int x2 = 0; x2 < ShortWidth ; x2++)- ~! V3 ~/ C' a* T& p( A" g
                                {3 B6 G+ O0 w) {1 s1 G+ r
                                        fread ( &Temdata , 2, 1, fp_map);
1 _$ {' G$ _0 c/ Y9 s) y6 M3 V& |                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
" x$ o2 f7 p2 R, [: y( w# q: u$ y: v4 ^# v* b
                                        fread ( &Temdata , 1, 1, fp_map);
, i, g+ a+ D9 M. A7 A                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
9 v+ w0 r( n' o" r& Y8 a6 J6 U6 q2 a6 Q& y
                                        fread ( &Temdata , 2, 1, fp_map);; T; T; j! A; L
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
) a# d, F7 X% U! o3 I  m& r) W5 t
% C; Y6 G$ f  l+ b0 ~) q7 D# r1 X& T: O                                        fread ( &Temdata , 1, 1, fp_map);
# h- F( G8 W, N& W                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
+ e# ^- O' V. W. S, V' N1 t                                        // 6个字节
* @, C* s* J3 v9 o  `# q# u
5 q3 h- Q* P* |5 N* X3 Q0 H; a                                        fread ( &Temdata , 1, 1, fp_map);
9 U, o7 I7 K' m) U                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
# i: o5 C6 E- ?9 u& Y                                       
( Z; p3 l! }, B2 {                                        fread ( &Temdata , 1, 1, fp_map);
2 `9 J' L; I% R, D                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
  _; h. W% N1 `' d( }( i' u0 G7 e1 e+ }% N9 p+ ?0 }
                                        //fseek ( fp_map,3,SEEK_CUR);
3 [* S1 |, G$ m8 O0 R                                        fread ( &Temdata , 1, 1, fp_map);
' i. V7 u) v" T! T4 D                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
' x* w" r1 x4 Y                                        8 x& H( M* _' |  W* g9 Q" z
                                        fread ( &Temdata , 2, 1, fp_map);
; N: a+ J, |# D' P/ @+ a. }                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;# I, ~' W% g' Z- f, B  G

1 b( S  I/ X) |                                        // 1个字节
3 T9 x/ _# ~- @7 U+ R  O                                        fread ( &Temdata , 1, 1, fp_map);' M+ y3 H  Z: B& k3 B$ S
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;, W' ^0 S& E/ [# Q3 G+ z
                                        //if (ftell(fp_map) > FilZize) return 0;( ~' ^% G/ H* q/ i" C
                                }, ^0 @# n4 J2 D, s- R
                        }
7 s/ q  B# U7 J; [6 q! @                }
7 s+ |5 K0 D/ v0 T        }1 u8 l' ~, [! P$ l; W& K

& Z" @0 e; O/ N        fclose(fp_map);+ A+ t3 ~" a" n# _& S$ d6 k! Q4 N0 p

) S# E5 X% Q" y# x, g  C/ B
# U+ Q# W# ~* e% e- p0 v        return 1;5 \% E1 X' C* d7 [8 T) Z7 v6 A
}

# _) _2 Q! j/ @" q& T" U
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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