游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。! m: Q2 ~( V/ x" Z3 \/ }

& Q  _, w  G3 U' t2 o    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
* y9 V: s, K( z9 Q1 D; F
& S# }0 _# m( `& d4 M% C    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 t$ W! @3 J; V# A. j, F4 _
2 |" r3 A6 U( W& p+ k03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号/ V; ]) x. z5 d! O$ F, }7 u& q6 \
07      在地表二层 12 01 这个大序列下的子序列编号7 m. q; R* s7 j# p
86      物件层的大序列
% T, A4 L( r& `$ b00      物件层的大序列下物件的子序列编号; c) f* ^6 b* m4 c9 e# G
03 03 00  目前不详3 x- [# b3 h/ B: y" O4 W
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
  Q  d8 p" [4 t4 K# T
4 Q! a4 Q/ j6 [' }! u9 i& V! c//************************************************************& \, K) H* K3 [$ Z) [
// 加载地图基本数据函数;( Q8 M  B5 n: W& I
//************************************************************: U2 H$ R  h: O
* _+ `$ t: T; }
//************************************************************8 O' ?. {; i8 H' g5 z8 s1 m
// 加载地图基本数据函数;& M+ h8 R, B, C, |  B" \. [# u
//************************************************************
* p% x( `# g8 c  ~
+ `) r. g; A" a6 Q3 M8 U$ Rint Cmap:oaddata(char *filnam)
7 J) p7 R* S2 P{% r; Q% l4 i5 J! v
        int Temdata;6 ^7 q. G' w( A8 m

/ D+ @8 S, R4 E% f3 _$ t$ s        if(filnam == "") return 0;5 O8 ^! `: D- S3 ?9 X

/ _$ K" L5 j4 X! N        fp_map = fopen(filnam,"rb");, q2 W. I+ U8 p  D) Z( I

, q# f- U" Y4 W5 W2 I- x        if(fp_map == NULL)        return 0;
( c" C4 i8 v3 O" |! h6 ~, O) m& o! U1 T8 t) Y
        fseek ( fp_map, 16, SEEK_SET);$ ?  z! F1 m4 w2 T% Z
        fread ( &ShortWidth, 4, 1, fp_map);9 q, y4 u% y& i
        fread ( &Width, 4, 1, fp_map);1 J! s) \, y( w* H1 A9 T
        fread ( &Height, 4, 1, fp_map);- {! J- ~, c4 D' u+ b# T/ Z
% \' Q+ M8 a/ g9 J8 J1 S7 Q; T1 u3 r
        int TW = Width / ShortWidth;7 A7 r' P$ x* r) a/ q# Q
        int TH = Height / ShortWidth;) T- t8 I0 U; \7 h2 n3 A8 ~5 m
/ e3 ]  G- D' u$ R4 p8 C% K
        for (int j = 0 ; j < Width ; j++)
# T0 f8 T6 N5 T3 V        {; ?) b) k- [2 n8 U+ J& \9 W
                _DELETE_ARRAY(Cell);+ A. L- j/ b  C9 s# J* o
                _DELETE_ARRAY(Role);
7 Y6 H7 F- |# B) S* E7 ?, b        }
/ }' G" C( A9 _% Z% j
, b9 K3 e& ~' T6 D. ^        Cell = new stCell*[Width];# C+ q3 ^" V5 U3 J. s* t' `
        Role = new stRole*[Height];& B7 {7 C' S. U9 _6 ?2 C; K# M
        for (j = 0 ; j < Width ; j++)
2 G1 R" i7 f& G$ t; r7 X3 n* k        {
1 W7 z9 S5 h& ]            Cell[j] = new stCell[Height];
. y! @' B8 ~8 O                Role[j] = new stRole[Height];        
1 a8 _9 }* Z0 K% d! K: o% w' O1 r        }        
* X0 _+ x/ D5 {2 }0 v' i
3 I* R2 E- ^4 W/ H# n        fseek ( fp_map, 28, SEEK_SET);
' {1 R' t! d4 w8 x) i
/ B) \# y" c, z5 `* F/ u" A        for (int y1 = 0; y1 < TH ; y1++)8 H$ I6 {( a/ O! |+ ^
        {. P$ u, i2 s) e3 o' B$ B+ L: ~: i! f
                for (int x1 = 0; x1 < TW ; x1++)
  [/ g: z: T8 v5 {0 g                {/ G. @* V8 l# C, d# q
                        fseek ( fp_map, 20, SEEK_CUR);3 w6 r! n# O  s0 O- X
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
; ~$ g$ n$ F: w. z                        {
4 \0 t$ @% T  F                                for (int x2 = 0; x2 < ShortWidth ; x2++)
9 I- B) L6 h' ~# i/ O                                {& t; W2 m1 U) `8 k
                                        fread ( &Temdata , 2, 1, fp_map);
) q, y, F- D: t7 j5 T/ T( w" N                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
3 Y( b( S: |: d" O2 k# h- {5 \+ s0 T
                                        fread ( &Temdata , 1, 1, fp_map);
' _+ U9 u/ R2 D& Q7 E0 ?/ p; d& m) R                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
( v5 m5 Q/ w8 V* t. _
( q2 y+ ?# V9 u3 L                                        fread ( &Temdata , 2, 1, fp_map);
8 R. E% P% [2 s6 Z4 F9 B7 F                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;8 U0 B) X% |( a- f" j+ W9 U9 T" }
0 u2 M, P6 M8 c' T
                                        fread ( &Temdata , 1, 1, fp_map);! }! ?# D: w0 ~& b0 m$ W5 p0 j4 ~+ i
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;0 g+ V# a0 Z' k7 t) a" D
                                        // 6个字节
# ]8 n# a, k3 [+ E% U
0 D1 j. q& h: x  S- o1 m8 ]                                        fread ( &Temdata , 1, 1, fp_map);
- A# p5 D3 W1 Q; e3 k$ I' }# k                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;5 d4 B% A) i5 H
                                       
& q7 |* k& s; R& `# ~" ]3 P6 ^                                        fread ( &Temdata , 1, 1, fp_map);9 l8 y+ o8 Y$ g
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;+ g* |; o: j  q; E9 b
( E( R5 ?  f- I/ C* N7 y5 C
                                        //fseek ( fp_map,3,SEEK_CUR);
- k+ B0 ?0 U$ S- T& B4 }- T" R                                        fread ( &Temdata , 1, 1, fp_map);
$ \( v. x, R( }                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;" B- \5 D1 q% ]1 Q
                                        ' o1 A8 K; c1 d* U
                                        fread ( &Temdata , 2, 1, fp_map);5 R" k/ B# b! n
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
0 O! _2 [! ^$ \: r9 l
, R; O$ \8 ~* {+ k                                        // 1个字节! G8 G/ Y) h4 ^. l5 U& r* d
                                        fread ( &Temdata , 1, 1, fp_map);# N: ]9 J9 @5 b- x
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;& [0 t% |. Q: d$ {8 q/ k
                                        //if (ftell(fp_map) > FilZize) return 0;% k9 m7 M! y3 ]) n. V- n" \
                                }
2 o) N1 ~% D6 H( P( F. w                        }, n) F3 z& p$ V# n) {
                }
- a4 g# N* Q) N& n/ S        }% U2 P6 W$ V0 g, R

8 g' b( c; V4 i! i        fclose(fp_map);5 t: R% h7 F7 A, R% }
5 @9 v/ ]8 n, N3 `' P9 ^# W
0 R6 V8 ], R+ a1 A1 J6 X) d! L2 n
        return 1;# P" V1 f5 \; T  Y3 F- `
}

( F2 N4 k: `% l' U: l5 J  n" K
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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