0

在我目前正在开发的游戏中,我有一个播放按钮,它有一个Vector2、一个Rectangle和一个Texture2D。但不知何故,当我运行游戏时,播放按钮是不可见的,但它仍然会对鼠标碰撞/检测做出反应。
这是我的代码:

    Texture2D buttonPlay;
    Rectangle buttonPlayRect;
    Vector2 buttonPlayPos;

    Point mousePosition;

    int resolutionX = ScreenManager.GraphicsDeviceMgr.PreferredBackBufferWidth;
    int resolutionY = ScreenManager.GraphicsDeviceMgr.PreferredBackBufferHeight;

    public void Initialize()
    {
        buttonPlayPos = new Vector2(resolutionX / 2 - 64, resolutionY / 2 - 64);
    }

    public override void LoadAssets()
    {
       buttonOptionsPos = new Vector2(resolutionX / 2 - 64, resolutionY / 2);

       backgroundTile = ScreenManager.ContentMgr.Load<Texture2D>("Menu/background");
       buttonOptions = ScreenManager.ContentMgr.Load<Texture2D>("Menu/optionsButton");
       buttonPlay = ScreenManager.ContentMgr.Load<Texture2D>("Menu/playButton");

       buttonPlayRect = new Rectangle((int)buttonPlayPos.X, (int)buttonPlayPos.Y, buttonPlay.Width, buttonPlay.Height);

        base.LoadAssets();
    }

    public override void Update(Microsoft.Xna.Framework.GameTime gameTime)
    {
        MouseState mState = Mouse.GetState();
        mousePosition = new Point(mState.X, mState.Y);

        base.Update(gameTime);
    }

    public override void Draw(Microsoft.Xna.Framework.GameTime gameTime)
    {
        for (int x = 0; x < 10; x++)
        {
            for (int y = 0; y < 10; y++)
            {
                ScreenManager.Sprites.Draw(backgroundTile, new Vector2(tileWidth * x, tileHeight * y), Color.White);
            }
        }

        ScreenManager.Sprites.Draw(buttonPlay, buttonPlayPos, buttonPlayRect, Color.White);
        ScreenManager.Sprites.Draw(buttonOptions, buttonOptionsPos, Color.White);

        if (buttonPlayRect.Contains(mousePosition))
        {

        }

        base.Draw(gameTime);
    }
}

我在其他项目中也遇到了一段时间的这个问题,是什么导致Texture2D不出现?提前致谢!

4

1 回答 1

0

当你画一些东西时,我建议你只使用 的Vector2 positiondestinationRectangleSpriteBatch.Draw有时它的行为会出乎意料。
更重要的是,如果您将它们都作为参数传递,则没有理由设置位置并使用它来声明矩形。

作为一个建议,你应该检查buttonPlayRect.Contains(mousePosition)你的Update方法,Draw应该只管理你的游戏的绘制,而不是逻辑。

更新

如果您需要根据当前分辨率更改按钮的位置,您可以绘制它们以在每个Draw周期中声明位置

new Vector2(resolutionX / 2 - 64, resolutionY / 2 - 64);

或者您可以通过这种方式添加事件处理程序:

Initialize在你的方法中添加这个:

Game.Window.ClientSizeChanged += Window_ClientSizeChanged;

然后用这样的东西创建Window_ClientSizeChanged方法:

private void Window_ClientSizeChanged(object sender, EventArgs e)
{
    buttonPlayPos = new Vector2(resolutionX / 2 - 64, resolutionY / 2 - 64);
    buttonPlayRect = new Rectangle((int)buttonPlayPos.X, (int)buttonPlayPos.Y, buttonPlay.Width, buttonPlay.Height);
}

当然resolutionXresolutionY必须是更新的值。

于 2013-10-29T17:16:58.450 回答