原始翎风CLIENT8位 (8) CLUNIT的学习
这个里面是绘图,
有汇编,
那个绘画效果的汇编看明白了,
实际是先建立了一个颜色的转换索引表,颜色对应下标,数据是转换后的颜色
在绘画效果中
用函数功能找到混合表面的的指针,锁定它
用汇编语言,将混合表面的每一个像素查找转换索引表,转换过去。
因为用了MM0寄存器,这是个MMX的指令里面的,它是64位的,
所以有个8次小循环。
这个可以用指针来实现,也很简单。
涉及到知识难点还是DX
sddsd: TDDSurfaceDesc
这个代表什么?
它是通过
sddsd.dwSize := SizeOf(sddsd);
ssuf.Lock(TRect(nil^), sddsd);
返回了sddsd它的值,
sptr := PBYTE(integer(sddsd.lpSurface) + (y + i) * sddsd.lPitch + x );
//地址计算,一行的 首址 + 开始行,本行的字节数 + 列的开始字节数
sddsd.lPitch应该是一行的字节数
由于还是256色,和32位色的原因
这个出现乱色斑。
DrawBlend
实际调用的DrawBlendEx
DrawBlendEx(dsuf, x, y, ssuf, 0, 0, ssuf.Width, ssuf.Height, blendmode);
这个混合Blend,不是广义上的绘画上的混合
是自己本身定义上的混合blendmode: integer
case blendmode of
0: pmix := @Color256Mix[0, 0]; //混合模式和动画混合模式?
else
pmix := @Color256Anti[0, 0];
end;
实际是调用2个颜色表,
都是混合,混合的计算方法不一样。
混合模式,底色 前色各一半相加?
//动画模式,底色加底色比例的前色
因为它也是对8位色的处理,所以会出现乱色斑
它在多处被调用
在PLAY中
按行1贴图前景, 2本行事件 地面物品 人物带魔法效果的 飞的魔法效果
地图前景信息里会要求是否混合
会进行调用,用的动画混合模式
DrawBlend(m_ObjSurface, n + ax - 2, mmm, DSurface, 1);
在PLAY中
//地面物品闪亮,显示物品名称
也进行了调用,用的动画混合模式
DrawBlend(m_ObjSurface, ix + ax, iy + ay, DSurface, 1);
在魔法效果中
这些效果的绘画
大多也是用的DrawBlend(surface,
FlyX + px - UNITX div 2,
FlyY + py - UNITY div 2,
d, 1);
在角色中
绘图
if m_nState and $00800000 <> 0 then //这个是什么状态?强制混合模式
begin
blend := TRUE; //混合模式
end;
应该是有遮挡状态之类的,用的混合模式。
DrawBlend(dsurface, ddx, ddy, source, 0)
在开始画面中,也有
// DrawBlend(MSurface, ex, ey, e, 1);
MSurface.DrawAdd(Rect(ex, ey, ex + e.Width, ey + e.Height),
e.ClientRect, e, False, 255); //24.1 改成DXD7的方法
我给改成DX的方法了。
事件的单元中有,
DrawBlend(backsurface, ax + m_nPx, ay + m_nPy, m_Dsurface, 1)
对于
DrawBlendEx,是起始的坐标不是0,0了
于是
在PLAY单元中。
绘画小地图
DrawBlendEx(surface, (SCREENWIDTH - 120), 0, d, rc.Left, rc.Top, 120, 120, 0)
在绘画场景中
有个绘画提示的,实际是可以直接调用的
DrawBlendEx(dsuf, x, y, ssuf, 0, 0, ssuf.Width, ssuf.Height, blendmode);
DrawBlendEx(MSurface, hx, hy, d, 0, 0, HintWidth, HintHeight, 0);
对于桌面是32位色,这些8位的直写内存用不了,
但是对于32位色,那些颜色处理后就不是古老版的256的传奇调色板颜色了
我想
能不能在内部有个 表面
专门来处理这种8位色,
全部处理好后,再贴到桌面的窗口上去?
再是关于还有关于雾,也还没有看明白。
看了一点,
它用的数据有
1: pColorLevel := @HeavyDarkColorLevel;
2: pColorLevel := @LightDarkColorLevel;
3: pColorLevel := @DengunColorLevel;
这是3个256*256 的颜色表
但区分到了0-30,31-255
颜色分到原来的0到30变化
计算方法不一样,是有30的等级的变化?但实际还是只有256种颜色?
还有一个
TLightEffect = record //光效果?
Width: integer;
Height: integer;
PFog: Pbyte;
里面的PFog: Pbyte;
是读取的 这几个文件。
LightFiles: array[0..MAXLIGHT] of string = (
'Data\lig0a.dat', //确实有这几个文件
'Data\lig0b.dat',
'Data\lig0c.dat',
'Data\lig0d.dat',
'Data\lig0e.dat',
'Data\lig0f.dat'
);
应该是对应的像素光斑,
而LightMask0-5
是对应的地图坐标亮度计算?
m_LightMap是地图坐标点的亮度
m_PFogScreen是雾的蒙板,这2者是对应的。
顺序下来就是
地图会添加某坐标点的亮度
效果会添加某坐标点亮度
演员会添加某坐标点的亮度
各种添加的亮度会叠加,通过LightMask0-5计算
做好m_LightMap地图坐标点的亮度后
转换成显示像素级的m_PFogScreen是雾的蒙板
6个等级的光斑应该是像素级的,看上去就是一个比一个大的圆光斑,
在PLAY绘图的最后
将显示表面和雾的蒙板混合,通过颜色表索引
1: pColorLevel := @HeavyDarkColorLevel;
2: pColorLevel := @LightDarkColorLevel;
3: pColorLevel := @DengunColorLevel;
来绘图。

浙公网安备 33010602011771号