游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。
) H0 e/ `/ M: O, H; Z- ?' x5 L5 `! G) {% \( t* c" V; y- e+ D
    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
; ^- k" y4 z& R# ^2 S- F3 T8 r4 q% |
0 _9 S/ |/ r" P+ A" D6 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 地表一层的序号9 j' t/ ^7 m- t2 w

5 {* \7 M. k" Q9 t; V0 l% x5 M" T2 I7 g03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
2 \2 Q' h+ n. E, e' X( `8 A07      在地表二层 12 01 这个大序列下的子序列编号6 f; }. L( |+ O7 Y/ a6 a" I
86      物件层的大序列
' l+ Q: K1 n1 V) o5 H00      物件层的大序列下物件的子序列编号
! s0 j6 T6 i  k+ h$ l) j03 03 00  目前不详
0 L/ }/ o+ ?1 s4 X: s) q' F6 E01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。+ L! t. W# c7 w1 ^# b2 j
+ o& B3 ^. I* \, S  U: Z
//************************************************************) D4 Q8 r8 [" Q9 {9 E
// 加载地图基本数据函数;/ a" N& z' Z- s
//************************************************************
2 R' q2 c3 r7 Q; {; J2 x* j" J+ r; M! T
//************************************************************' }3 d  f( b( H1 T. U
// 加载地图基本数据函数;0 ^. {8 Z5 C( f# k) V8 \5 W
//************************************************************( o( T; n) |& t, j
, D! e8 a- V8 C9 S! l0 `: `
int Cmap:oaddata(char *filnam)+ Z* d7 u+ @* y! R+ T/ L+ M
{
7 R, h6 m/ X1 b' b8 ]- ]        int Temdata;
8 n# j/ ]9 B& ?8 A
" {- v7 k# V% _$ d$ W        if(filnam == "") return 0;" K+ n' d& q$ f& O
/ v  _: Q0 }, i0 ~1 Q
        fp_map = fopen(filnam,"rb");4 C8 q: H. o1 S# m, \4 N6 a

0 N2 u* L8 Y: T- U3 S        if(fp_map == NULL)        return 0;! ]# l) Q. _% z# C6 t1 o7 K8 x7 T# ^
- _& `; I2 `4 a
        fseek ( fp_map, 16, SEEK_SET);( [# D* {* v/ x4 {
        fread ( &ShortWidth, 4, 1, fp_map);1 h. L+ f' Q' @
        fread ( &Width, 4, 1, fp_map);
" o, ?: V% i6 q6 {        fread ( &Height, 4, 1, fp_map);
7 x3 W! _0 y! H8 @% S7 n' @7 J$ K- a! m& B8 G9 y# M
        int TW = Width / ShortWidth;
* l) m: T/ t* z, p4 C) F        int TH = Height / ShortWidth;8 J' h. C1 K! l

' ~$ Q6 D" L! i; [, y  r        for (int j = 0 ; j < Width ; j++)" H2 f8 h! o+ S/ v' e$ p0 ~
        {
$ S3 E' B4 R7 z0 I/ R" F3 J! V                _DELETE_ARRAY(Cell);) V+ q. ~8 y# m/ U; x
                _DELETE_ARRAY(Role);
( a. Q0 `% m: }% P! e( \( k        }- D5 p, ~0 H% ?
) w% @& S4 q; q5 T$ S' y
        Cell = new stCell*[Width];
' x- t8 S2 i' h7 S5 ^0 _( \- b        Role = new stRole*[Height];# ]! @0 w7 R. m  W! j! C# w
        for (j = 0 ; j < Width ; j++)% U" z$ O1 F/ z4 C3 @9 Z
        {
% U, x: s# T0 c( u            Cell[j] = new stCell[Height];- H: L- g7 l' m% F+ }  C! r" o
                Role[j] = new stRole[Height];        
6 l: A# t; r/ @2 A. M% ]: D, e        }        
. R6 G. H- l  i! R! @# Y7 p8 g# d6 v7 B9 o  p( [
        fseek ( fp_map, 28, SEEK_SET);. x  n9 p2 |* d8 S/ J5 N
) t1 u: R  N+ l" ^4 i7 R6 Z
        for (int y1 = 0; y1 < TH ; y1++)8 @! G3 F; l+ k
        {
! [: o% c; Y, i/ J6 w8 H! P. T5 v; c                for (int x1 = 0; x1 < TW ; x1++)( e7 \" X) _7 J  _) l
                {
( B8 F( V+ Y; I+ }. _3 ^; t# `' `2 R8 G                        fseek ( fp_map, 20, SEEK_CUR);
) w- B0 n6 L4 w  `$ G                        for (int y2 = 0; y2 < ShortWidth ; y2++)3 }' v& ]: ^2 W% A# r6 \# y
                        {* u  Q/ [8 m9 r2 n' \9 l
                                for (int x2 = 0; x2 < ShortWidth ; x2++)
+ F2 F$ o) U/ H8 T- P2 R4 |9 ]                                {+ M: I% l& ^# c9 K% s' b
                                        fread ( &Temdata , 2, 1, fp_map);
! V* |7 F  ]5 P9 {( n                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
* W  b2 v/ n' @! I/ \/ H+ C( {* f
' W3 C' }0 F2 i                                        fread ( &Temdata , 1, 1, fp_map);6 `# N# w" x* D% ]' @. W  i
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;7 `9 x# B8 D# {7 g) p( c

, x8 S# @4 O5 E* F3 ?. `                                        fread ( &Temdata , 2, 1, fp_map);6 _: d; U6 d( b+ y
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;. l5 z4 h4 s( \6 l9 k
7 }3 C* M. v4 u+ L
                                        fread ( &Temdata , 1, 1, fp_map);
. p7 v. @0 x5 R                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
( u3 k  D! Z& f* |/ ~                                        // 6个字节
# }( _) V- h8 z% W
: h& P8 S, q* \. _# D                                        fread ( &Temdata , 1, 1, fp_map);
+ \% b& N2 n2 I/ N                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;6 {' P0 b, o; e  q$ f  C
                                       
) o0 {# P0 O; `% d                                        fread ( &Temdata , 1, 1, fp_map);
  S4 D5 {; N: V0 [( L( s                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;& W, f3 e* m2 a! {, x9 o

) @" v! P# w- \, ]% h) S                                        //fseek ( fp_map,3,SEEK_CUR);
; ~2 }& S7 ]! h                                        fread ( &Temdata , 1, 1, fp_map);
) K! i7 b. @, Z8 z                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;2 u0 I7 ]/ W3 E" Z
                                       
5 U" `8 o* w: S+ X' H+ M7 p; E' o                                        fread ( &Temdata , 2, 1, fp_map);+ t& Z, t7 H( M. g+ @8 W
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
( d. i3 `3 B7 W* e! n
# s9 \. [. o+ N" S                                        // 1个字节; @3 o- x! r1 I4 K# M6 [( O
                                        fread ( &Temdata , 1, 1, fp_map);( j# r0 X7 C% d: f/ A& s( d
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;! E& e2 k2 l: x6 _) \' V! t
                                        //if (ftell(fp_map) > FilZize) return 0;% R# w( j/ A" T% i5 U! F
                                }
/ Z' i# V+ M/ l3 L5 T0 s7 k                        }
+ Z3 v) ~8 }' i- h                }
( e& U; W3 v  C0 m        }
6 l6 C1 e1 [6 B! C) Z( s8 ?
8 D* w) P; E- j' t/ G. x        fclose(fp_map);: }  Y# v( Z, C' Y
. H" Q7 ^/ O) \' q8 D4 q, I
* f% M* Y+ R) h  L2 @: G
        return 1;  w1 A/ e) Q0 y  L; g4 D* I
}

& V2 B2 E2 I9 m! ^- A
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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