2.2 我来了
按照不同的显示模式和要求我们设置好了画笔以后,就该轮到主脚登场了,于是下一步我们就要让我们这个游戏的主脚闷炮和他的小伙伴们(NPC)上场了.事实上我们要完成的就是贴图,由于完成了Directdraw的初始化,贴图就相当简单了.在讲贴图以前我们先一定要介绍一个在游戏编程里面占有很重要地位的两个函数:图像传送函数IDirectDrawSurface7::Bltfast( )
先说图像传送函数.
IDirectDrawSurface7::Bltfast( )
IDirectDrawSurface7::Blt( )和IDirectDrawSurface7::Bltfast( ) 函数都可以进行图像传送。Blt( )函数功能很强大,可对图像进行缩放、旋转、镜象等操作。不过平常我们用简单但够用的Bltfast( )就可以了.
它的原形是:
HRESULT BltFast(
DWORD dwX,
DWORD dwY,
LPDIRECTDRAWSURFACE lpDDSrcSurface,
LPRECT lpSrcRect,
DWORD dwTrans
);
下面将逐一介绍这几个参数:
(1)dwX和dwY
图像将被传送到目标页面何处。
(2)lpDDSrcSurface
图像传送操作的源页面。目标页面就是调用此方法的页面。
(3)lpSrcRect
一个 RECT (Rectangle,即矩形)结构的地址,指明源页面上将被传送的区域。如果该参数是 NULL, 整个源页面将被使用。 RECT结构在DirectDraw中非常常用,最好在程序中定义一个RECT类型的全局变量,如rect,再象这样写一个函数:
void MakeRect (int left, int top, int right, int bottom)
{
rect.bottom = bottom;
rect.left = left;
rect.right = right;
rect.top = top;
}
用时对它的left、top、right、bottom参数分别赋予矩形的左上角的x和y坐标、右下角的x和y坐标。
(4)dwTrans
指定传送类型。有如下几种:
DDBLTFAST_NOCOLORKEY
指定进行一次普通的复制,不带透明成分。
DDBLTFAST_SRCCOLORKEY
指定进行一次带透明色的图像传送,使用源页面的透明色。
DDBLTFAST_WAIT
如果图像传送器正忙,不断重试直到图像传送器准备好并传送好时才返回。一般都使用这个参数。
这几种类型很长又经常用,最好这样定义两个全局变量:
DWORD SrcKey = DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT
DWORD NoKey = DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT
举一些例子。如果我们想把lpDDSBack上的所有内容传到lpDDSBuffer上作为背景,则使用:
lpDDSBuffer -> BltFast(0,0, lpDDSBack, NULL,NoKey);
如果我们想将lpDDSSpirit上(20,30)到(50,60)的一个人物放到lpDDSBuffer上,且左上角在lpDDSBuffer的(400,300)处,要使用透明色,则使用:
MakeRect (20,30,50,60);
LpDDSBuffer -> BltFast(400,300,lpDDSSpirit,&rect,SrcKey);
请注意,DirectDraw的BLT函数只要源矩形或被传送到目标页面后的图像有一点在页面外,例如MakeRect(100,200,500,400)后将其BLT到一个640x480的页面的(400,200)处,就什么都不会BLT!解决问题最好的办法是自己写一个新的BLT,剪裁一下(有的书介绍用Clipper来剪裁,速度比这种方法慢)。
我们还必须在初始化的时候加载所有要显示的人物图片的指针和装载进图片.也就是说在初始化里面我们必须加入以下部分(而具体到底要加载什么人物图片就是通过上面介绍的那个函数就可以完成了).
要将位图(*.bmp)调入页面是非常简单的,对于普通的真彩(24位)图像我们只需用DDReLoadBitmap(页面,"图像名.bmp")
搜 索
