Monogame如何调整图像大小

Posted

技术标签:

【中文标题】Monogame如何调整图像大小【英文标题】:Monogame how to resize an image 【发布时间】:2021-11-25 00:30:58 【问题描述】:

我是使用 monogame 创建游戏的新手,我一直在试图弄清楚如何调整我刚刚添加的图像的大小。这是我目前所拥有的。

protected override void LoadContent()
    
        _spriteBatch = new SpriteBatch(GraphicsDevice);

        StickFigure = Content.Load<Texture2D>("StickFigure");
        
       
    

    protected override void Update(GameTime gameTime)
    
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
            Exit();

        if (Keyboard.GetState().IsKeyDown(Keys.W))
        
            stickPos.Y -= 10;
        
        if (Keyboard.GetState().IsKeyDown(Keys.S))
        
            stickPos.Y += 10;
        
        if (Keyboard.GetState().IsKeyDown(Keys.A))
        
            stickPos.X -= 10;
        
        if (Keyboard.GetState().IsKeyDown(Keys.D))
        
            stickPos.X += 10;
        


        base.Update(gameTime);
    

    protected override void Draw(GameTime gameTime)
    
        GraphicsDevice.Clear(Color.CornflowerBlue);

        _spriteBatch.Begin();

        _spriteBatch.Draw(StickFigure, stickPos, Color.White);

        _spriteBatch.End();

        base.Draw(gameTime);
    

有谁知道如何更改此图像的大小,以便我可以按比例缩放大小。谢谢!

【问题讨论】:

这个答案能帮到你吗? ***.com/questions/59058586/… 【参考方案1】:

SpriteBatch 类的 MonoGame 文档(链接如下)列出了几个包含缩放参数的 Draw 方法。 或者,我有一个模糊的记忆,简单地从特定的源矩形绘制到特定的目标矩形可能会自动调用缩放,但我可能错了。

SpriteBatch

【讨论】:

【参考方案2】:

根据要求,有三种方法可以做到这一点:

    如果移动速度始终为整数(如示例代码中 speed = 10,在 60 fps 时非常快),请将 stickPos 更改为 Rectangle。运动方向受整数速度限制,最低速度为1,只能在8个方向(45度)上移动,2为16个方向(22.5),……最快。碰撞由 Rectangle.Intersect 提供。

    在矩形中镜像 Vector2。所有方向和速度都是可能的。与 #1 中所述的 Vector2 速度和碰撞一起使用。

    使用 Draw 方法的 scale 参数。仅将其用于装饰物品,因为必须单独计算碰撞缩放。

其他说明:

将速度存储在变量或常量中。一次更改而不是四次。

每一步存储一次键盘状态:var ks = Keyboard.GetState();


在以 32x32 绘制 64x64 源纹理大小的情况下,以下代码给出了每种技术的示例。

1.

    // Class Level
    Rectangle stickPos = new Rectangle(0,0,32,32);
    int speed = 10; // const int speed = 10; if it will never change at runtime.

    protected override void Update(GameTime gameTime)
    
        var ks = Keyboard.GetState();
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || ks.IsKeyDown(Keys.Escape))
            Exit();

        if (ks.IsKeyDown(Keys.W))
        
            stickPos.Y -= speed;
        
        if (ks.IsKeyDown(Keys.S))
        
            stickPos.Y += speed;
        
        if (ks.IsKeyDown(Keys.A))
        
            stickPos.X -= speed;
        
        if (ks.IsKeyDown(Keys.D))
        
            stickPos.X += speed;
        
        base.Update(gameTime);
    

    protected override void Draw(GameTime gameTime)
    
        GraphicsDevice.Clear(Color.CornflowerBlue);

        _spriteBatch.Begin();

        _spriteBatch.Draw(StickFigure, stickPos, Color.White);

        _spriteBatch.End();

        base.Draw(gameTime);


    // Class Level
    Vector2 stickPos = new Vector2();
    Rectangle DrawRectangle = new Rectangle(0,0,32,32);
    float speed = 10; //any float value

    protected override void Update(GameTime gameTime)
    
        var ks = Keyboard.GetState();
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || ks.IsKeyDown(Keys.Escape))
            Exit();

        if (ks.IsKeyDown(Keys.W))
        
            stickPos.Y -= speed;
        
        if (ks.IsKeyDown(Keys.S))
        
            stickPos.Y += speed;
        
        if (ks.IsKeyDown(Keys.A))
        
            stickPos.X -= speed;
        
        if (ks.IsKeyDown(Keys.D))
        
            stickPos.X += speed;
        
        // repeat the following code anytime sickPos changes.
        DrawRectangle.X = (int)stickPos.X;
        DrawRectangle.Y = (int)stickPos.Y;
        base.Update(gameTime);
    

    protected override void Draw(GameTime gameTime)
    
        GraphicsDevice.Clear(Color.CornflowerBlue);

        _spriteBatch.Begin();

        _spriteBatch.Draw(StickFigure, DrawRectangle, Color.White);

        _spriteBatch.End();

        base.Draw(gameTime);

    // Class Level
    Vector2 stickPos = new Vector2(0,0);
    float speed = 10; //any float value
    Vector2 scale = new Vector2(.5f,.5f); // 64 to 32 == .5f

    // use Update changes in #2

    protected override void Draw(GameTime gameTime)
    
        GraphicsDevice.Clear(Color.CornflowerBlue);

        _spriteBatch.Begin();
/* This is the full overloaded Draw call used from SpriteBatch.cs line 179 in the following line.
public void Draw (Texture2D texture,
                Vector2 position,
                Rectangle? sourceRectangle,
                Color color,
                float rotation,
                Vector2 origin,
                Vector2 scale,
                SpriteEffects effects,
                float layerDepth)
*/

        _spriteBatch.Draw(StickFigure, stickPos, null, Color.White, 0, Vector2.Zero, scale, SpriteEffects.None,0);

        _spriteBatch.End();

        base.Draw(gameTime);

【讨论】:

以上是关于Monogame如何调整图像大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在以下代码中停止调整大小和裁剪?

窗口调整大小时如何调整图像大小?

imagemagick:调整大小后如何获取图像大小?

如何在浏览器宽度调整大小但保持相同高度时自动调整图像大小?

如何保存调整大小的图像?

如何调整正在打印的图像的大小?