游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。+ H* I, y; f+ n  |0 e, k7 c

4 L% y) Y- N4 N  h* o8 l- H    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。6 v, I: a; S9 R  _4 G
! ]" t! q6 H4 V7 t3 m# A
    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 地表一层的序号
/ ~- S' j* w& o6 }1 ^* A
7 S9 p- |% A0 Y; W7 p4 n) H9 y" T" |7 L03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
5 H2 P8 F% Y! j2 |07      在地表二层 12 01 这个大序列下的子序列编号
+ ^  X5 g" k) P) H# r86      物件层的大序列# S" z: j% g6 p) \0 m
00      物件层的大序列下物件的子序列编号
7 q6 a% b9 g0 R8 _4 f( m0 M" i" {03 03 00  目前不详' A! v7 n( F+ x% H
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
; Q* C0 j: W/ J6 c; k9 E% e0 e8 H6 T6 f8 e, S- Z/ O* b
//************************************************************, E# _* Q3 q5 `; \* M
// 加载地图基本数据函数;
) |, o6 X1 o& e. r//************************************************************
: O0 e* r- Y- o4 ^) ~
( I) q7 E; ~( c0 w# ?9 q//************************************************************
% e5 v0 g, u8 S$ `) H// 加载地图基本数据函数;
8 U3 v- E, I% v" w//************************************************************
5 X9 A+ P: n% I) K: _
* H9 \! b6 \7 T! l  U5 Kint Cmap:oaddata(char *filnam)4 u# J; T8 k  B5 m3 a; @2 p, b
{
) o$ y5 [& g3 K- F        int Temdata;- T! U4 E" C, i9 _
+ F: b& {4 i' `8 W6 L0 D8 i* T( o: l
        if(filnam == "") return 0;1 M) m# X$ t8 A1 d2 ^

$ C' A; O, x& r1 Q- W        fp_map = fopen(filnam,"rb");% [& K* L  Q3 u0 {. a9 @* H& ]
% J# S7 _2 f0 A2 }
        if(fp_map == NULL)        return 0;) z+ P) a% }- ?# z

  H9 i* P  c3 V. z4 o$ N- F: l        fseek ( fp_map, 16, SEEK_SET);
- E# A% s2 J4 Y/ N        fread ( &ShortWidth, 4, 1, fp_map);3 J* r" X$ P8 r9 l
        fread ( &Width, 4, 1, fp_map);
" W; X, j/ O3 O. `! {, b8 r8 S" c        fread ( &Height, 4, 1, fp_map);
; [# G  ^. w% E9 p2 f
+ T0 w$ B% p! Z, r# s$ Y+ q5 s        int TW = Width / ShortWidth;
2 c4 q! ^  s0 A        int TH = Height / ShortWidth;1 T' d3 X. r+ D1 E' `1 j1 ^* z
# }* J3 s2 [* V/ B
        for (int j = 0 ; j < Width ; j++)7 p9 [7 J# _& e; h4 [
        {' m! e) t  K4 c6 R* t8 K
                _DELETE_ARRAY(Cell);
3 K0 ^+ d' j& ^: }$ t# {5 |                _DELETE_ARRAY(Role);
, S3 ~1 z+ M4 v        }
* l% I$ w' B/ T7 d  f
+ E$ t5 J& a8 N* Z6 n0 r        Cell = new stCell*[Width];1 U+ R* D. h! z
        Role = new stRole*[Height];% U& [% k% a6 g4 i; r! w
        for (j = 0 ; j < Width ; j++). `: d4 _' W/ D5 n) E
        {" Z3 Z' F0 I  \# Q: l# B
            Cell[j] = new stCell[Height];
& U6 Q: t7 u! J9 D' H: b, n                Role[j] = new stRole[Height];        - \' ]3 J9 w4 F' j
        }        
* v" A7 m2 R! m! k6 Z* E+ p8 H  w/ i" Y
        fseek ( fp_map, 28, SEEK_SET);7 c" [. k+ @/ U- ]; L5 _  V( e! }! b

/ L5 q7 W9 h; r+ x        for (int y1 = 0; y1 < TH ; y1++)8 W' C5 y# d. v  ~
        {, x. j1 X0 Q" N, Z. B
                for (int x1 = 0; x1 < TW ; x1++)
4 u4 I% z& ^- V4 j0 t- y                {
; ^$ L  w2 K  N: C                        fseek ( fp_map, 20, SEEK_CUR);
3 K4 Q& g4 u5 j# ^( s' }' t* f, x: k                        for (int y2 = 0; y2 < ShortWidth ; y2++)
. H7 z9 o6 F* l, M- K0 m                        {1 u1 h& e% ~6 ^) H& ^: g% Z" J# c
                                for (int x2 = 0; x2 < ShortWidth ; x2++)
! q4 ~+ ^7 f4 n" h, ?: J  {4 ~2 ~                                {2 F( n& I! w% S7 |4 f* {( y" A
                                        fread ( &Temdata , 2, 1, fp_map);
! m( e4 z: N& e                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;; ~; l( c4 B% v4 n& {

) x3 s) h# F$ P4 c2 i3 W                                        fread ( &Temdata , 1, 1, fp_map);; y  K  [4 m! p  D
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;3 ^. Z+ d4 d7 `9 l

! \: f9 L. m$ y5 A% g! T                                        fread ( &Temdata , 2, 1, fp_map);1 i0 b" j+ N3 U$ B8 O
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
7 y9 [* U2 ~4 y/ `
8 B  {' l0 v( g                                        fread ( &Temdata , 1, 1, fp_map);
/ |( ~1 v: g* s; O; f                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
4 M1 _# Y! x4 ^. _) A' T                                        // 6个字节
' B- z- I1 }5 ?' p4 y; h
7 o7 z6 ~, V6 S: W8 A( Y7 b                                        fread ( &Temdata , 1, 1, fp_map);8 A$ t, U- g/ I
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
" X4 [. o/ l, T! a2 H( [+ r                                        4 |. @$ D) F" E1 G! f8 O
                                        fread ( &Temdata , 1, 1, fp_map);4 @- ?8 E# }5 q5 k
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
3 {- O1 W8 K# j0 y4 `
. B; L$ C. A4 a# J& l# T8 O                                        //fseek ( fp_map,3,SEEK_CUR);
6 M! j4 X) P' @+ p; p( s                                        fread ( &Temdata , 1, 1, fp_map);
2 m5 c8 X" g8 h2 [" B                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
9 }) u5 }. x8 D3 w! o                                        6 j, C/ J: M6 w3 k8 S1 ]
                                        fread ( &Temdata , 2, 1, fp_map);: X" }( n' O& p# k: ^/ g% `
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
% E' ?" F7 X0 f) m) P0 |+ J5 }6 v' _2 M
                                        // 1个字节! q% ?! [8 T- x4 y  A- I5 q* S
                                        fread ( &Temdata , 1, 1, fp_map);$ a7 i& k2 _- u; L3 y) _3 w8 A# {
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
( r" R. Y/ R- V# h% w                                        //if (ftell(fp_map) > FilZize) return 0;
0 H) U, ?3 B4 V9 N. i9 [                                }, d% |2 F, q4 P
                        }
8 B0 y, N$ }. `6 M- k0 z/ _3 e, _                }
' ~5 I; K4 a7 J! J3 c        }/ R3 ]9 K6 N6 F

9 S9 u8 A9 F; r3 r        fclose(fp_map);
8 Y( D- }# O( d" t& Y3 E' ?* p: q3 ]. z3 t6 y/ i
. F7 Y. T9 U- x: w9 W7 D
        return 1;
& _  Q; u; L7 `4 s! q}

. [" Z' J$ C, j/ m: D, ^0 D
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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