Использование Content.Load <> в классе / подклассе - PullRequest
4 голосов
/ 22 марта 2011

Мне интересно, есть ли возможность использовать Content.Load <> в классе, который не является самой игрой, скажем, я хочу загрузить текстуру из класса, а не посылать ей текстуру .

namespace ProjectGame1
{
    public class Ship
    {
        public Texture2D texture;

        public Ship()
        {
        this.texture = Content.Load<Texture2D>("ship");
        }
    }
}

Это пример того, чего я пытаюсь достичь

Ответы [ 6 ]

8 голосов
/ 22 марта 2011

Вам просто нужно передать ContentManager объекту Ship:

public Ship(ContentManager content)
{
   this.texture = content.Load<Texture2D>("ship");
}

Из класса игры вы создаете экземпляр Ship:

Ship ship = new Ship(this.Content);
4 голосов
/ 22 марта 2011

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

Теперь,чтобы ваш код работал как есть, вам нужно передать ContentManager в конструктор, который вы создаете (см. ответ JoDG ).Но для этого вы должны построить его только после того, как ContentManager будет готов.Для менеджера контента Game это происходит во время и после вызова LoadContent (т.е. не в contstructor вашей игры или в методе Initialize).

Теперь вы можете сделать что-то как используя DrawableGameComponent, что намного лучше: просто дайте вашему классу Ship метод LoadContent и вызовите его из LoadContent вашей игры (как вы бы это сделали для Draw и Update).

Если текстура, которую использует ваш корабль, не является частью состояния вашего корабля (то есть: все корабли используют одну и ту же текстуру), вы можете даже сделать ее статичной, избавив вас от необходимости вызывать LoadContent на каждом корабле, который вы создаете.У меня есть пример этого этот ответ здесь , который также содержит список другой полезной информации о Content Manager.

3 голосов
/ 22 марта 2011

Если класс получает форму DrawableGameComponent, вы все равно можете использовать
Game.Content.Load<Texture2D>("ship");

1 голос
/ 22 марта 2011

Чтобы заставить это работать, вам понадобится Constructor, который принимает параметр типа Game. Это будет означать, что вам нужно добавить ссылку на Microsoft.Xna.Framework.Game.

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;

namespace ProjectGame1 
{     
    public class Ship : DrawableGameComponent // Notice the class now inherits from
    {                                         // DrawableGameComponent
        public Texture2D texture;          

        public Ship(Game game)         
            : base(game) // <<---- Don't forget to pass Game to the base constructor
        {         
            this.texture = game.Content.Load<Texture2D>("ship");         
        }     
    } 
} 
0 голосов
/ 23 марта 2011

Хорошо, я решил, я использовал другой метод, так как ваш не сработал, как я ожидал. Что я сделал, так это сделал "public static ContentManager asd;" а затем назначил его в ContentManager Game, а затем он работал, перенаправив его на "Game1.asd (Имена переменных являются примерами)

0 голосов
/ 22 марта 2011

Я думаю, вам понадобится ссылка на объект Game, чтобы получить его Content член.Это может быть либо передано, либо вы можете сделать игру синглтоном.

...