Directx9学习(七)初识texture(2)

来源:互联网 发布:企业vpn网络解决方案 编辑:程序博客网 时间:2024/05/18 14:46

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() 返回毫秒msstarttime = 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处,这个图片左上角的位置就在vecPossprite->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








原创粉丝点击