【问题标题】:How Would You Draw a RectangleF with Spritebatch.Draw?您将如何使用 Spritebatch.Draw 绘制 RectangleF?
【发布时间】:2018-12-31 00:30:21
【问题描述】:

我正在尝试创建一个自上而下的游戏,您可以在其中向 8 个方向移动。我已经实现了 Vector2 以便以标准化方式移动。我使用 spritebatch 系统使用标准矩形(源和目标)进行绘制,但很快更改为 RectangleF,因为常规矩形使用整数。

Spritebatch 无法识别 RectangleF,因此返回错误“无法从 'System.Drawing.RectangleF' 转换为 'Microsoft.Xna.Framework.Vector2'?”。 Color 也会返回不明确的,无论是 'System.Drawing' 还是 'Microsoft.Xna.Framework.Color',它总是返回如何无法转换为 'Microsoft.Xna.Framework.Rectangle'。

在此代码中,调用了 Vector2(Position)并用于绘制 RectangleF 的位置。然后,我使用 Spritebatch.Draw 绘制带有 Source 和 Destination 的纹理,并且它总是会更新以提供移动角色的含义。

public static RectangleF destinationRectangle, sourceRectangle;

public void Draw(SpriteBatch spriteBatch)   
    {
        int width = 64;
        int height = 64;
        realPositionX = PlayerMovement.Position.X; 
        realPositionY = PlayerMovement.Position.Y;

        sourceRectangle = new RectangleF(currentFrame * width, row * height, width, height);
        destinationRectangle = new RectangleF(realPositionX, realPositionY, width, height);
        spriteBatch.Begin();
        spriteBatch.Draw(Player, destinationRectangle, sourceRectangle, Microsoft.Xna.Framework.Color.White); //Error Occurs Here
        spriteBatch.End();
    }

我很困惑我应该如何解决这个问题,有没有办法通过 SpriteBatch 绘制一个 RectangleF 或者我必须看看另一种方法?

谢谢。

【问题讨论】:

  • 很遗憾,您不能将 RectangleF 与 Spritebatch 一起使用。我已经成功编写了自己的 RectangleF 结构,其中包括到 MonoGame 的 Rectangle 的显式转换。
  • 感谢您的回复,也许我需要研究如何绘制和更新角色的替代方法。
  • 把rectangleF的用法改成矩形就行了?特别是因为它是在每次绘制调用时创建的,所以您不会遇到性能损失。无论如何,在绘制精灵时需要整数是有原因的。您总是希望“像素完美”,否则最终会出现一些绘图伪影。另外,我不明白为什么它们需要是静态的,这通常不是一个好主意。
  • @HeX 我又看了你的代码。如果您只想在浮点值处绘制角色的位置,可以使用 Draw 重载接收 Vector2,您可以使用 RectangleF 的 X 和 Y 值创建它。
  • 感谢两位的回复。从那以后,我将其改回使用常规矩形。我还意识到,您可以使用一些特定的数字来解决这个问题。这一切的开始是,如果不规范化,玩家的位置会表现得很糟糕。如果您确实进行了规范化,那么您的值将以浮点数给出,因此如果矩形使用整数,它就达不到目的。说数字 7,如果你对其进行标准化,你会得到 (7 x 0.707 = 4.949),将这个值四舍五入 (5),当代码运行时,它会再次使用整数。 (sqrt(5^2 + 5^2) = 7.07), ~ 7 (起始编号)。足够好:)

标签: c# xna monogame system.drawing spritebatch


【解决方案1】:

绝对没有理由使用 RectangleF。 通常你在游戏中使用基于像素的坐标系,因此 Rectangle 类是你想要的。

除此之外,将玩家位置存储在 Vector2 中并使用适当的重载是一种更好的方法:

SpriteBatch.Draw (Texture2D, Vector2, Color)

【讨论】:

  • 是的,我在网上没有很多关于动画如何工作的资源,但现在我知道了。我也确实读过上面有人说 rectangleF 不适合像素完美运动。上面我写了一个详细的解决方案来解决我最终使用的问题。但是,是的,感谢您让我知道并确认上述内容:D
  • 在这种情况下我强烈推荐这个教程rbwhitaker.wikidot.com/monogame-2d-tutorials
猜你喜欢
  • 2012-03-13
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 2011-01-13
  • 2012-11-27
相关资源
最近更新 更多