游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。+ f; J4 |+ K) A6 X" ]* z1 h* l% R8 K5 U

4 X2 _. m5 [, d9 u, _7 ]. @4 A    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
- n/ p# c, F' R6 ?
1 r* z( N" b2 R9 e  o* a5 U    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 地表一层的序号
5 d9 ^  H! t% F7 w( L( _2 `
0 N) S0 @' q6 p' Z3 G; _03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
9 P: [9 b( S. Z( Z1 x07      在地表二层 12 01 这个大序列下的子序列编号
" e9 ]9 e9 A  a" F$ @: m* s' }86      物件层的大序列
  q- {" I, ^9 k! E% T/ @/ T2 w00      物件层的大序列下物件的子序列编号6 Y+ ?, O# R7 H% S0 P& ^6 y
03 03 00  目前不详6 y/ [* g! Q0 L4 ]
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
5 A4 P& I* q* x; x- U" G0 A9 W7 p; C. ~9 K  w' ~( H3 {
//************************************************************+ D: N1 M+ j) O. I$ k) L( |7 L5 Z9 k
// 加载地图基本数据函数;
$ F- |4 t6 [0 `) L  a8 z+ N1 P//************************************************************
5 x$ t4 T/ N, r$ n  _! B  ~" M% I6 v8 p- h: C  b8 y- ~& s& m
//************************************************************
' J- s8 M; R' o7 l// 加载地图基本数据函数;
4 {; a& l( [1 o3 y$ I//************************************************************
* f( O+ o; f6 h+ q
. e2 Q" u  n4 E$ Hint Cmap:oaddata(char *filnam)$ [9 @3 O4 i1 E4 N
{9 M* d9 p% E# {& d
        int Temdata;
0 f2 _" }4 j& Q0 K+ i. ~* t1 S3 V, g, j, v9 Y- M3 ^
        if(filnam == "") return 0;
) w1 ~3 i4 k5 R: M' ^. b* _" T0 n
        fp_map = fopen(filnam,"rb");
% i% F$ S. O8 D' E, E; r: I7 \$ Y7 K7 v* d
        if(fp_map == NULL)        return 0;
3 y2 g. f2 M9 `5 s7 {
- H: [2 b+ x5 Y        fseek ( fp_map, 16, SEEK_SET);( a: g0 l' \# D8 v/ u9 k7 g
        fread ( &ShortWidth, 4, 1, fp_map);: U6 X% n* h7 X
        fread ( &Width, 4, 1, fp_map);- u6 [5 p- L5 i' H% ~% G
        fread ( &Height, 4, 1, fp_map);
  K& H9 i2 q, n$ a# C
7 J8 d* k# D7 E        int TW = Width / ShortWidth;7 X4 U. m* O# d
        int TH = Height / ShortWidth;: _! s+ H! _% u
) X" f% e! y! `$ Q' ~3 L
        for (int j = 0 ; j < Width ; j++)  M1 C) p2 ~7 u) R# o3 I
        {5 Q$ K. ^6 w9 V( V. D) u
                _DELETE_ARRAY(Cell);
: b' h1 N$ }1 {: E4 P                _DELETE_ARRAY(Role);3 H. q* w1 V" G: g2 h( K! g8 {
        }. f- N5 a4 A0 L
) H% A( L2 ]3 n+ f) C
        Cell = new stCell*[Width];
3 p" n* P1 L& B$ n& i5 k        Role = new stRole*[Height];
: U3 a+ j% U) N1 M2 l        for (j = 0 ; j < Width ; j++)8 j( z, ?# }, `: w/ D9 U: f
        {
' S  j7 p9 ^* N! G4 B4 \- i            Cell[j] = new stCell[Height];8 ^) M( t1 f, I' R% n  c
                Role[j] = new stRole[Height];        
2 k( E5 R0 E% b! ]; R) Q5 r        }        . g) @6 C4 ?0 ]4 ~( l

% o2 Y0 Z- z# C# x3 ?( O% b        fseek ( fp_map, 28, SEEK_SET);
& i9 h0 Z4 {! r+ {+ H5 K
1 k; _7 ]- {/ ^# ~+ z        for (int y1 = 0; y1 < TH ; y1++)# [  y  A6 o- v  V' o
        {$ B* T( [; T7 h! i/ T7 c' S6 n/ H
                for (int x1 = 0; x1 < TW ; x1++); g/ o" I( r: u6 l: g
                {
; e# U/ @# n4 ~' R7 p                        fseek ( fp_map, 20, SEEK_CUR);
7 p% @" m: X1 {  p5 S( v9 V                        for (int y2 = 0; y2 < ShortWidth ; y2++)0 }9 k; y, ^! X( C  M
                        {4 R& C) B* n4 w! q& u, |) J5 G
                                for (int x2 = 0; x2 < ShortWidth ; x2++)
4 G/ `! p, G9 }. W/ U                                {' K: Y0 [/ C- Z$ G/ c
                                        fread ( &Temdata , 2, 1, fp_map);5 F' ]9 R% [* J3 g3 C. i
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
7 ?. P+ T* R. {3 X
9 N% L6 P9 h/ D, d5 v5 F                                        fread ( &Temdata , 1, 1, fp_map);
  P& |: U6 S3 s4 _                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;- W9 F8 {( E( V) I5 i3 I
- L) c3 t6 V& @& G- X5 y
                                        fread ( &Temdata , 2, 1, fp_map);
  F- m, e" l7 s+ i, d) ]; s                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;0 z! ^& z3 [: e* U

# `( @% D) r& V: v                                        fread ( &Temdata , 1, 1, fp_map);! k0 f$ A$ U* p% j2 t
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;# \  b" A* i# `& n& B7 A
                                        // 6个字节
# e/ q& `$ ?: G4 O, @+ T4 Y2 M4 ~! V, H8 ^; }5 U. D
                                        fread ( &Temdata , 1, 1, fp_map);
* F8 o, H; t* g  K% U- `                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;) U* n8 r# a$ `/ B
                                       
7 p  G$ _  C' [3 d                                        fread ( &Temdata , 1, 1, fp_map);
$ Y+ U% O, o# r' L3 o# J7 `                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
. A  E4 u5 e) m. C, Y& B$ J
/ A5 M5 S+ s, t- L8 [4 K                                        //fseek ( fp_map,3,SEEK_CUR);
& S, e. ~, o" a6 G. A* p3 _                                        fread ( &Temdata , 1, 1, fp_map);
( x; u) i! w7 H5 _% j% @2 u/ {                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;: R' W  e  U+ {
                                       
$ K5 M+ [8 m8 A$ E6 Y3 c; j* l/ {                                        fread ( &Temdata , 2, 1, fp_map);
, _8 L' u- W5 c                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
% g# K2 q# N8 b9 h  X( d) _* f1 u
                                        // 1个字节
3 o1 P2 P1 h0 P/ z$ h( T% V                                        fread ( &Temdata , 1, 1, fp_map);: Q( M. s/ l# |8 l& |$ @  J/ [7 ]
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;2 a0 p' G4 L" j
                                        //if (ftell(fp_map) > FilZize) return 0;% Q+ r! \1 ]) ~
                                }( p; [, x$ I+ y7 O: |# A* D# }/ h
                        }
% R3 E1 K6 q1 ^- Y6 C7 D7 W3 {                }6 T, L! o" Z# Q/ I, p
        }
, s( c- o% e$ M! Q* w. p$ C# @3 C# G/ v: k
        fclose(fp_map);
% \) r, B; L5 J0 J
; D7 N5 j  o6 N$ i4 h: S2 `! h2 T
        return 1;
4 Q; L0 K$ Y* @2 g}
7 v1 v' O& S* V: d; i
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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