0

当您必须在游戏上下文中显示一系列视觉组件(精灵)时,每个组件都需要相对于目标设备视口的高度和宽度(不一定是纵横比)的字面高度和宽度:

  • 是否有一个缩放类来帮助根据当前设备视口大小以动态方式提出缩放比例?
  • 我需要推出自己的缩放比例算法吗?
  • 我应该注意的任何跨平台问题?

这不是关于基于目标设备加载资产​​的问题,也不是关于如何执行精灵缩放的问题(在此处描述:http: //msdn.microsoft.com/en-us/library /bb194913.aspx),而是如何根据视口大小确定精灵比例的问题。

4

2 回答 2

2

您始终可以创建自己的缩放实现。

例如,默认目标视口尺寸为:

const int defaultWidth = 1280, defaultHeight = 720;

您当前的屏幕尺寸是800×600,这给了您一个(让我们使用 aVector2而不是两个浮点数):

int currentWidth  = GraphicsDevice.Viewport.Width,
    currentHeight = GraphicsDevice.Viewport.Height;

Vector2 scale = new Vector2(currentWidth  / defaultWidth,
                            currentHeight / defaultHeight);

这给了你一个{0.625; 0.83333}. 您现在可以在一个方便的SpriteBatch.Draw() 重载中使用它,该重载需要一个Vector2缩放变量:

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

或者,您可以将所有内容绘制到 aRenderTarget2D并将生成的图像从那里复制到主屏幕上的拉伸纹理,但这仍然需要上述SpriteBatch.Draw()重载,尽管如果您有很多绘图调用,它可能会节省您的时间。

于 2013-02-08T10:58:07.513 回答
1

生成规模的另一个选择是利用:

var scaleMatrix = Matrix.CreateScale(
           (float)GraphicsDevice.Viewport.Width / View.Width,
           (float)GraphicsDevice.Viewport.Width / View.Width, 1f);

http://msdn.microsoft.com/en-gb/library/bb195692.aspx

但这并不能满足我的需求,因为我必须滚动自己的变换来将触摸输入位置映射到“变换后的”精灵(通过知道自己的位置和大小来响应用户触摸输入)。

最后,我使用了基于百分比的方法。

我基本上得到了视口的高度和宽度......

GraphicsDevice.Viewport.Width  
GraphicsDevice.Viewport.Height

...然后根据我自己使用百分比与屏幕的相对大小计算我的​​精灵的高度和宽度(注意:“如前所述,它们采用文字高度和宽度”)。

//I want the buttons height and width to be 20% of the viewport 
var x, y = GraphicsDevice.Viewport.Width * 0.2f; //20% of screen width
var btnsize = new Vector(x,y);
var button = new GameButton(btnsize);

然后,一旦我有了按钮的大小,我就可以根据按钮的大小和可用的视口大小来计算屏幕上的位置以呈现按钮,而不是在基于百分比的相对位置上工作。

于 2013-02-09T14:14:32.247 回答