游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。7 P! m1 }- _6 C4 r

- h. i, q9 \2 _7 E) p. W    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。2 [- N: J3 u' P* ~9 ?# r
1 L' }6 q+ f* F0 s7 v
    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 地表一层的序号: y4 ~& ?: E: Q4 p7 c5 N

8 D3 _5 ~' c7 M03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
- O8 ~  H! ~! g% b3 a9 @8 S, r4 m7 W07      在地表二层 12 01 这个大序列下的子序列编号
6 a4 T3 w. G! e& B& X  ?6 ]1 ?" U86      物件层的大序列
2 T( V4 U) G& U( ~5 p2 P6 B4 m00      物件层的大序列下物件的子序列编号8 ?" h) x. G. ~0 w
03 03 00  目前不详! f3 V+ Q6 \0 I3 p% x6 }6 s% }
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
  d% n) f- s# i6 T+ ~/ H. d
2 h* V; }: G) b8 K//************************************************************
) N, e; I: J% @2 r2 K# d. f' x// 加载地图基本数据函数;: m) c- s0 C, e
//************************************************************, O% @* u  _/ R- L, _( [2 g: e# k
) ]0 `5 ]% D. F8 d2 _
//************************************************************
* E2 n7 I4 ], `. h: r// 加载地图基本数据函数;" L8 }- s: S, @; `; D, ~
//************************************************************6 w5 p* m7 ~" B( z
" s6 b0 u* s0 W8 J4 E* O1 ^) @( f
int Cmap:oaddata(char *filnam)8 l% H4 u' e5 o+ [. @1 X. K
{4 x5 N" T6 c$ u+ p* o
        int Temdata;+ N% C9 O4 W+ r

( u, j+ L7 e- U: t+ F0 S3 C        if(filnam == "") return 0;% M3 U0 |, |0 f

6 x: A7 ?# C, _! H# E- t1 U# d        fp_map = fopen(filnam,"rb");  i6 K7 x  i5 S
- J+ n' n4 j* q/ s
        if(fp_map == NULL)        return 0;
! g9 U* j, h: R; t% R% i8 C# b9 A; k
        fseek ( fp_map, 16, SEEK_SET);
% \7 ]9 A9 I* ]3 i3 O( A        fread ( &ShortWidth, 4, 1, fp_map);" ?( [3 k/ V9 H0 W5 X2 F$ d
        fread ( &Width, 4, 1, fp_map);7 q+ Y8 Q1 a/ x% e5 n
        fread ( &Height, 4, 1, fp_map);) ^3 ~& d+ r' V5 V4 N* f

7 p4 F& p3 s1 _        int TW = Width / ShortWidth;% G8 q9 k: }2 u" k' {& S
        int TH = Height / ShortWidth;' e# }8 T9 P- Z$ F1 c; a

" }0 R' W2 m; ]! g' R' ^* r6 s2 N        for (int j = 0 ; j < Width ; j++)% g* N1 `' E+ [5 [/ `
        {9 x" t2 E- e$ W7 V  l1 h6 w" j  h
                _DELETE_ARRAY(Cell);0 u8 K$ `5 |: a+ @' }& ?" Z
                _DELETE_ARRAY(Role);
: M; c# X& [6 }( `( |3 x' m) z        }0 K/ I! @7 |; g8 F0 y* |

# ]2 @* p9 T6 ?2 H5 N6 w        Cell = new stCell*[Width];6 W% ?+ U$ q. ]2 D/ n
        Role = new stRole*[Height];9 |! D! p- ?) k$ [* c% [
        for (j = 0 ; j < Width ; j++)
) |  @' H# ~% ]. W4 @0 M( k        {
0 T. _4 @* T) x            Cell[j] = new stCell[Height];/ u4 H3 x& y9 ?  S+ F
                Role[j] = new stRole[Height];        
: o& {% @. O: J        }        5 K8 T, v3 S3 Q2 G8 m, I, u9 }3 l
8 J. _" l3 ]& _8 ^% h! m- \9 M
        fseek ( fp_map, 28, SEEK_SET);
7 K7 r& \( [; F+ c2 {6 [, V, t7 _# n9 }7 E: X; C! J# z
        for (int y1 = 0; y1 < TH ; y1++)) Y9 T" y. \9 ~" A' a- s: h
        {5 `0 ]6 P, u* n& i
                for (int x1 = 0; x1 < TW ; x1++)
+ L- O- r6 T1 B                {
$ {* e2 j7 J: h                        fseek ( fp_map, 20, SEEK_CUR);  n' z. K! o# ~' i. k% }
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
: E: p: `& h# g                        {0 d. Q1 v! g+ t! J
                                for (int x2 = 0; x2 < ShortWidth ; x2++)
" |6 T6 y# A0 `9 E                                {0 t( \$ l2 u2 H4 y+ G5 M+ `* J
                                        fread ( &Temdata , 2, 1, fp_map);
( t) Z4 k% f9 T9 I. O3 E& v                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
% E2 L% |+ R$ s9 s
1 w2 _, l' i+ m                                        fread ( &Temdata , 1, 1, fp_map);
% ^7 p) o: h+ s, `# w. C) k; |$ j+ s                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;; I( `% i( s- t

' X% s- X" j+ `% E+ S; D                                        fread ( &Temdata , 2, 1, fp_map);% D% a/ j5 q7 O& R7 w; h) }# w6 p. @
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;0 e2 T; D9 V1 B, X

$ g; j2 p% w, J$ c                                        fread ( &Temdata , 1, 1, fp_map);* c8 |4 l  Z9 O8 l9 }
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;. e+ o5 T; N" i" ?1 f
                                        // 6个字节6 g* n  t# E3 ]

, X. Z4 b% N4 w4 ~                                        fread ( &Temdata , 1, 1, fp_map);
3 y8 g; L* c7 o5 n                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;' o, j' F( k& a0 T
                                        9 u: A8 g- [" I- `: }
                                        fread ( &Temdata , 1, 1, fp_map);! D" c+ B2 B( W+ P- w
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
& D, N2 R; _1 J- W/ t
$ C8 r( }$ s( q                                        //fseek ( fp_map,3,SEEK_CUR);
6 v7 A, r5 K/ k8 H) ?- Q0 ?                                        fread ( &Temdata , 1, 1, fp_map);
" M. C8 P- Q+ }$ f- f' ^                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
: X4 M  @; C. p                                        * I; z( i' W8 G) w8 y3 Z. Z9 _
                                        fread ( &Temdata , 2, 1, fp_map);( s1 a1 Q% a5 c
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
' U8 @  Y/ G# C8 T* K! z! H. b0 _+ E! _1 D3 r
                                        // 1个字节: J& v$ v  j1 M$ T6 C, I1 E% ~5 C
                                        fread ( &Temdata , 1, 1, fp_map);
* ~# V6 D7 |0 Y: M                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
$ ~2 X9 W) n" x; q  b                                        //if (ftell(fp_map) > FilZize) return 0;
0 @7 C2 y$ T4 b0 l# W" f# a                                }
0 {1 d9 m8 H* E. [                        }) y1 x; r# V) x' S
                }
: |& V" n4 n6 g8 \  Q        }
$ Q( `# u. n% r0 e: l: R/ h' w$ l5 Q. l6 t. p
        fclose(fp_map);( w0 u0 k9 K/ J! y3 l

# }/ S  X; N: A, b: x
5 y- y; y. c( d9 }1 `; z        return 1;5 }' Y7 z1 k7 k  b+ B* ^$ `  x
}

3 e$ I/ F4 o1 g* J2 i% F
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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