游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。2 e. X) z8 X, a5 M. J4 c% [
* I+ U; ^  D6 A
    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。  D# J# @! j: x

$ b& t9 A9 {5 G% f5 Q6 ?7 H    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 地表一层的序号
0 y$ h4 m% |3 C- U4 Y* P' y3 q. O' H+ N. o
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
6 x' b" s+ g9 s% R) @9 u07      在地表二层 12 01 这个大序列下的子序列编号
9 _% {1 l: ^' F( L3 P6 L- L3 m' J86      物件层的大序列
8 x% F; i# B& _& t00      物件层的大序列下物件的子序列编号
/ a) w& h) B# t0 e$ T/ s* s03 03 00  目前不详6 `. K3 e1 P: |3 p
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。, W9 I' I6 v, _9 p' A5 l$ D
% C0 W8 k4 u! t1 }7 I
//************************************************************
+ O1 f# i2 `, }, ?4 w// 加载地图基本数据函数;, U1 L$ P; u9 m3 [
//************************************************************
4 x. R; Z6 |# a' K! F: ^1 E) f$ L- C8 e6 r6 z0 S7 |' O
//************************************************************
4 P) z; Y2 f+ k' |4 j5 @! H// 加载地图基本数据函数;
' ^" z5 d) P; n! f8 s//************************************************************5 U( {8 ?- C) a* \8 b; V+ s

3 c8 p! |6 P, U& ?4 z' E, M0 Mint Cmap:oaddata(char *filnam)* @, V2 T3 |: v) ?: _4 F- @! E% X
{
1 g6 H* c% p) m0 f) Y$ O        int Temdata;5 n0 U. u! J% [" s" T4 [; t) G) i
" E9 K" h' _/ P/ ^$ q6 D
        if(filnam == "") return 0;% j; _1 m0 g! @) b1 m% r* P& m% F# x
$ u0 R# t$ q& o, v3 W
        fp_map = fopen(filnam,"rb");
. d: [- P  z# r  i# b0 w
' }$ ~& O# h# R7 X* z" p% e9 b3 g        if(fp_map == NULL)        return 0;
5 m- e5 K9 V7 U$ f" v+ s+ a0 a5 {
        fseek ( fp_map, 16, SEEK_SET);; J, a' K3 F: E3 R1 y* ^5 \; w
        fread ( &ShortWidth, 4, 1, fp_map);( {. q) x- \3 v4 \8 B  h
        fread ( &Width, 4, 1, fp_map);
' V- E, h" ^. N6 r# y" D) h        fread ( &Height, 4, 1, fp_map);% {$ ?1 Q8 {$ H) C& ^; t: {3 ]1 Y3 @
1 M) |+ @  [5 ]5 p5 O1 Z6 `$ Q
        int TW = Width / ShortWidth;
/ L6 V* M4 x. y) j- G        int TH = Height / ShortWidth;. n4 ^$ G: g8 t+ m7 g1 h
# p) S0 W) e: z, M5 U( L1 C' p
        for (int j = 0 ; j < Width ; j++)) j5 K0 n( |& n$ v7 o8 H
        {! o0 J  P% t( [' f3 Q$ J0 g; {
                _DELETE_ARRAY(Cell);
4 K5 i- Q. Z8 L7 [0 r                _DELETE_ARRAY(Role);
2 _+ O; c# |5 l4 e- u        }  B/ s0 ?2 U, v, J: Y+ h4 h
) q9 C$ G+ \% Q
        Cell = new stCell*[Width];
# @* ~% q4 \$ u+ j0 Y* ^        Role = new stRole*[Height];5 j% P! k, Y( I6 @
        for (j = 0 ; j < Width ; j++)
, g# K' t' E. c' I! V# K        {" O3 c3 y$ [8 v/ f
            Cell[j] = new stCell[Height];) e+ L. W1 Z# C% R7 [+ N9 C% H
                Role[j] = new stRole[Height];        ' O9 w7 m+ z3 i/ Z
        }        ! ?  F  h, h$ X8 G9 ^

# k6 d6 g$ O/ ?4 r/ |        fseek ( fp_map, 28, SEEK_SET);8 o0 Z  ~) N$ ^( A  c/ M/ u

. W- b8 w% d9 ^+ A* A6 n! m        for (int y1 = 0; y1 < TH ; y1++)
+ v/ Y  y3 I- y( q        {
2 ?+ C! |- S4 F& L                for (int x1 = 0; x1 < TW ; x1++)
5 m' f' V1 y6 n, H                {9 I$ Q+ p, m' Q) n8 ]9 y8 U
                        fseek ( fp_map, 20, SEEK_CUR);
7 b; G8 [" D$ B* M4 J                        for (int y2 = 0; y2 < ShortWidth ; y2++)2 t  U) E* s0 t8 A1 {! g$ y
                        {
7 g8 ~5 o7 {: R                                for (int x2 = 0; x2 < ShortWidth ; x2++)
. V- M6 I6 @' l! }. Y                                {# U! c+ f1 B4 T% k1 U% h" V' D$ V
                                        fread ( &Temdata , 2, 1, fp_map);9 r) v2 [, W5 u* Z
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;2 |1 @, P# C/ X7 V6 ]8 n) i- e
& \9 Z7 D2 R) @
                                        fread ( &Temdata , 1, 1, fp_map);6 W  B% R1 o5 X4 D2 V- y, p
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;7 _' K: B; w- d: O$ R

3 I7 T; v& _2 g' e                                        fread ( &Temdata , 2, 1, fp_map);
0 f) n4 w5 n7 g. m                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;3 g' k/ k4 |; v2 o! l
. R3 Q% _7 l& H1 q$ F
                                        fread ( &Temdata , 1, 1, fp_map);
/ @  j  n5 q% b$ w  H) ?                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
  i1 T& u0 {! F$ m* Q                                        // 6个字节
; P5 Q& X: ?( j: _0 |! e" v  u4 [9 w
0 k+ k- c2 Q# e( e( k% M) [                                        fread ( &Temdata , 1, 1, fp_map);
4 ^* s+ w2 _# b9 {5 T$ J  `) w                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;( k  |3 Q5 w/ }' r9 v" l
                                        . h% a+ v( Q6 Z9 p0 L
                                        fread ( &Temdata , 1, 1, fp_map);
- g$ m& [1 k% U4 T5 B                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
9 a( L3 @* }( m7 x8 w7 e. ^; Q$ e' g1 h1 R9 O6 p4 V
                                        //fseek ( fp_map,3,SEEK_CUR);
/ K- h3 W7 m' n+ P* Q                                        fread ( &Temdata , 1, 1, fp_map);$ j- n5 N1 m: I; d% K$ q& f9 ]
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
& s" @: S  w8 ?$ ^( R' ], X                                       
7 R7 t# U% J$ B, V  B2 z                                        fread ( &Temdata , 2, 1, fp_map);% |9 M/ \! k) b) }+ ^* e- J
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
5 G) j/ O. @  d/ w- {- g7 z3 f) N0 r* z3 ^3 P8 Y( q+ W
                                        // 1个字节
. t$ v: L4 w* \9 d. V1 K) F                                        fread ( &Temdata , 1, 1, fp_map);
7 H+ j: Y) \6 h# n1 v4 e$ {                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;+ D. W2 b8 E0 N5 n. |7 h; b
                                        //if (ftell(fp_map) > FilZize) return 0;
: F1 M. S; U6 U' W1 u* I                                }! Y, E) ~% B7 H* g! Y
                        }
4 G' z9 d$ i3 p4 C% K$ B; @                }- ?8 U4 u( N2 O4 W* v: E) ~
        }
9 g+ u* W( [8 g$ R8 q5 B. C: {+ r
: @) H+ L. |" n; q- o7 R        fclose(fp_map);4 O5 m1 _$ U+ v% J: N+ c3 h
; h" V2 W: U2 f8 [3 H

) V' p. K: f$ X8 [' Y3 T5 X        return 1;
, W4 ], j; `) ^4 w0 Y( p, p}
: r  Q) L3 I# l
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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