前面提过了使用D3DXSprite创建带alpha通道的2D图像,这里介绍一下动画的实现方式:
1、帧动画
首先需要多帧的动画图片,如下图:
我们通过设置角色纹理图片的选取矩形,就可以获得我们需要的特定帧,这里先设置为第一行第一列的图片帧:
SetRect( &rctNpc, 0,0, 132, 128 );
在绘制该纹理时根据流逝时间来确定显示的帧位置:
switch(((int)(timeGetTime()/100))%4)
{
case 0:
SetRect( &rctNpc, 132*0,0, 132*1, 128 );
break;
case 1:
SetRect( &rctNpc, 132*1,0, 132*2, 128 );
break;
case 2:
SetRect( &rctNpc, 132*2,0, 132*3, 128 );
break;
case 3:
SetRect( &rctNpc, 132*3,0, 132*4, 128 );
break;
}
绘制时使用该矩形即可。
2 变换动画
有时候我们需要对图像进行一些位移、旋转或缩放的变换,这里我们使用一个生成2D变换矩阵的函数来确定我们需要的变换:
g_pSprite->SetTransform(D3DXMatrixAffineTransformation2D(
&mat, //输出的矩阵,同时也作为函数返回值
0.8, //缩放因子
&D3DXVECTOR2(0.0f,0.0f), //旋转圆心以纹理的圆心原点为圆心
t/500, //旋转角度随时间变化
&D3DXVECTOR2(100.0f, 100.0f) //位移x 100,y 100
)
);
3 淡入淡出
实质上就是透明度的变化,我们只需要设置角色纹理图显示时的alpha值得变化即可。
首先必须在初始化设备的时候设置好有关alpha的渲染状态:
g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); //打开alpha混合
g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); //设置alpha混合方式
g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_ADD); //设置alpha操作方式为加
然后在绘制的前设置alpha混合标志:
g_pSprite->Begin(D3DXSPRITE_ALPHABLEND);
最后在绘制的时候调节Draw函数最后一个参数的alpha部分的数值,如下代码:
g_pSprite->Draw(g_pNpcTexture, &rctNpc, &D3DXVECTOR3(66.0f,64.0f,0.0f), NULL, D3DXCOLOR(1.0f,1.0f,1.0f,(sin(t/500)+1)/2));
注意:这里的&rctNpc是选取的纹理矩形,D3DXVECTOR3(66.0f,64.0f,0.0f)是纹理的中心、D3DXCOLOR(1.0f,1.0f,1.0f,(sin(t/500)+1)/2)是alpha值随时间变化而变化的颜色。
这时候我们就能得到一个不停自传、不断淡入淡出的、走动着的和尚的动画。
评论