2011-09-18 60 views
2

我想知道如何創建HUD。 我目前擁有在設定的座標處繪製到屏幕上的健康,法力和體驗欄。這一點的不足之處在於,當照相機將酒吧保持在設定的座標位置時,我希望他們調整到視口或不受位置的影響,而只是簡單地畫到屏幕上。XNA C#創建擡頭顯示器

  • 編輯 我設法讓HUD使用相機的X和Y座標進行調整。 我已經創建了一個單獨的類來繪製HUD,但現在它們不調整。

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using Microsoft.Xna.Framework; 
    using Microsoft.Xna.Framework.Graphics; 
    using Microsoft.Xna.Framework.Input; 
    using GameOne.Components; 
    
    
    
    
    namespace GameOne.GameScreens 
    { 
    
    public class HUD : BaseGameState 
    { 
    
    Player player; 
    
    Texture2D HealthBar; 
    Texture2D HealthBarPositive; 
    Texture2D HealthBarNegative; 
    Texture2D ManaBar; 
    Texture2D ManaBarPositive; 
    Texture2D ManaBarNegative; 
    Texture2D ExpBar; 
    Texture2D ExpBarPositive; 
    
    int CurrentHealth = 100; 
    int CurrentMana = 45; 
    int CurrentExp = 0; 
    
    public HUD(Game game, GameStateManager manager) 
        : base(game, manager) 
    { 
        player = new Player(game); 
    } 
    
    public void LoadContent() 
    { 
        base.LoadContent(); 
    
        HealthBar = Game.Content.Load<Texture2D>(@"GUI\healthBar"); 
        HealthBarPositive = Game.Content.Load<Texture2D>(@"GUI\healthBarPositive"); 
        HealthBarNegative = Game.Content.Load<Texture2D>(@"GUI\healthBarNegative"); 
        ManaBar = Game.Content.Load<Texture2D>(@"GUI\manaBar"); 
        ManaBarPositive = Game.Content.Load<Texture2D>(@"GUI\manaBarPositive"); 
        ManaBarNegative = Game.Content.Load<Texture2D>(@"GUI\manaBarNegative"); 
        ExpBar = Game.Content.Load<Texture2D>(@"GUI\expBar"); 
        ExpBarPositive = Game.Content.Load<Texture2D>(@"GUI\expBarPositive"); 
    } 
    
    public void Update(GameTime gameTime) 
    { 
        if (InputHandler.KeyDown(Keys.F1)) 
        { 
         CurrentHealth += 1; 
        } 
    
        if (InputHandler.KeyDown(Keys.F2)) 
        { 
         CurrentHealth -= 1; 
        } 
    
        if (InputHandler.KeyDown(Keys.F3)) 
        { 
         CurrentMana += 1; 
        } 
    
        if (InputHandler.KeyDown(Keys.F4)) 
        { 
         CurrentMana -= 1; 
        } 
    
        if (InputHandler.KeyDown(Keys.F5)) 
        { 
         CurrentExp += 1; 
        } 
    
        if (InputHandler.KeyDown(Keys.F6)) 
        { 
         CurrentExp -= 1; 
        } 
    
        CurrentHealth = (int)MathHelper.Clamp(CurrentHealth, 0, 100); 
        CurrentMana = (int)MathHelper.Clamp(CurrentMana, 0, 45); 
        CurrentExp = (int)MathHelper.Clamp(CurrentExp, 0, 500); 
    } 
    
    public void Draw(GameTime gameTime) 
    { 
    
        GameRef.SpriteBatch.Draw(
         HealthBarNegative, 
         new Rectangle((int)player.Camera.Position.X + 150, (int)player.Camera.Position.Y + 630, 150, 15), 
         Color.White); 
    
        GameRef.SpriteBatch.Draw(
         HealthBarPositive, 
         new Rectangle((int)player.Camera.Position.X + 150, (int)player.Camera.Position.Y + 630, 150 * (int)CurrentHealth/100, 15), 
         Color.White); 
    
        GameRef.SpriteBatch.Draw(
         HealthBar, 
         new Rectangle((int)player.Camera.Position.X + 150, (int)player.Camera.Position.Y + 630, 150, 15), 
         Color.White); 
    
        GameRef.SpriteBatch.Draw(
         ManaBarNegative, 
         new Rectangle((int)player.Camera.Position.X + 150, (int)player.Camera.Position.Y + 650, 150, 15), 
         Color.White); 
    
        GameRef.SpriteBatch.Draw(
         ManaBarPositive, 
         new Rectangle((int)player.Camera.Position.X + 150, (int)player.Camera.Position.Y + 650, 150 * (int)CurrentMana/45, 15), 
         Color.White); 
    
        GameRef.SpriteBatch.Draw(
         ManaBar, 
         new Rectangle((int)player.Camera.Position.X + 150, (int)player.Camera.Position.Y + 650, 150, 15), 
         Color.White); 
    
        GameRef.SpriteBatch.Draw(
         ExpBarPositive, 
         new Rectangle((int)player.Camera.Position.X + 10, (int)player.Camera.Position.Y + 680, 1260 * (int)CurrentExp/500, 15), 
         Color.White); 
    
        GameRef.SpriteBatch.Draw(
         ExpBar, 
         new Rectangle((int)player.Camera.Position.X + 10, (int)player.Camera.Position.Y + 680, 1260, 15), 
         Color.White); 
    } 
    } 
    } 
    
+0

相機平底鍋時更新座標有什麼問題? – mrduclaw

回答

5

當你畫你的健康吧,是它,你指定你的相機矩陣Spritebatch.Begin(...)裏面?

如果您在自己的Spritebatch.Begin中繪製它,而沒有相機,則健康條的位置將相對於屏幕保持不變。

0

當您使用DrawableGameComponent擴展您的類時,可以使用DrawOrder屬性將其設置爲最頂層。 該類會有點不同,你必須重載更新,繪製和LoadContent,但它會一直。

這隻有在使用帶有SpriteBatch的HUD時纔有用。