XNA C # Создание Heads Up Display - PullRequest
       33

XNA C # Создание Heads Up Display

2 голосов
/ 18 сентября 2011

Мне было интересно, как подойти к созданию HUD. В настоящее время у меня есть индикатор здоровья, маны и опыта, отображаемый на экране с заданными координатами. Недостатком этого является то, что, когда камера панорамирует, столбики остаются в своих заданных координатах, я хочу, чтобы они подстраивались под область просмотра или не зависели от позиций, а просто рисовались на экране.

  • Редактировать Мне удалось настроить 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);
    }
    }
    }
    

Ответы [ 2 ]

5 голосов
/ 18 сентября 2011

Когда вы рисуете свои столбцы здоровья, находится ли он внутри Spritebatch.Begin (...), где вы указываете матрицу вашей камеры?

Если вы рисуете ее в своем собственном Spritebatch.Begin, без камерыположение столбцов здоровья останется относительно экрана.

0 голосов
/ 20 сентября 2011

Когда вы расширяете свой класс с DrawableGameComponent, вы можете использовать свойство DrawOrder, чтобы установить его сверху. Класс будет немного другим, вам придется перегружать Update, draw и LoadContent, но все будет одинаково.

Это полезно только если вы используете HUD с SpriteBatch.

...