【发布时间】: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