原始翎风CLIENT8位 (14) mapunit的学习

8.MaxInt
格式: const MaxInt=High(integer);
说明: MaxInt常量代表Integer类型的最大可能值.MaxInt的真正的值会随着Delphi的版本不同而改变,目前它的值是2147483647 2g?

地图好像是分块? 40*40个地图坐标分为一个广场块

一次读取是当前块的 -1 X/Y +2 合计4*4块 合计160 * 160 个地图坐标

对应了这个的大小
m_MArr :array[0..MAXX * 3, 0..MAXY * 3] of TMapInfo;
但是感觉也不对啊
MAXX是40,但是

好吧,是我错了,确实是120,计算上是 2- (-1)
结果就是3?在3*40 就是120
想了下,减法计算的是2个数的差距,间距,比如1和2的差距是1
1和3的差距是2,1和4的差距是3,-1和2的差距是3,这

但是数表示的是还有个是次数,个数,计量?比如1和2的量是2
1和3的量是3,1和4的量4,这个数字更多是表示一个编号,序号?
如1个人,2个人,3个人 第一个人,第2个人,第3个人?

在循环中 用的是次数?

越想越混乱?

一号门: 624 278 皇宫后侧: 620 260
二号门: 627 278 仓库正门: 640 245
三号门: 634 271 监狱正门: 600 285

564, 286 秘密通道
564, 287


地图的加载
TMap.LoadMap(sMapName:String;nMx,nMy:Integer);
内调用
TMap.UpdateMapPos (mx, my: integer);
内调用
procedure TMap.UpdateMapSquare (cx, cy: integer); //更新地图广场
内调用
procedure TMap.LoadMapArr(nCurrX,nCurrY: integer);

感觉这个写的比较好,一个功能一个函数,一个函数尽量的单一功能
行数少


在CLMAIN中声明 Map: TMap;
并建立Map := TMap.Create; //mapunit.pas 地图对象建立
是一个全局类变量

在PLAY中根据 消息加载

SM_CHANGEMAP,
SM_NEWMAP:
begin

但它本身没有绘图方法

在单元内,地图类外 有个绘图MINI 的地图的过程,但是也没在其它地方被调用

绘图还是在PLAY单元中?

有个DRAWTILEMAP?
procedure TPlayScene.DrawTileMap;

还有个procedure TPlayScene.DrawMiniMap(surface: TDirectDrawSurface);

Map.LoadMap(str, x, y);

 

在procedure TPlayScene.PlayScene(MSurface: TDirectDrawSurface);
中对
对地图显示的方块进行设置
try
with Map.m_ClientRect do
begin
{$IF SWH = SWH800}
Left := g_MySelf.m_nRx - 9;
Top := g_MySelf.m_nRy - 9;
Right := g_MySelf.m_nRx + 9;
Bottom := g_MySelf.m_nRy + 8;
{$ELSEIF SWH = SWH1024}
Left := g_MySelf.m_nRx - 12;
Top := g_MySelf.m_nRy - 12;
Right := g_MySelf.m_nRx + 12; //
Bottom := g_MySelf.m_nRy + 15;
{$IFEND}
end;
Map.UpdateMapPos(g_MySelf.m_nRx, g_MySelf.m_nRy);
而且对地图进行更新?

DrawTileMap;绘画地砖?

800,600的显示屏幕

可以显示X 800/48 = 16.6 17 个坐标点格
Y 600 - 底台155 = 445 445/32 13.9 14个坐标点格

但是实际取的是 18 17 格?


显示出X18格,人物在9格
显示出Y14格,人物在7格


这个是显示的像素长宽,800*600的情况下是800*455
SOFFX * 2 是边框的大小还是什么?
m_ObjSurface.SetSize
MAPSURFACEWIDTH - SOFFX * 2,
MAPSURFACEHEIGHT

这个是绘画地图地砖的像素长宽,在显示的大小下增加了
长增加了UNITX * 4 + 30,宽增加了UNITY * 4
m_MapSurface.SetSize
MAPSURFACEWIDTH + UNITX * 4 + 30 = 1022
MAPSURFACEHEIGHT + UNITY * 4 = 583


有个问题,800*455并不是地砖像素的整数倍,


m_ObjSurface.Draw(0, 0,
Rect(UNITX * 3 + g_MySelf.m_nShiftX,
UNITY * 2 + g_MySelf.m_nShiftY,
UNITX * 3 + g_MySelf.m_nShiftX + MAPSURFACEWIDTH,
UNITY * 2 + g_MySelf.m_nShiftY + MAPSURFACEHEIGHT),
m_MapSurface,
FALSE);

m_ObjSurface从m_MapSurface挖取的大小,是MAPSURFACEWIDTH,MAPSURFACEHEIGHT

起始点UNITX * 3,UNITY * 2,偏移可以看作0,
是从整数地图格开始挖取的,所以
实际并没有大多少,

左边留3地图格,右边留1地图格+30
上面留2地图个,下面留2地图格。

再来看m_MapSurface 的绘图。

在DrawTileMap中,

地图数组是120格*120格,它的顶点地图坐标是Map.m_nBlockTop,Map.m_nBlockLeft
实际也是数组的顶点,
这个不一定是以人物为中心,人物在这个范围内。
如果人物跑出这个范围,会重新读取。

取绘画的是 18格*17 格 这个是以人物为中心的,它的顶点坐标是Map.m_ClientRect.TOP
Map.m_ClientRect.LEFT


cx := mx div LOGICALMAPUNIT; //对地图坐标转换成地图段坐标
cy := my div LOGICALMAPUNIT;
m_nBlockLeft := _MAX(0, (cx - 1) * LOGICALMAPUNIT); //对左和上边缘限定
m_nBlockTop := _MAX(0, (cy - 1) * LOGICALMAPUNIT);
如果,人物初始是 100,200的坐标,
那么地图段为/40,是 2,5
那么,m_nBlockLeft是40,
Map.m_nBlockTop是160,

Map.m_ClientRect.LEFT是100-9=91,
RIGHT= 100+9= 109
Map.m_ClientRect.TOP是200-9= 191,
Bottom= 200+8 = 208

在地图绘图中,实际开始的
j := (Top - Map.m_nBlockTop - 1) to (Bottom - Map.m_nBlockTop + 1)
Y方向-1 191 - 160 - 1 = 30 208 - 160 + 1 =49 实际画19格608 超过了?
它又进行了修改,增大了范围,
i:= (Left - Map.m_nBlockLeft - 2) to (Right - Map.m_nBlockLeft + 1)
X方向-2 91 - 40 - 2 =49 109 - 40 + 1= 70 实际21格,1008像素


像素坐标很奇怪,
Y 从- UNITY * 2 开始,
这个是大地砖,所以是2个格子的大小,由于又-1了,所以得从外面多画一格
其像素坐标就是-值

 


小地砖是从 nY := -UNITY;开始 也是从外面多画一格 像素坐标-值,

已经是扩大绘图了,为什么还要再扩大绘图?

X 从AAX + 14 - UNITX 开始 AAX 是 16 不知道表示的是什么意思?

X坐标要从外面多画2格,但是这个起始坐标太奇怪,

为什么不是-UNITX *4

挖图又是从UNITX * 3 UNITY * 2开始的

为什么?

先来看人是站

修改了下,好像从-2,-1 一样,

算了先看看后面的吧,整个看完了再单独写程序显示地图看看。


posted @ 2024-05-07 22:37  D7mir  阅读(37)  评论(0)    收藏  举报