使用vector2 Monogame C#缩放精灵大小

时间:2017-02-03 20:48:14

标签: c# graphics resolution monogame

所以我目前正在为我的游戏开发解决方案独立性,而我正在用剑形象测试它。位置变化正在发挥作用,但每当我开始做大小时,我最终都会出现空白屏幕。

这些是我为了获得精灵的新位置和大小而运行的函数。

    private static float CalcRatio(Vector2 size)
    {
        return size.Y / size.X;
    }

    public static Vector2 CalculateNewPos(Vector2 refPos, Vector2 refScreenSize, Vector2 currentScreenSize)
    {
        return new Vector2((refPos.X / refScreenSize.X) * currentScreenSize.X, 
                          (refPos.Y / refScreenSize.Y) * currentScreenSize.Y);
    }

    public static Vector2 CalculateNewSize(Vector2 refSize, Vector2 refScreenSize, Vector2 currenScreenSize)
    {
        float origRatio = CalcRatio(refSize);
        float perW = refSize.X * 100f / refScreenSize.X;
        float newW = perW / 100f * currenScreenSize.X;
        float newH = newW * origRatio;
        return new Vector2(newW, newH);
    }

在Game1的初始化函数中,我运行以下代码:

 graphics.PreferredBackBufferHeight = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height;
 graphics.PreferredBackBufferWidth = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width;
 swordPosition = CalculateNewPos(swordRefPosition, new Vector2(1920, 1080), new Vector2(GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width, GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height));
 swordSize = CalculateNewSize(swordRefSize, new Vector2(1920, 1080), new Vector2(GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width, GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height));

在加载函数中我运行:

swordTexture = content.Load<Texture2D>("SOLDIER_Sword");
swordPosition = new Vector2(300, 0);
swordRefSize = new Vector2(557, 490);
swordSize = new Vector2(557, 490);
swordRefPosition = new Vector2(300, 0);
swordColor = Color.White;
sword = new StaticSprite(swordTexture, swordPosition, swordSize, swordColor);

每当屏幕分辨率发生变化时更新(我设置了按钮):

 graphics.PreferredBackBufferHeight = setHeight;
 graphics.PreferredBackBufferWidth = setWidth;
 graphics.ApplyChanges();
 swordPosition = CalculateNewPos(swordRefPosition, new Vector2(1920, 1080), new Vector2(setWidth, setHeight));
 swordSize = CalculateNewSize(swordRefSize, new Vector2(1920, 1080), new Vector2(setWidth, setHeight));

在平局中:

batch.Draw(swordTexture, swordPosition, null, swordColor, 0f, Vector2.Zero, swordSize, SpriteEffects.None, 0f);

很抱歉,代码太多了,我真的很难过,无法确定哪里出错,所以我只是包含了改变变量的所有内容。

非常感谢您花时间仔细研究这个问题。

1 个答案:

答案 0 :(得分:0)

请注意,当前显示模式仅在全屏显示时才有意义。它是VIEWPORT,可以告诉您spritebatch的投影矩阵的宽度/高度。

那就是说,你应该真正关注Bjarke的帖子,因为你通常不想重新调整每个项目。