游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。
4 O( o% ^+ I6 ^  {
- `3 O- ^+ P+ s# J0 `. O    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。2 h  v# p' g+ z5 B& ?

* ?( O# L8 G8 j    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 地表一层的序号' l, k2 n6 J$ ~, g5 M3 z( I8 E( Y
" G4 D& q" {" Q+ O
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号' T6 I+ G! F) x
07      在地表二层 12 01 这个大序列下的子序列编号7 z* t+ Y" a4 m# `* p) H' S( ]
86      物件层的大序列+ L+ k6 [* b$ g' C7 [
00      物件层的大序列下物件的子序列编号; w* h* X8 u- I) X4 f- U
03 03 00  目前不详. f. J, i8 d7 ?
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。+ w0 Y3 P& j% p4 Q3 Z4 [6 I

- e- e4 b$ c/ ^' y9 X* g$ K( m//************************************************************
) }+ W) T) l7 C// 加载地图基本数据函数;
8 g8 E( a6 O. [4 k//************************************************************
9 ~1 e2 x! B) p! j/ b9 B4 i. p6 Z: g; ?: j, Z$ \2 @. `
//************************************************************
1 R- P' V0 T; j$ n' `// 加载地图基本数据函数;- i3 p* I8 m/ i) E, j* w
//************************************************************/ R0 X+ t; s) x- }8 s/ e
: e1 s" Z2 G8 K5 J/ ~6 z
int Cmap:oaddata(char *filnam)$ Y7 K8 u2 _% ]+ V9 A0 G
{
9 {9 @/ g4 U8 q% Q4 e/ T( s2 X" D7 @        int Temdata;3 j; A; q* _  I1 A0 W
4 E1 K8 U2 y& M
        if(filnam == "") return 0;
: o& \2 s% d* ^: O' F$ p* n4 `6 G' U4 r- W+ D
        fp_map = fopen(filnam,"rb");
: b. r# ~+ b# i3 |% k. d) c( R: s5 B- k  c9 f$ X1 g
        if(fp_map == NULL)        return 0;! u, O4 Q; q9 G4 S" W+ H+ V

# |- _: M. p$ ?/ p$ Y9 l        fseek ( fp_map, 16, SEEK_SET);. R% b& \9 `9 K4 D, A
        fread ( &ShortWidth, 4, 1, fp_map);2 r; t% Y$ X8 E5 B: g( J* t8 N2 _1 T
        fread ( &Width, 4, 1, fp_map);
3 _* W( ]% t* |( H  l7 o        fread ( &Height, 4, 1, fp_map);
! l7 d. P" V8 F% R+ `9 O" ?
* O% m2 T; e8 p0 N' ^* u4 _        int TW = Width / ShortWidth;5 Y& n/ M  z2 G2 v; W) l
        int TH = Height / ShortWidth;
/ H+ Y" H3 O; P* j9 x  U1 u  y- q' D
' X. Z# p) _+ g4 v" D  w        for (int j = 0 ; j < Width ; j++)
$ k/ |0 e+ q5 u7 T( v6 Y5 x        {! k3 X2 e4 x5 g8 w) y/ ~
                _DELETE_ARRAY(Cell);
  C# S" `0 y* n: _, _% X3 e1 w                _DELETE_ARRAY(Role);
* \: \  S. H; B        }
3 Y% Q7 o6 u' Q/ f1 ^0 ^3 q; q7 r# G. W, Q
        Cell = new stCell*[Width];2 B5 A0 r+ R  Y5 H+ Z
        Role = new stRole*[Height];
8 ^" Q  u# C/ C' N        for (j = 0 ; j < Width ; j++)
4 \4 _! g+ X3 O        {3 L7 Q  S: z2 o1 e& Y: E! e
            Cell[j] = new stCell[Height];
0 d( j* D  v5 [, L, A                Role[j] = new stRole[Height];        $ d! a! w! \& @# x
        }        
! a5 F# B) L, S0 q+ U+ Q. [
0 g& Z7 u5 }1 s        fseek ( fp_map, 28, SEEK_SET);
# S4 R& t$ j3 Y2 S( R9 X+ ]8 C8 [* k# F  e( C
        for (int y1 = 0; y1 < TH ; y1++)2 Y& B6 S1 \1 K8 x2 u
        {; L7 Q% i2 M# U8 y
                for (int x1 = 0; x1 < TW ; x1++). e4 `" l, l$ a. \4 U5 ^
                {5 s8 q& x( C: G' f, t
                        fseek ( fp_map, 20, SEEK_CUR);
/ W; m* Q6 D3 f9 D                        for (int y2 = 0; y2 < ShortWidth ; y2++)
! Y* |7 t5 X. b4 n                        {* s9 G  p2 f& ^# A4 l! |& R9 l" f
                                for (int x2 = 0; x2 < ShortWidth ; x2++)
  i) Z" }8 c3 r                                {# K  a# R4 ?& J8 \  Q( i- q  K
                                        fread ( &Temdata , 2, 1, fp_map);
1 x& y: l: F' Z' Q- t7 F                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
5 V1 F! h/ k7 e8 l& J) a
0 W7 ?( I1 e9 c" q* n3 _4 X                                        fread ( &Temdata , 1, 1, fp_map);
5 ~* M) _6 ^6 I8 i                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;) f! }; l1 z, j% q' q* c! @( D8 Y* C
% l; w. O, P& j6 S  B
                                        fread ( &Temdata , 2, 1, fp_map);
1 f, e1 @# t  i+ g" ]$ _  c                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
" J/ Q" }! ~9 @# g7 t+ P7 k1 U2 S
                                        fread ( &Temdata , 1, 1, fp_map);& u: Y) }$ Q, ~$ V1 Y
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;* o) @' x# l* j; |. Z+ M
                                        // 6个字节
! b2 T. S; u7 N' z& e
0 H: _; U1 J7 ^! J1 D! _                                        fread ( &Temdata , 1, 1, fp_map);4 C+ O1 L; t: o: y& Q
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;4 d) ~" j5 b" V9 ^( s
                                        1 p! U. t$ B) ]4 l% n
                                        fread ( &Temdata , 1, 1, fp_map);4 }# R$ I( n; M/ H( T! C
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
2 Z* y: X0 l0 l3 t+ T* Z) |$ W( T) R! p$ Q4 W' S
                                        //fseek ( fp_map,3,SEEK_CUR);
8 G7 p7 j5 y% X3 W4 u" r2 y                                        fread ( &Temdata , 1, 1, fp_map);
. F' d- b( f/ i4 n; G                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
- \0 s( i5 g8 T1 o$ m$ Z+ t6 S$ L                                        7 s$ ~6 O) q7 o
                                        fread ( &Temdata , 2, 1, fp_map);
4 c* V# a! _' f                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
" L& G" j- T8 Z7 m
% `7 W+ c% i$ x2 A6 A; e. u                                        // 1个字节7 b5 _" o5 X& O9 S" l& t
                                        fread ( &Temdata , 1, 1, fp_map);
& L0 M9 n; |5 m1 _                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;, }8 [( R" U3 x: `
                                        //if (ftell(fp_map) > FilZize) return 0;2 e  G9 y( Y; c6 O8 x" n7 ]
                                }, ]. T0 T0 v; B7 l+ I" Q0 u
                        }
) {' e5 d# B" O0 ?& R3 |, L6 E                }
  {/ d0 k, g0 Q5 P% n        }, F5 z" f' d) q3 ]. N

, e; b+ ?9 Q1 @# w8 [        fclose(fp_map);6 s! I  K2 ?4 O, V% v
3 z' I* q0 F. q. ^* Y
$ T- ~; ^& L. B) s
        return 1;1 u' H  U" T4 {
}

9 C- \6 Z8 U: t1 C0 v+ M' K
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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