在MonoGame中缩放目标视口大小/设备的精灵(不是纹理)

时间:2013-02-08 10:45:05

标签: xna scaling monogame

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

  • 是否有缩放类可以根据当前设备视口大小以动态方式提供缩放比例?
  • 我是否需要推出自己的缩放比例算法?
  • 我应该注意哪些跨平台问题?

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

2 个答案:

答案 0 :(得分:2)

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

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

const int defaultWidth = 1280, defaultHeight = 720;

您当前的屏幕尺寸为800×600,它会给您一个(让我们使用Vector2代替两个花车):

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

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

这会给你一个{0.625; 0.83333}。现在,您可以在方便SpriteBatch.Draw() overload中使用Vector2缩放变量:

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

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

答案 1 :(得分: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);

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