游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。
3 x5 J  W9 s, p( U
4 e6 [% x' A$ S    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。, l! \8 C" O# M! S

  f: f. S' N) B! ?2 w% w    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 地表一层的序号$ F& |( A0 y+ o+ A
2 a' R' c' H3 E. [- A' ?: H$ e. A, ?
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
# `0 d/ B( X5 n3 f6 O% c( W07      在地表二层 12 01 这个大序列下的子序列编号
# C9 i: ]+ {3 z% C5 b1 z86      物件层的大序列9 J5 }: ?) D) O8 H9 K$ y' n
00      物件层的大序列下物件的子序列编号
( u6 u" j, A' z# d. d' h1 j03 03 00  目前不详: g8 n" @% s3 B: \) o& l
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。; f  I% o4 ~- n7 s% |, o5 Z" b

& }1 i1 X4 A0 c" A! }$ p//************************************************************
" A% K1 ^3 J, R9 L6 X7 w- h4 j// 加载地图基本数据函数;$ p6 s) l0 r6 ^
//************************************************************
6 I) _; ]$ R. w2 R$ I
; u7 ?- u4 Y4 [1 q9 F//************************************************************6 @) h$ b9 d) ~3 N
// 加载地图基本数据函数;
8 Z1 @! u" o; \* [) X8 h! K3 m+ D//************************************************************
2 m: v; S7 C$ t; s* W3 R# \# B
# d, j+ V4 w, l- K4 Sint Cmap:oaddata(char *filnam)3 G# c' N/ M1 s7 H' P4 U1 R( b
{$ q! O0 Y. a$ i" o/ K# ^. M6 p# Z
        int Temdata;  I" }8 Y: S; ]% f+ H- U. G$ e: ]% r1 `

" ^1 |7 g: V' q/ e+ @' _        if(filnam == "") return 0;
9 K8 k0 |- c2 E- G
1 M9 ^. j5 [* X        fp_map = fopen(filnam,"rb");
2 M& f/ v/ a* o6 b$ G$ j4 x! A" N% F1 x
        if(fp_map == NULL)        return 0;8 l6 Z" T: g% H* c9 j

( |/ r" b& H! t0 t# a        fseek ( fp_map, 16, SEEK_SET);
+ q$ a+ `' q9 l, M6 e- z8 i        fread ( &ShortWidth, 4, 1, fp_map);+ c0 g- X4 x: }+ a1 b
        fread ( &Width, 4, 1, fp_map);
. U! w" c' y1 b/ s8 }4 ?        fread ( &Height, 4, 1, fp_map);
6 e/ B9 l+ p" [: }6 C4 t2 m) ]# p2 Y! H" S! `# J9 x
        int TW = Width / ShortWidth;
+ D- G- K/ T- P; @        int TH = Height / ShortWidth;
5 ^3 l! A  _$ {. \) C% V
% e6 k4 h7 a! _$ |; @        for (int j = 0 ; j < Width ; j++)# v( Y2 g. `$ p9 m, l! o
        {
  Q2 E( j/ X; `# n                _DELETE_ARRAY(Cell);
1 h4 R9 N$ U2 [0 l8 U                _DELETE_ARRAY(Role);. j) W" o& a- I: j. ?+ J) x/ G
        }
- B" ~0 m8 \9 p: w  |5 m* E1 i! d( y) j1 {1 y1 J5 f" Z
        Cell = new stCell*[Width];
, [8 |! f# F# y* E        Role = new stRole*[Height];% _) K! w; _& Z6 O7 x. k
        for (j = 0 ; j < Width ; j++)% q( Y. d, G3 l) M4 U
        {
4 ^# L" E* ^7 i$ q) @" c            Cell[j] = new stCell[Height];+ t% ^5 {$ M* {: C5 K' V
                Role[j] = new stRole[Height];        
, l3 }: W+ z% |5 x4 z. E, u        }        3 c$ m3 ]" v: x

! P5 m& ]: i% o9 L( }; K        fseek ( fp_map, 28, SEEK_SET);
/ J8 R, }; ^7 J( H* G
* c0 X+ k7 n+ R/ s6 w5 v* a        for (int y1 = 0; y1 < TH ; y1++)
9 ^3 e. a- p+ e: e, T0 O        {) O1 i& k* D' C' Q% F3 Z6 d* ^4 S
                for (int x1 = 0; x1 < TW ; x1++)
/ n4 b% u! Y) X$ ~  i# }                {
; f- c  O; F; w                        fseek ( fp_map, 20, SEEK_CUR);$ {3 i. I7 D7 T8 U; L4 `) |
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
! Q, [! f  v! H3 ]( V2 w5 h                        {
, I: ?/ x: \& i) F% g  q5 W                                for (int x2 = 0; x2 < ShortWidth ; x2++)3 x9 W: @+ _& Y$ f2 q
                                {5 [& V+ t6 L7 O$ j' u5 W
                                        fread ( &Temdata , 2, 1, fp_map);
/ z$ ]) t. t7 y  A5 _$ U; f                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;& M, Z  r* S! U

) ]8 y# V3 a: a4 b. ?                                        fread ( &Temdata , 1, 1, fp_map);% r# L2 A) F- Q  R2 O9 p
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
$ m. i! c  z* ?: E0 Y# m) H$ ?" @1 Z- n1 N: s
                                        fread ( &Temdata , 2, 1, fp_map);: ?. t/ j% R5 }1 _5 j
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
0 E- O' P' Y( r4 L4 X; A3 Z5 i+ R, H* D: t) b* \
                                        fread ( &Temdata , 1, 1, fp_map);0 g; X( z/ _- R; q
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;- J1 }/ z& D% T/ c
                                        // 6个字节9 Q) N& w8 o! T, L: U" w4 G- Z

  U$ d2 y2 R  [8 u/ {" N& d+ V                                        fread ( &Temdata , 1, 1, fp_map);- s/ l! @7 C+ w7 o1 R" v
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
6 J' V* C$ @# Y3 k  ~( P: G% J                                        5 y5 r7 h* M* K* t, S9 N
                                        fread ( &Temdata , 1, 1, fp_map);1 n, `2 ?2 }9 ]+ J1 ]  s! T
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;2 S- c) d5 g" {5 [

% X6 ?% g1 _, \& X                                        //fseek ( fp_map,3,SEEK_CUR);
: D6 E* ]0 W+ m2 L1 M4 c                                        fread ( &Temdata , 1, 1, fp_map);) i! }2 a# w+ d. l1 Z0 V
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;" w; z- [' ?* R+ ^5 M( J, y7 g
                                       
6 ]9 S$ Q8 j1 s# G+ P3 B                                        fread ( &Temdata , 2, 1, fp_map);8 e0 U6 ?2 L  l1 R
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
8 l# b7 B2 N: g3 p$ W# C1 J3 N- W$ u6 o2 \7 T) D$ b  f
                                        // 1个字节; e4 Y8 C* d- S4 ~' G4 L! r  B0 F
                                        fread ( &Temdata , 1, 1, fp_map);
1 U" s& `& x( F0 P                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;* S% K) }6 o5 {- M/ G
                                        //if (ftell(fp_map) > FilZize) return 0;
: {- m# R- w, m                                }; w% Q' [/ X, D: T; S
                        }+ f1 o/ I( a1 z3 ~/ G) }
                }# S: |2 u* c! R) T/ r! _/ T
        }+ l# ~& E" n" I0 n" H4 j/ G4 p$ {

+ [4 k6 l+ Z) v        fclose(fp_map);" U7 `/ M* Q+ O: C* o
" v3 d& b3 _, d$ Q: J& p
  R/ U& x+ z% W8 k/ |3 P6 c
        return 1;' T8 s& [% w" ~* Q
}
( p8 q% z8 B! ^* M  ]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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