原始翎风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 一样,
算了先看看后面的吧,整个看完了再单独写程序显示地图看看。