XNA C#为什么我的字符串没有绘制?

时间:2012-02-21 03:17:17

标签: c# button menu xna draw

当你点击最顶部的按钮时,它假设在屏幕上绘制一个字符串,但它没有显示出来。我移动了mainMenu.UpdateButtons();到Main.cs中的Draw方法但绘制了字符串,然后再次绘制背景图像。使其显示为字符串瞬间显示并消失。为什么要这样做?

Main.cs

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using TestGame.Controls;
using TestGame.GameStates;

namespace TestGame
{
public class Main : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    InputHandler inputHandler;
    public SpriteBatch spriteBatch;
    public SpriteFont spriteFont;
    MainMenu mainMenu;
    Vector2 position;

    public Main()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";

        inputHandler = new InputHandler();
        mainMenu = new MainMenu(this);

        graphics.PreferredBackBufferWidth = 1280;
        graphics.PreferredBackBufferHeight = 720;
    }

    protected override void Initialize()
    {
        this.IsMouseVisible = true;

        base.Initialize();
        mainMenu.MenuInitialize();
    }

    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);

        spriteFont = Content.Load<SpriteFont>(@"Fonts\MainFont");

        mainMenu.MenuLoadContent();
    }

    protected override void UnloadContent()
    {
    }

    protected override void Update(GameTime gameTime)
    {
        inputHandler.Update();

        if (inputHandler.currentKeyState.IsKeyDown(Keys.Escape))
            this.Exit();
        mainMenu.frameTime = gameTime.ElapsedGameTime.Milliseconds / 1000;
        MouseState mouseState = Mouse.GetState();
        mainMenu.mouseX = mouseState.X;
        mainMenu.mouseY = mouseState.Y;
        mainMenu.previouslyPressed = mainMenu.mousePressed;
        mainMenu.mousePressed = mouseState.LeftButton == ButtonState.Pressed;
        mainMenu.UpdateButtons();
        base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.Black);
        spriteBatch.Begin();
        mainMenu.MenuDraw();
        spriteBatch.End();
        base.Draw(gameTime);
    }
}
}

MainMenu.cs

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace TestGame.GameStates
{
public class MainMenu
{
    enum buttonState { hover, up, released, down }
    const int numberOfButtons = 4, newGameButtonIndex = 0, loadGameButtonIndex = 1, optionsButtonIndex = 2, quitButtonIndex = 3, buttonHeight = 48, buttonWidth = 80;
    Color[] buttonColor = new Color[numberOfButtons];
    Rectangle[] buttonRect = new Rectangle[numberOfButtons];
    buttonState[] buttonSt = new buttonState[numberOfButtons];
    Texture2D[] buttonTexture = new Texture2D[numberOfButtons];
    double[] buttonTimer = new double[numberOfButtons];
    public bool mousePressed, previouslyPressed = false;
    public int mouseX, mouseY;
    public double frameTime;
    int buttonPadding;

    Main main;
    Texture2D backgroundImage;
    Texture2D backgroundImageFade;

    public MainMenu(Game game)
    {
        main = (Main)game;
    }

    public void MenuInitialize()
    {
        for (int i = 0; i < numberOfButtons; i++)
        {
            buttonSt[i] = buttonState.up;
            buttonColor[i] = Color.White;
            buttonTimer[i] = 0.0;
            buttonRect[i] = new Rectangle(0, buttonPadding, buttonWidth, buttonHeight);
            buttonPadding += buttonHeight;
        }
    }

    public void MenuLoadContent()
    {
        backgroundImage = main.Content.Load<Texture2D>(@"Backgrounds\titlescreen");
        backgroundImageFade = main.Content.Load<Texture2D>(@"Backgrounds\titlescreenfade");
        buttonTexture[newGameButtonIndex] = main.Content.Load<Texture2D>(@"Sprites\desktop");
        buttonTexture[loadGameButtonIndex] = main.Content.Load<Texture2D>(@"Sprites\desktop");
        buttonTexture[optionsButtonIndex] = main.Content.Load<Texture2D>(@"Sprites\desktop");
        buttonTexture[quitButtonIndex] = main.Content.Load<Texture2D>(@"Sprites\desktop");
    }

    public void MenuDraw()
    {
        main.spriteBatch.Draw(backgroundImage, new Vector2(0, 0), Color.White);

        for (int i = 0; i < numberOfButtons; i++)
        {
            main.spriteBatch.Draw(buttonTexture[i], buttonRect[i], buttonColor[i]);
        }
    }

    Boolean targetImageAlpha(Rectangle rect, Texture2D texture, int x, int y)
    {
        return targetImageAlpha(0, 0, texture, texture.Width * (x - rect.X) / rect.Width, texture.Height * (y - rect.Y) / rect.Height);
    }

    Boolean targetImageAlpha(float tx, float ty, Texture2D texture, int x, int y)
    {
        if (targetImage(tx, ty, texture, x, y))
        {
            uint[] data = new uint[texture.Width * texture.Height];
            texture.GetData<uint>(data);

            if ((x - (int)tx) + (y - (int)ty) * texture.Width < texture.Width * texture.Height)
            {
                return ((data[(x - (int)tx) + (y - (int)ty) * texture.Width] & 0xFF000000) >> 24) > 20;
            }
        }
        return false;
    }

    Boolean targetImage(float tx, float ty, Texture2D texture, int x, int y)
    {
        return (x >= tx && x <= tx + texture.Width && y >= ty && y <= ty + texture.Height);
    }

    public void UpdateButtons()
    {
        for (int i = 0; i < numberOfButtons; i++)
        {
            if (targetImageAlpha(buttonRect[i], buttonTexture[i], mouseX, mouseY))
            {
                buttonTimer[i] = 0.0;
                if (mousePressed)
                {
                    buttonSt[i] = buttonState.down;
                    buttonColor[i] = Color.Blue;
                }
                else if (!mousePressed && previouslyPressed)
                {
                    if (buttonSt[i] == buttonState.down)
                    {
                        buttonSt[i] = buttonState.released;
                    }
                }
                else
                {
                    buttonSt[i] = buttonState.hover;
                    buttonColor[i] = Color.LightBlue;
                }
            }
            else
            {
                buttonSt[i] = buttonState.up;

                if (buttonTimer[i] > 0)
                {
                    buttonTimer[i] = buttonTimer[i] - frameTime;
                }
                else
                {
                    buttonColor[i] = Color.White;
                }
            }

            if (buttonSt[i] == buttonState.released)
            {
                onButtonClick(i);
            }
        }
    }

    void onButtonClick(int i)
    {
        switch (i)
        {
            case newGameButtonIndex:
                main.spriteBatch.Begin();
                //main.spriteBatch.DrawString(main.spriteFont, "Creating new game", new Vector2(100, 200), Color.White);
                main.spriteBatch.Draw(backgroundImageFade, new Vector2(0, 0), Color.White);
                main.spriteBatch.End();
                break;
            default:
                break;
        }

    }
}
}

1 个答案:

答案 0 :(得分:1)

正在绘制,但随后您将在Draw方法中将其删除。当您开始将绘图代码与更新代码混合时,这就是您将遇到的问题。

所以这里有一个关于你现在游戏中发生的事情的例子。

  1. 更新主游戏
  2. 更新按钮
  3. 绘制主游戏
  4. 绘制按钮
  5. 然后点击发生,这就是发生的事情。

    1. 更新主游戏
    2. 更新按钮
    3. onButtonClick - &gt;这是你绘制文字的地方
    4. 绘制主游戏 - &gt;屏幕现在清除,你画出按钮
    5. 绘制按钮
    6. 所以这一切都“正常”,而不是你真正的意图。您将要分离绘图代码,以便从Draw方法调用中进行绘制。基本上检查一下buttonState是否已经在Draw方法中“释放”,然后绘制你想要的文本。