矩形不绘制我想要的地方以及如何使用变换矩阵处理spritebatch.begin()

时间:2014-12-16 17:17:59

标签: c# matrix xna transform

基本上我需要在xna中与一个6人团队进行大学比赛,我们遇到了一个问题。 我们有按钮,它们基本上是带有矩形的纹理,用于查看鼠标是否在单击时位于矩形内部。我们有一个方法,当鼠标在单击矩形时,返回true。矩形x和y坐标与纹理相同,并且它具有纹理宽度和高度。

最近我们开始使用spritebatch.begin()中的变换矩阵实现全屏和缩放。 以下是计算转换的代码:

public static void Update(Microsoft.Xna.Framework.GameTime gT)
{
    if (enToFollow != null)
        v2CameraPosition = enToFollow.PropLocalPosition;

    if (Data.PropApplyGraphics)
        ApplyGraphics();

    transform = Matrix.CreateTranslation(-v2CameraPosition.X, -v2CameraPosition.Y, 0.0f) *spriteScale;
    v2SpriteScale = new Vector2(scale.X, scale.Y);
}

/// <summary>
/// Clears the camera target. Causes the camera to stand still.
/// </summary>
public static void SetNull()
{ enToFollow = null; }

/// <summary>
/// Sets the camera target to follow a certain object. It will instantly jump to the target!
/// </summary>
/// <param name="enToFollow">Target to follow.</param>
public static void SetTarget(Entity enToFollowNew)
{ enToFollow = enToFollowNew; }

public static void ApplyGraphics()
{
    scalex = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width / (float)screen.X;
    scaley = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height / (float)screen.Y;
    finalscale = 1f;

    if (!Data.PropIsFullscreen)
    {
        if (scalex < 1f || scaley < 1f)
            finalscale = Math.Min(scalex, scaley);
    }
    else
    {
        finalscale = scalex;
        if (Math.Abs(1 - scaley) < Math.Abs(1 - scalex))
            finalscale = scaley;
    }

    scale = new Vector2((float)Data.GetSetScreenDimensions.X / screen.X, (float)Data.GetSetScreenDimensions.Y / screen.Y);
    spriteScale = Matrix.CreateScale(scale.X, scale.Y, 1);
    Data.PropApplyGraphics = false;
}

在更新中创建的矩阵可以由同一个类中的属性检索,该属性返回该矩阵并在spritebatch.begin()中使用,如下所示:

spriteBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, Camera.PropTransform);

当我使用在graphicsdevice.preferredbackbufferwidth en height中设置的1080p分辨率全屏时,绘制按钮的位置乘以在上面的applygraphics()方法中计算的spritescale。然而,矩形不受此乘法的影响。无论如何,当我试图通过更新中计算的vector2 spritescale来实现这一点时,它不会正确返回矩形。

让我详细说明,创建的vector2与矩形的起始坐标相乘的代码是这样的,希望让矩形再次匹配精灵:

public Rectangle PropRectangle
{ 
    get { return new Rectangle((int)this.PropRealPosition.X * (int)Camera.PropSpriteScale.X, (int)this.PropRealPosition.Y * (int)Camera.PropSpriteScale.Y, inTextureWidth, inTextureHeight); } 
}

然而,当我将这个矩形写入控制台时,它仍会返回一个矩形,就像上面的乘法从未发生过一样,即使Camera.PropSpriteScale.X en .Y的值大约为1.42 ish(1920/1344和1080 / 756)。为什么会这样发生?

另一个问题是,如何在保持按钮工作的同时正确处理此缩放问题?

0 个答案:

没有答案