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

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








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值