2017.08.30
今天感受一下利用sprite来画序列帧。
由于Sprite可以定义图像的源矩形,也就是可以在屏幕上画这个图像的任何一部分,所以这就可以画序列帧。
需要的参数:整个图片texture的长宽,这整个图片一共多少列多少行(图片帧个数,横行竖列),每一个图片帧的长宽,图片帧更新间隔
首先需要计算需要绘制的图片帧的矩形:(图片帧的Index从0开始)
(int)left = (当前图片帧的Index % 总列数) * 每帧图片宽度
(int)top = (当前图片帧的Index / 总列数) * 每帧图片高度
right = left + 每帧图片宽度
bottom = top + 每帧图片高度
这样就能根据Index来绘制不同位置的图片了
每帧图片的长宽(我这边是8*8 = 64帧 的一个图片):
HRESULT result = D3DXGetImageInfoFromFile(fileName.c_str(), &info);
frame_w = info.Width / 8;
frame_h = info.Height / 8;
利用Windows.h中自带的GetTickCount()计时(返回毫秒ms)来更新所绘制的帧的Index ,其中传了两个引用,分别是帧的Index和总时间,delay是多少毫秒后更新帧,direction是一次更新多少帧
void SpriteAnim(int & frame, int startframe, int endframe, int direction, int & starttime, int delay)
{
if ((int)GetTickCount() > starttime + delay)
{
//计时 如果经过的时间大于delay 那么更新这个starttime和帧(+或者-|direction|个帧)
// GetTickCount() 返回毫秒ms
starttime = GetTickCount();
frame += direction;
//防止加和减越界
if (frame > endframe)
frame = startframe;
if (frame < startframe)
frame = endframe;
}
}
然后利用Sprite的可以绘制任意区域的特性画图:
void SpriteDrawFrame(LPDIRECT3DTEXTURE9 tex, int destx, int desty, int framenum, int framew, int frameh, int columns) //最后一个参数是列数
{
//在窗口中的位置
D3DXVECTOR3 vecPos((float)destx, (float)desty, 0.0f);
D3DCOLOR white = D3DCOLOR_XRGB(255, 255, 255);
RECT rect;
rect.left = (framenum % columns) * framew;
rect.top = (framenum / columns) * frameh;
rect.right = rect.left + framew;
rect.bottom = rect.top + frameh;
//将整个texture的rect部分画在窗口中的vecPos处,这个图片左上角的位置就在vecPos
sprite->Draw(tex, &rect, NULL, &vecPos, white);
}
总的调用顺序:
if (d3ddev->BeginScene())
{
sprite->Begin(D3DXSPRITE_ALPHABLEND); //锁住Sprite并开始绘制
//从第0帧开始到63帧(共64帧),每次加一帧,30ms更新一次
SpriteAnim(frameIndex, 0, 63, 1, startTime, 30);
//在512,384的位置画第frameIndex帧,长和宽,共八列
SpriteDrawFrame(texture, 512, 384, frameIndex, frame_w, frame_h, 8);
sprite->End();
d3ddev->EndScene();
d3ddev->Present(NULL, NULL, NULL, NULL); //交换后台到前台
}
总结:
1.LPD3DXSPRITE :处理sprite对象的指针
2.D3DXCreateTextureFromFileEx 从文件加载到纹理
3.D3DXCreateSprite 创建sprite对象,让指针指向某个sprite
4.画Sprite: spriteobj->Draw
5.Texture对象指针:LPDIRECT3DTEXTURE9
6.D3DXGetImageInfoFromFile 返回这个图像文件的信息
7.spriteobj->Begin() 和 spriteobj->End() 绘图期间锁住和解锁Sprite