3.2 旋转,缩放和镜像一张图像

问题

在将图像绘制到屏幕前你想对它进行旋转,缩放或镜像操作。

解决方案

SpriteBatch 类(见前一个教程)的Draw方法的不同重载可以让你很简单地进行上述操作。

工作原理

旋转/缩放/镜像一个图像

SpriteBatch.Draw方法有几个有用的重载。下面是最复杂的一个重载方法,参数会在后面加以讨论:

public void Draw (Texture2D texture,Vector2 position,Nullable<Rectangle> 
        sourceRectangle,Color color,float rotation,Vector2 origin,Vector2 scale,SpriteEffects effects,float layerDepth)

前两个参数和第四个参数在上一个教程中已经讨论过了,它们可以指定在屏幕上绘制哪个纹理和图像的左上角相对于屏幕的位置。

参数sourceRectangle让你可以只绘制图像的一部分。如果你将多个图像存储在一张图像中,如教程3-3中所做,那么这个参数是很有用的。如果你只想显示整个图像,那么应将这个参数设为null。

旋转

使用rotation 参数你可以旋转一个图像。你需要使用弧度制指定这个旋转角度,所以如果你想让图像顺时针旋转20度,你可以使用MathHelper.ToRadians(20),它可以帮你完成这个转换。

注意:2*PI弧度对应360角度,PI弧度对应180角度。所以如果你想旋转20度,你也可以使用MathHelper.Pi/180.0f*20.0f作为参数。

参数origin可以指定你想让图像上的哪个点位于屏幕上你在第二个参数中指定的位置上。例如,如果你将两个参数都指定为(0,0),那么图像的左上角将位于屏幕的左上角,如图3-2中的左上图所示。

图3-2

图3-2 不同origin (偏移量)参数对应的情况

如果一张64 × 64大小的图像,你将屏幕位置指定为(0,0),origin指定为(32,32),那么图像的中心点将位于屏幕的左上角,如图3-2的中上图所示。

如果两个参数都是(32,32),那么图像的中心点将位于屏幕的(32,32)位置,如图3-2的右上图所示。这时的结果与左上图一样。

更重要的是,你指定的这个origin参数还将作为旋转的中心点。在左上图的情况中,(0,0)为图像的origin,这个图像会围绕这个点旋转,如图3-2中的左下图所示。如果你指定(32,32)为图像的origin,这个图像会围绕它的中心点旋转,如图3-2的右下图所示。

缩放

如果你想放大/缩小图像,可以设置参数scale。因为这个参数是一个Vector2,你可以对图像的水平方向和竖直方向施加不同的缩放值。例如,设置为(0.5f, 2.0f)将会使宽度变为原始宽度的一半,高度变为原始高度的2倍。

镜像

参数effects让你可以水平或竖直翻转图像。通过flags,你可以使用SpriteEffects.FlipHorizontally|SpriteEffects.FlipVertically同时进行这两个操作,这和将图像旋转180度的效果是相同的。

层深度

最后一个参数让你可以指定图像位于哪个层,当你想将多个图像在各自的顶部时层的概念是很有用的,这会在后面两个教程中详细介绍。

代码

下面的简单代码使用了所有的默认effects:

protected override void Draw(GameTime gameTime) 
{
    device.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, Color.CornflowerBlue, 1, 0); 
    
    spriteBatch.Begin(); 
    spriteBatch.Draw(myTexture, new Vector2(50, 100), null, Color.White, MathHelper.ToRadians(20), 
    new Vector2(32, 32), new Vector2(0.5f, 2.0f), SpriteEffects.FlipVertically, 0); 
    spriteBatch.End(); 
    
    base.Draw(gameTime); 
}

这两个教程中涵盖的内容让你可以制作一些基本的2D游戏。你可以到我的网站www.riemers.net中XNA教程中的2D系列,里面有一个完整的2D游戏。

程序截图


发布时间:2009/10/9 13:08:15  阅读次数:6309

2006 - 2024,推荐分辨率1024*768以上,推荐浏览器Chrome、Edge等现代浏览器,截止2021年12月5日的访问次数:1872万9823 站长邮箱

沪ICP备18037240号-1

沪公网安备 31011002002865号