最近在C#语言中使用DirectX进行2D游戏的开发操作,其中用到了sprite来绘制纹理图,其中需要用到sprite旋转操作,这个问题纠结了我很久,

现在才发现sprite的旋转规律。

sprite 如果要绘制,必须在Draw或者Draw2D之前要加上sprite.Begin(SpriteFlags.AlphaBlend)语句,类似的locking来锁定自己的Texture Buffer,以免被其它程式,或你的游戏里的其他Thread (如果你采用 Multi Threaded 设计)干扰,而且参数最好是SpriteFlags.AlphaBlend,sprite与背景相融合起来,一般地,sprite如果是非矩形形状的,一般用png格式的图像,然后Draw或者Draw2D之后,就加上sprite.End()语句,表示绘制完成。

sprite.Draw2D()和sprite.Draw()函数,有多个重载函数,

其中,sprite.Draw2D()最常用的是

sprite.Draw2D(texture, spriteSize, dstRect, centerPoint, rotateAngle, position, Color.White);

texture是你要绘制的图

spriteSize 是绘制的图的大小,可能会改变图真实的大小,因为它只接受2的N次幂大小的长和宽

dstRect是你想要绘制多大的图,可以自行设定,

centerPoint一般表示图的中心,是旋转点

rotateAngle是旋转的角度

position是旋转的位置,

这个函数绘制出来的效果是: 围绕屏幕左上角(0,0)以position处为半径的地方绘图,如果你设置rotateAngle从0.1到2*PI时,你能看见sprite图从屏幕上端绘制屏幕左端类似圆的一段1/4圆弧,半径大概是position离屏幕左上角的距离。

如果你的centerPoint与position填的一模一样,你会发现,如果你设置rotateAngle从0.1到2*PI时,你能看见sprite图在屏幕左上角绘制着类似圆的一段1/4圆弧,半径就是sprite的长度和宽度左右。

上面的这个并不是我想要的效果。下面要介绍的这个方法真正帮我实现了我想要的效果。即围绕sprite图的中心在屏幕上对应的位置(pos)旋转

Microsoft.DirectX.Matrix transform = Microsoft.DirectX.Matrix.RotationZ(rotateAngle) *
Microsoft.DirectX.Matrix.Identity *
Microsoft.DirectX.Matrix.Translation(new Vector3(pos.X, pos.Y, 0));
sprite.Transform = transform;
sprite.Begin(SpriteFlags.AlphaBlend);
sprite.Draw(texture, spriteSize, new Vector3(spriteSize.Width / 2, spriteSize.Height / 2, 0), Vector3.Empty, Color.White);

sprite.End();

当你写成这样时:Microsoft.DirectX.Matrix.Translation(new Vector3(1, 1, 0)),而在sprite.Draw(texture, spriteSize, new Vector3(spriteSize.Width / 2, spriteSize.Height / 2, 0), new Vector3(pos.X, pos.Y, 0), Color.White);

你会发现,这样写的效果跟Draw2D一模一样,而且,最后绘制的是spriteSize的大小,并不是我们真正想要在屏幕上展现的大小。

posted on 2011-11-19 12:11  Blanche  阅读(486)  评论(0编辑  收藏  举报