游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。
/ q! p- A7 S2 G; v9 I7 _' B) D6 a9 I/ C8 O3 A6 t2 O. J0 o
    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
% x: L. U8 W/ `3 F* A$ c9 W9 }
    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 地表一层的序号6 L' [; ^& E* i( E3 ^
3 `: L4 z# a6 S
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
2 n, _, B9 |( }+ `: \. M07      在地表二层 12 01 这个大序列下的子序列编号
: H  J/ n' ~; A$ T& J( F86      物件层的大序列
* I: z; {# d  w/ f/ a5 r00      物件层的大序列下物件的子序列编号
9 N3 X, v8 y# j& N6 ?03 03 00  目前不详6 {$ {; Q  x* i1 W- o) V( T! Y
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。, I3 C1 K* \1 C! r  }

) T0 {# ~2 k4 ^; U8 @4 G//************************************************************
+ M% V2 v8 e8 w( T// 加载地图基本数据函数;
- [* H+ Q3 e4 B. M; z1 Z//************************************************************
4 \, {. h* y; c$ ^4 y9 h( w4 f& i5 U$ Z
//************************************************************7 `, |# }. }1 r) X9 Y
// 加载地图基本数据函数;) v" t7 {8 ~( N0 h# v/ E
//************************************************************! c& t6 V6 r) a. ~$ U( z
' Z8 N/ \1 u- \1 T' V' f0 a
int Cmap:oaddata(char *filnam)8 z6 A/ y: k8 _$ F/ W% |% b
{
' H9 J9 \$ f8 g/ R2 n' A        int Temdata;4 L$ e+ z, z8 B7 t$ V1 ~
8 O; R1 D( I0 b% v
        if(filnam == "") return 0;
( }1 g5 r5 u! N$ ?
' U7 o' u8 \! }/ l  F/ @" Z        fp_map = fopen(filnam,"rb");
; M# N7 H3 B0 j, c! ]% T2 Q. A3 Z8 B) F) {: r9 s; \: z' F
        if(fp_map == NULL)        return 0;* T+ y- S: W6 ~1 _2 E5 _' X
# K0 `  I) Y! k9 Q* k) _3 }( f
        fseek ( fp_map, 16, SEEK_SET);& Z9 Z) {2 y: b7 c' `( D6 o5 i; n
        fread ( &ShortWidth, 4, 1, fp_map);! k8 h: A* M1 o0 E- F
        fread ( &Width, 4, 1, fp_map);3 X7 o6 F+ ?$ \8 M
        fread ( &Height, 4, 1, fp_map);
# s7 o6 a! l0 p; v
* e/ F$ o: L2 m0 h$ m        int TW = Width / ShortWidth;
/ j8 N9 U) Q3 `  r! S4 q1 i. n        int TH = Height / ShortWidth;  G; u" R: r% J" ?
: P0 y2 m  b8 ]; e7 f( W
        for (int j = 0 ; j < Width ; j++)
$ j) ~, u0 e( Y        {; v0 {" H" W" t# ~- a/ p
                _DELETE_ARRAY(Cell);; \- L$ b8 d3 B5 j. v
                _DELETE_ARRAY(Role);% a( c0 Z# f& d; U& p  t6 d
        }* _1 q: m! t0 Z: c, \, G

0 v+ p8 v0 S7 R        Cell = new stCell*[Width];
1 X& `6 C2 B4 k; ]. x        Role = new stRole*[Height];
+ J1 y* M1 g/ e4 M4 M* V% U        for (j = 0 ; j < Width ; j++)
/ ~8 N- {/ ~- k        {
! B" G2 k' f% s! K            Cell[j] = new stCell[Height];
1 Q, x2 [2 E' a& ?0 h4 x                Role[j] = new stRole[Height];        
$ {& S- f* w, `- Y! t        }        . t9 V# `. Q, @& f, I) ^  W

7 t6 N- w) E0 H* L3 Y( S        fseek ( fp_map, 28, SEEK_SET);
; E/ V9 h/ ~' X( B) F2 @: ^: b6 E8 ~# M
        for (int y1 = 0; y1 < TH ; y1++)) G7 [& I7 x4 [6 M
        {, Y. x( E6 r8 N
                for (int x1 = 0; x1 < TW ; x1++)
$ b  x" w* ~* o; ]) }% g                {
, k# r1 _, a5 d7 V# a/ p                        fseek ( fp_map, 20, SEEK_CUR);9 }- D1 S% D" ~! G& v. y8 x3 L
                        for (int y2 = 0; y2 < ShortWidth ; y2++)) W: M# ?7 q% [
                        {% P9 G4 E8 s' N) F# O
                                for (int x2 = 0; x2 < ShortWidth ; x2++)
5 S: h* C$ S3 G/ R                                {4 A: @' U- k8 r4 S3 f# x
                                        fread ( &Temdata , 2, 1, fp_map);
' r; b. y" R& I; R! p                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
- F, B  ~' u7 s3 r" K6 o3 m0 B! c$ l+ }
                                        fread ( &Temdata , 1, 1, fp_map);
* Q, \# R$ e) l& `/ |; ^& c! B# b5 d7 x! @                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;! }$ S9 F* F7 L) H" B* b# i
. a& R* f- }& O/ C
                                        fread ( &Temdata , 2, 1, fp_map);" Q- ~6 I, p3 q6 w1 |- I) ]
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
/ \7 k0 }6 o! Q3 I& o; r8 L  `
0 R( u- ?1 O( g3 N1 C7 m                                        fread ( &Temdata , 1, 1, fp_map);3 E7 }; {+ {0 h/ M2 M
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;6 d- x! S, P; n/ f% R2 ^! a: m
                                        // 6个字节
+ H1 t0 J5 M- `" B+ q9 a5 }1 C" S1 A% j7 S. @- p1 D- [% i1 u( W
                                        fread ( &Temdata , 1, 1, fp_map);
$ v9 A# s& B# S- k9 ?                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
: F( ^9 R0 M7 g$ i! q2 j  g                                       
3 J6 b+ r2 k& d5 R% k                                        fread ( &Temdata , 1, 1, fp_map);
; Y/ t/ U* e/ C4 R0 K                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
- l$ A5 W# H' x/ h9 Y- O% p6 o5 ^6 `- b4 F
                                        //fseek ( fp_map,3,SEEK_CUR);
" j  P2 W1 N+ c3 z& Y+ b, |                                        fread ( &Temdata , 1, 1, fp_map);
  ^! I* v2 L* W- d) c, ~                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
' o3 X$ F" b1 l. Z4 n0 m6 ]                                       
) C. C& a& o  p+ i/ X8 U                                        fread ( &Temdata , 2, 1, fp_map);
: \: J# q4 P7 \7 }                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;; {) ?/ |; R% U" T2 m: X' g0 }

: d8 A/ @1 \9 j8 B  K                                        // 1个字节' _/ x5 Z/ C  i+ G2 G
                                        fread ( &Temdata , 1, 1, fp_map);
% h. C. ]/ a, w                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
$ a& V& T5 \! s5 x                                        //if (ftell(fp_map) > FilZize) return 0;  ?/ ~+ E! l, y! O& c) E
                                }
2 S3 }' X. p& N) {1 N5 D+ ?& }                        }  a0 ?4 _' d. v+ `
                }
! D" l: w* ^' s5 h8 [        }
( }, j3 ]) f7 T6 W
9 N; E5 Y. j7 |" D1 @5 L8 J        fclose(fp_map);
- D, _) N( v$ ~2 T7 l) e/ e' K7 x/ H& a
% }9 c5 Y3 Z/ q' O" F0 Q" Q/ z
        return 1;8 j& T2 @0 ~; X) t  k5 c
}
& d0 d4 S; h7 `' X7 M- w7 q
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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