【问题标题】:Scaling sprites (not textures) for target viewport size/device in MonoGame在 MonoGame 中为目标视口大小/设备缩放精灵(不是纹理)
【发布时间】:2013-01-24 02:43:01
【问题描述】:

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

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

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

【问题讨论】:

  • 什么精灵的比例,什么大小,与多大的视口相比?举个例子就好了。

标签: xna scaling monogame


【解决方案1】:

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

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

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() 重载,尽管它可能会节省您的时间如果你有很多draw call。

【讨论】:

  • 这肯定是正确的答案,但就我的需要而言,它的不足之处在于缩放与点击手势检测混淆(未提及)。我的回答以一种非常简单的方式解决了我的问题,但我知道这可能不是最干净的解决方案。这就是我将其标记为正确答案的原因。
  • 嗨,我已经使用了这些代码,你能告诉我如何在此之后缩放触摸输入......
  • @uncle_scooge 如果您想回答其他问题,您应该找到或提出这样的问题,而不是发表评论。
  • 这不是一个不同的问题...它与此完全相关。缩放后输入将不起作用..你知道这个...
  • 无论如何,你可能已经对你的触摸输入做了一些事情......顺便说一句,我在两天前之前已经创建了一个关于这个的问题......如果你愿意,请回答......下面是链接..
【解决方案2】:

生成比例的另一个选择是利用:

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);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 2020-08-17
    • 2018-06-09
    • 1970-01-01
    相关资源
    最近更新 更多