游客您好
  • 点击联系客服

    在线时间: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 |! c2 o( |5 s2 F7 x; C
9 O! ?- x& B( e    地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。, w3 f1 ~: t: C; O5 t

: ^3 e# Q8 z  N0 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 地表一层的序号* ]& S6 `5 l: |2 g

  _2 e$ D; r) K. z1 S5 m# x4 c7 P03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
2 M$ C7 l% [0 ]9 @9 C# q& A( A07      在地表二层 12 01 这个大序列下的子序列编号
. ]- b( o& r& L: I3 S86      物件层的大序列& A1 D6 A/ q/ s) s1 j6 i
00      物件层的大序列下物件的子序列编号) {" |$ k& ^7 p0 R$ q( m
03 03 00  目前不详! [/ c7 [, l3 o
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
4 L  V( W- f  `0 ?0 N9 x" z+ N' {! p8 m# [. T7 z2 ?) L
//************************************************************  w4 K+ b% ~4 M1 y+ ~3 w. }" M
// 加载地图基本数据函数;8 S! s& R/ |1 T: ]$ N
//************************************************************& T, r, D6 l. r1 ~" e. M6 A# p

% r" V5 c- p. x! D: w2 d) {" Y//************************************************************8 g, S7 a2 n  |* K) W" D: O7 {& l
// 加载地图基本数据函数;
9 O% E9 g4 h" ?7 d- N1 N: C2 B0 ?, L//************************************************************, o- P' B0 c! R
, |: O$ @% N" f$ t9 u
int Cmap:oaddata(char *filnam)9 D8 U" |, t9 z6 D9 Q. v2 |
{
6 }$ C3 z1 z; x6 }        int Temdata;
  N* `- C  {. N' F8 \0 O. w8 V# ]8 w5 |! C; @
        if(filnam == "") return 0;
( u& R' |* F1 @* {: b: R' K+ p$ N/ V- t# w7 w
        fp_map = fopen(filnam,"rb");
+ ?9 S0 b; j5 v9 u# V( C
" I/ h9 s7 O4 V  J4 a% X        if(fp_map == NULL)        return 0;5 l: O9 B& [8 `! N6 c) F% L

. K- p) a6 T. l2 b( O- S5 n        fseek ( fp_map, 16, SEEK_SET);/ _) ~! ]3 a% ?
        fread ( &ShortWidth, 4, 1, fp_map);( l# D6 E6 N( e1 R$ U
        fread ( &Width, 4, 1, fp_map);& g# I! l$ I3 p; Y
        fread ( &Height, 4, 1, fp_map);
! q$ \. O  b6 g* v8 }9 N5 A; H' R  [( k% D& g" t3 F
        int TW = Width / ShortWidth;
: R: ]( R$ T9 L6 H7 w        int TH = Height / ShortWidth;
( y* @8 s1 i: `. Z( t. X1 z: t, }. b. Y6 h
        for (int j = 0 ; j < Width ; j++)
) B; b) E) C( t1 _        {
, Z7 J. a/ `  o% t* A                _DELETE_ARRAY(Cell);
4 Z: X& n- _( T                _DELETE_ARRAY(Role);
/ |! b' ^1 m9 z+ n  Z8 s        }
3 @2 }2 a) F5 T8 y& x  r2 y; u* t* E/ {" h3 r! g; f$ e! Z
        Cell = new stCell*[Width];8 ?5 _( D2 k+ ?0 z- Z3 P
        Role = new stRole*[Height];7 x# s2 b' E) i. `. Q: e3 w- W  `
        for (j = 0 ; j < Width ; j++)4 T8 y2 a! }2 B* Y' y; ?9 F
        {3 J+ e9 B+ A  u3 t6 B  a
            Cell[j] = new stCell[Height];& i- Q0 ]+ V8 |
                Role[j] = new stRole[Height];        
) ~! g0 k, ?% ]8 A        }        $ \; I4 Z' R9 X) d1 c' V0 p

8 }' y+ D6 D4 \        fseek ( fp_map, 28, SEEK_SET);; @) k9 M; m  s6 C# I) [
4 u4 i) j+ q7 @9 _2 {  D9 n3 G
        for (int y1 = 0; y1 < TH ; y1++)# r) z' ^% }# e. A/ \: i
        {
: F( Q; `7 q. a& Z; F                for (int x1 = 0; x1 < TW ; x1++)
2 U8 _$ q9 o; d& |% g( {6 S' u$ s                {
! k2 e5 ?0 q3 I, x                        fseek ( fp_map, 20, SEEK_CUR);3 B6 K% P+ h% k$ o6 I
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
* o8 w7 o7 T: V; e& t/ X                        {
' p+ a6 I4 [$ K+ \' r4 U                                for (int x2 = 0; x2 < ShortWidth ; x2++)  o2 J! \6 I, Z9 I6 T, Q
                                {
$ O- s( G% K6 a- Y6 u: r& T' u# K                                        fread ( &Temdata , 2, 1, fp_map);. ^4 f5 H9 ~8 u/ V5 u6 {# P4 p+ @) f
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;. p' x, a) d' F5 y' [: |

" b6 L% e, C$ X# Y( E% j. v1 x                                        fread ( &Temdata , 1, 1, fp_map);+ u  a1 U* N9 O' D0 i
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
( q, l3 M5 W4 X. ]  Q, j2 q1 w0 n+ P9 a& l6 l( C8 K
                                        fread ( &Temdata , 2, 1, fp_map);
1 t- X1 n% i, e) J9 o9 H% y                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;: u( H) X- T, N4 V1 ~/ L0 E1 f# o
# v/ A/ O$ O" C" N
                                        fread ( &Temdata , 1, 1, fp_map);
7 k. u1 Z0 \7 [4 r, o                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
$ j: `1 v8 x  I* R                                        // 6个字节
' w8 ]  c- g4 f  a! a& j& d- R4 J  P" i, d  g
                                        fread ( &Temdata , 1, 1, fp_map);
" }2 w; r0 m! s' t( I6 S                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
8 S, I+ U- h: Y2 M/ Z1 M' q2 N                                       
& y8 \- t! m  b- Q& m                                        fread ( &Temdata , 1, 1, fp_map);% h7 G1 J% i1 G4 Q, P7 e' Q
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;0 n8 ]" l" o" L+ ^% z& u
5 N- A2 }' ?7 ?+ V0 J
                                        //fseek ( fp_map,3,SEEK_CUR);; \4 d7 F$ A+ f0 W7 y) }' ^
                                        fread ( &Temdata , 1, 1, fp_map);3 R! L0 P3 y7 P. X1 o
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
0 N! N- N5 E1 S. @4 W3 Y* v3 O                                       
1 L/ N* E- H- K1 b! E- N' ~- ?0 @" {                                        fread ( &Temdata , 2, 1, fp_map);
" \9 X; G9 a+ W3 y2 o& p                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
5 A" w2 K5 i7 f3 q/ n3 l" |
3 B; o4 S2 D# t                                        // 1个字节
* y: I. o! S# Y                                        fread ( &Temdata , 1, 1, fp_map);
6 [0 `+ ?9 H$ E( U1 W, ^                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;6 k" r. S% k3 H: u' m6 Q# d8 \/ u' g
                                        //if (ftell(fp_map) > FilZize) return 0;% E% d! Z9 }; m" G6 C3 p
                                }5 M1 `6 q! z& O
                        }2 r0 s3 O( D, A; U9 F& }
                }1 `8 |$ q2 C& D" Y2 c' v
        }! K4 C) a0 R" g* l' r0 b5 Z9 T  W' L
, ]% G  z1 c7 n* z; o3 B
        fclose(fp_map);0 z5 t/ i* {0 |+ P4 g7 A% T
- _$ `, M% x( G( [7 p3 p9 j4 b

! b$ w- p5 }+ |        return 1;
" e! O$ H' K0 T3 P! `/ L}
$ `, |( a" A1 N/ t: T" t
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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