имя текстуры не существует в текущем контексте

Я столкнулся с проблемой, из-за которой я не могу распознать ни одну из своих текстур за пределами метода loadContent.

protected override void LoadContent()
{
    spriteBatch = new SpriteBatch(GraphicsDevice);
    Texture2D tileStart = Content.Load<Texture2D>("tile_start");
    Texture2D tileCrossJunction = Content.Load<Texture2D>("tile_crossjunction");
    Texture2D tileTJunction = Content.Load<Texture2D>("tile_t-junction");
    Texture2D tileCorner = Content.Load<Texture2D>("tile_corner");
    Texture2D tileHallway = Content.Load<Texture2D>("tile_hallway");
    Texture2D tileDeadEnd = Content.Load<Texture2D>("tile_deadend");
    Texture2D sqrPlayer = Content.Load<Texture2D>("sqr_player");
    Texture2D sqrBaddieSmall = Content.Load<Texture2D>("sqr_baddie_small");
    Texture2D sqrBaddie = Content.Load<Texture2D>("sqr_baddie");
    Texture2D sqrBaddieLarge = Content.Load<Texture2D>("sqr_baddie_large");
}

В этом методе нет проблем, но когда я пытаюсь сослаться на любую из этих текстур в моем методе Draw...

protected override void Draw(GameTime gameTime)
{
    GraphicsDevice.Clear(Color.DarkGray);
    base.Draw(gameTime);
    spriteBatch.Begin();
    spriteBatch.Draw(tileStart, new Vector2(0,0), Color.White);
    spriteBatch.End();
}

Я получаю сообщение об ошибке «tileStart не существует в текущем контексте».

Обычно я бы сказал, что он не распознается, потому что tileStart — это переменная, объявленная в методе LoadContent, и поэтому ее нельзя использовать где-либо еще. Причина, по которой я запутался, заключается в том, что каждый учебник, который я читал, показывает именно этот синтаксис, и он, кажется, работает нормально в этих случаях, так что здесь явно происходит что-то еще, чего я не понимаю.

Любая помощь, которую вы, ребята, можете предоставить, будет принята с благодарностью, спасибо.


person KWiP    schedule 25.11.2013    source источник
comment
Если вы опубликуете ссылку на учебник, который вы используете, я постараюсь понять это. Кроме того, это просто невозможно, если код, который вы разместили выше, точен (см. Мой ответ).   -  person Colton    schedule 25.11.2013


Ответы (1)


В C# "область действия" переменных четко определена. В вашем коде текстуры создаются в рамках метода «LoadContent», а затем удаляются после выполнения метода. Что вам нужно сделать, так это разместить текстуры на уровне «класса» следующим образом:

//outside of the method, and in general, should be placed near the top of the class    
Texture2D tileStart;
Texture2D tileCrossJunction;
Texture2D tileTJunction;
Texture2D tileCorner;
Texture2D tileHallway;
Texture2D tileDeadEnd;
Texture2D sqrPlayer;
Texture2D sqrBaddieSmall;
Texture2D sqrBaddie;
Texture2D sqrBaddieLarge;

protected override void LoadContent()
{
     spriteBatch = new SpriteBatch(GraphicsDevice);

     //be sure to remove Texture2D from these
     //this will insure that the "class" level variables are called
     tileStart = Content.Load<Texture2D>("tile_start");
     tileCrossJunction = Content.Load<Texture2D>("tile_crossjunction");
     tileTJunction = Content.Load<Texture2D>("tile_t-junction");
     tileCorner = Content.Load<Texture2D>("tile_corner");
     tileHallway = Content.Load<Texture2D>("tile_hallway");
     tileDeadEnd = Content.Load<Texture2D>("tile_deadend");
     sqrPlayer = Content.Load<Texture2D>("sqr_player");
     sqrBaddieSmall = Content.Load<Texture2D>("sqr_baddie_small");
     sqrBaddie = Content.Load<Texture2D>("sqr_baddie");
     sqrBaddieLarge = Content.Load<Texture2D>("sqr_baddie_large");
}

Как только вы это сделаете, «область действия» переменных будет на уровне класса, и вы сможете использовать их из других методов внутри класса.

Другими словами, нет способа получить доступ к переменной, объявленной в методе, извне этого метода (конечно, не передавая ее в качестве параметра другому методу), учебники, которые вы просматриваете, могут быть просто краткими, и ожидая, что вы сделаете это «правильно».

person Colton    schedule 25.11.2013
comment
Большое спасибо; работал как шарм. У меня сложилось впечатление, что переменные, которые я использовал для хранения своих текстур, должны были быть объявлены внутри метода 'LoadContent'. Чтобы исправить ошибку, я просто заранее объявил их пространство имен в основном классе. Еще раз большое спасибо за то, что указали мне правильное направление, я уверен, что в будущем у меня будет много таких же простых проблем. - person KWiP; 26.11.2013