2012-02-21 71 views
0

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

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

它正在绘制的,但这样就可以进行删除它在你的绘图方法。当您开始将您的绘图代码与您的更新代码混合时,这就是您会遇到的问题。

所以这里有一个例子,你现在在游戏中发生了什么。

  1. 更新主要游戏
  2. 更新按钮
  3. 绘制主要游戏
  4. 抽奖按钮

则发生点击这里发生了什么。

  1. 更新主要游戏
  2. 更新按钮
  3. onButtonClick - >这是你画你的文字
  4. 抽奖主要游戏 - >现在清屏和你画你的按钮
  5. 抽奖按钮

所以这一切都“工作”,而不是你真正打算如何。您将要分离您的绘图代码,以便您从Draw方法调用进行绘制。基本上检查是否buttonState已经在你的Draw方法中“释放”,然后绘制你想要的文本。

+0

我应该检查按钮是否已经在我的Main Draw方法或MainMenu中被释放? – KeyHeart 2012-02-21 04:03:34

+1

我会检查MainMenu,只需检查MainMenu的Draw方法。有助于保持这种封装。菜单将知道如何绘制自己。 – 2012-02-21 04:13:39

+0

如果(buttonSt [test] == buttonState.released) { main.spriteBatch.DrawString(main.spriteFont,“Creating new game”,new Vector2(100,200),Color.White),我将此添加到MenuDraw 中。 ; } – KeyHeart 2012-02-21 04:37:38

相关问题