Код вопроса XNA C # - PullRequest
       17

Код вопроса XNA C #

0 голосов
/ 13 июня 2011

Вот мой класс, который я сделал, чтобы нарисовать HUD:

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

namespace Sleyser1
{

public class Hud
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    Texture2D tempHUD;
    Rectangle viewportRect;

    SpriteFont HUD;
    Vector2 FontPos;
    Vector2 FontPos2;

    public void Hud()
    {
        HUD = Content.Load<SpriteFont>("HUD");
        FontPos = new Vector2(40, 20);
        FontPos2 = new Vector2(150, 20);

        spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, null, null, null);

        spriteBatch.Draw(tempHUD, viewportRect, Color.White);

        string output = "Health:";
        string output2 = "Magic:";
        Vector2 FontOrigin = HUD.MeasureString(output) / 2;
        spriteBatch.DrawString(HUD, output, FontPos, Color.Red, 0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);
        spriteBatch.DrawString(HUD, output2, FontPos2, Color.Blue, 0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);

        spriteBatch.End();

    }
}
}

Итак, как мне вызвать его отсюда, чтобы он рисовал.

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);


        base.Draw(gameTime);
    }

Я задаю вопрос: как вызвать метод из метода?

Ответы [ 4 ]

3 голосов
/ 13 июня 2011
public void Hud()

на самом деле является конструктором вашего класса, он не должен отвечать за рисование (особенно если вы рисуете один и тот же класс много раз, а цель конструктора состоит в том, чтобы ... создать класс)

Итак, первый шаг - удалить это:

spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, null, null, null);

spriteBatch.Draw(tempHUD, viewportRect, Color.White);

string output = "Health:";
string output2 = "Magic:";
Vector2 FontOrigin = HUD.MeasureString(output) / 2;
spriteBatch.DrawString(HUD, output, FontPos, Color.Red, 0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);
spriteBatch.DrawString(HUD, output2, FontPos2, Color.Blue, 0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);

spriteBatch.End();

из конструктора и добавить его в новый метод класса, такой как Draw ().

UPDATE:

XNA предоставляет класс Game, который, по-видимому, является основным классом приложения.Он должен содержать ссылку на объект вашего класса.

spritebatch также является членом класса Game, поэтому его следует передать в функцию Draw вашего HUD в качестве параметра.Затем все, что вам нужно сделать, это вызвать метод Draw HUD (объекта HUD, который доступен из объекта Game) из метода Draw игры.

1 голос
/ 13 июня 2011

Согласен с другими ответами здесь, но я бы пошел еще дальше.

Превратите ваш класс Hud в компонент, особенно тот, который реализует DrawableGameComponent. Таким образом, вы можете инкапсулировать всю свою логику Hud в одном месте, и, как следует из названия, компонент может рисовать сам.

Итак, шаги: -

  • В вашем методе LoadContent добавьте следующий код: -

    Services.AddService (typeof (SpriteBatch), spriteBatch);

  • Создание нового игрового компонента в Visual Studio 2010

  • Изменить класс, от которого наследуется ваш компонент. Для начала это будет GameComponent. Измените это на DrawableGameComponent
  • Переопределить метод LoadContent. Хотя вы не загружаете какой-либо дополнительный контент в своем примере, вы можете добавить контент Hud позже.
  • Переопределить метод обновления. Любые изменения состояния в Hud (то есть изменение значений здоровья или магии) должны быть сделаны здесь.
  • Переопределить метод Draw. Все, что касается рисунка, должно быть здесь. Обратите внимание, что вы можете получить дескриптор основной службы SpriteBatch (объявленной ранее), включив следующий код в этот переопределенный метод: -

    SpriteBatch spriteBatch =
            Game.Services.GetService(typeof(SpriteBatch)) as SpriteBatch;
    
  • Наконец, в методе initialize вашего игрового класса добавьте следующий код: -

Components.Add (новый HudComponent (this));

Ваш компонент теперь будет частью основного игрового цикла.

0 голосов
/ 13 июня 2011

Создайте абстрактный класс, например GameElement, который содержит методы Update и Draw.

Затем создайте (статический) список GameElement List<GameElement> Elements.

Сделайте так, чтобы ваш класс HUD наследовал GameElement и реализовал методы Update (обновляет логику в зависимости от игрового времени) и Draw (рисует элемент игры на поверхности). При создании HUD добавьте его в список Elements

В основном вызове метода Draw foreach(var element in Elements) element.Draw().

Таким образом, вы обрабатываете рисование и обновление HUD и любого другого игрового элемента (Scene, Player и т. Д.), И вам никогда не придется менять основной цикл рисования и обновления.

Вы даже можете сделать GameElement интерфейсом IGameElement, чтобы не ограничиваться наследованием класса GameElement.

0 голосов
/ 13 июня 2011

Вы не можете вызвать класс, вы создаете его экземпляр.

Classname class = new Classname();
class.method();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...