2013-08-31 3 views
0

Я делаю игру в Windows Phone, и я новичок в XNA. Моя проблема связана с Content.RootDirectory = "Content";, который находится в моем основном файле. Когда я начинаю отладку, то скажите мне, что в моих подклассов файлы не могут найти логотип, который находится в содержании, когда я положил ещеЗагрузка текстуры из подкласса

Content_logo.RootDirectory = «Content»;

Logo_Texture2d = Content_logo.Load<Texture2D>("Logo"); 

Если я пытаюсь сделать другой корневой каталог ошибка показывает вверх говорить, что это свойство не может быть изменено после того, как содержание было загружено в ContentManager. Мой вопрос в том, как я могу загрузить свою текстуру из каталога содержимого из подкласса.

public class MainFile : Microsoft.Xna.Framework.Game 
{ 
    GraphicsDeviceManager graphics; 
    SpriteBatch spriteBatch; 
    ScreenStates screentState; 

    Rectangle TouchS_Y_X; 

    Logo logo; 
    Menu0 menu; 
    Choose_Pets choose_pets; 
    ScreenStates.CurrentGameState GameState; 

    public MainFile() 
    { 
     graphics = new GraphicsDeviceManager(this); 

     Content.RootDirectory = "Content"; 

     // Frame rate is 30 fps by default for Windows Phone. 
     TargetElapsedTime = TimeSpan.FromTicks(333333); 

     // Extend battery life under lock. 
     InactiveSleepTime = TimeSpan.FromSeconds(1); 

     this.screentState = new ScreenStates(); 
     ///choose_pets = new Choose_Pets(); 
     choose_pets = new Choose_Pets(); 

     logo = new Logo(); 

     menu = new Menu0(); 
    } 


    protected override void Initialize() 
    { 
     // TODO: Add your initialization logic here 
     GameState = ScreenStates.CurrentGameState.Logo; 
     base.Initialize(); 

    } 


    protected override void LoadContent() 
    { 
     TouchS_Y_X = new Rectangle(0, 0, 1, 1); 
     // Create a new SpriteBatch, which can be used to draw textures. 
     spriteBatch = new SpriteBatch(GraphicsDevice); 

     this.menu.Load_Menu(GraphicsDevice, Content); 
     choose_pets.Load_ChoosePet(Content, GraphicsDevice); 

     // TODO: use this.Content to load your game content here 
     base.LoadContent(); 
    } 


    protected override void UnloadContent() 
    { 
     // TODO: Unload any non ContentManager content here 
     //this.logo.Unload_logo(Content); 
    } 


    protected override void Update(GameTime gameTime) 
    { 
     // Allows the game to exit 
     if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) 
      this.Exit(); 

     #region Games States 

     switch (GameState) 
     { 
      case ScreenStates.CurrentGameState.Logo: 

        logo.Update_logo(gameTime); 

        this.logo.Load(this.Content, this.GraphicsDevice); 

        if (logo.FadeOut_logo == true) 
        GameState = ScreenStates.CurrentGameState.Menu; 

        break; 

      case ScreenStates.CurrentGameState.Menu: 
        menu.Update_Menu(gameTime); 

       break; 

      case ScreenStates.CurrentGameState.CharactersChooser: 
        //choose_pets.Update_petchoose(gameTime); 
       break; 
     } 
     #endregion 

     // TODO: Add your update logic here 
     base.Update(gameTime); 
    } 


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

     #region GameStateDraw 
     spriteBatch.Begin(); 

     switch(GameState) 
     { 
      case ScreenStates.CurrentGameState.Logo:   
       logo.Draw(spriteBatch); 
      break; 

       //Menu Draw State 
      case ScreenStates.CurrentGameState.Menu: 
      menu.Draw_Menu(spriteBatch); 
      break; 

      case ScreenStates.CurrentGameState.CharactersChooser: 
       // choose_pets.Draw_petChoose(spriteBatch); 
      break; 
     } 
     spriteBatch.End(); 
#endregion 

     base.Draw(gameTime); 
    } 
} 
} 

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

class Logo 
{ 
    Texture2D Logo_Texture2d; 
    Rectangle Logo_Rec; 
    Color Logo_color; 

    public bool FadeOut_logo = false; 

    public double _Timer_logo; 

    SpriteFont Norm_fonts; 

    public void Load(ContentManager Content_logo, GraphicsDevice graphics_logo) 
    { 
     Logo_Texture2d = Content_logo.Load<Texture2D>("Logo"); 
     Logo_Rec = new Rectangle(0, 0, graphics_logo.Viewport.Width, graphics_logo.Viewport.Height); 

     Norm_fonts = Content_logo.Load<SpriteFont>("Fonts\\Normal_Font"); 
    } 

    //public void Unload_logo(ContentManager Content_logo) 
    // { 
     // if (FadeOut_logo == true) 
     //  Content_logo.Unload(); 
    //} 

    public void Update_logo(GameTime gametime_logo) 
    { 

     _Timer_logo += gametime_logo.ElapsedGameTime.TotalSeconds; 

     if (gametime_logo.ElapsedGameTime.TotalSeconds >= 10) 
      Logo_color.A--; Logo_color.B--; Logo_color.G--; Logo_color.R--; 

     if (Logo_color.B == 0) 
      FadeOut_logo = true; 

    } 

    public void Draw(SpriteBatch spriteBatch) 
    { 
     spriteBatch.Draw(Logo_Texture2d, Logo_Rec, Logo_color); 
     spriteBatch.DrawString(Norm_fonts, "CurrentState: Logo" + " Timer: " + ((int)_Timer_logo).ToString(), new Vector2(0, 0), Color.White); 
    } 
} 
} 

отладки остановка, потому что не может найти логотип и мой формат изображения .png так это не формат.

ответ

1

Когда XNA компилируется, он импортирует и обрабатывает все активы - текстуры, звук, музыку, шрифты и т. Д. - в .xnb-файлы. Стандартный тип файла для текстуры - .png.

Если текстуры не могут быть найдены, это, вероятно, означает, что она не импортируется. Добавьте контент, щелкнув правой кнопкой мыши ProjectNameContent (Content) -> Добавить -> Существующий элемент в Обозревателе решений.

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

На боковой ноте вы вызываете Logo.Load() из MainFile.Update() на каждом шаге - это может быть хорошей идеей изменить это.

+0

Моя текстура находится в содержимом, который я использую для загрузки изображения, но когда я более глубоко запишу эту ошибку. эти изображения, где работает suceful, но я не знаю, что случилось, что эта ошибка продолжает появляться. – user2727653

+0

ohh, и я благодарю вас за то, что сказал мне Logo.Load(); Я не заметил, что xD – user2727653

0

Создание другого менеджера контента не способ обойти это.

Одним из способов решения этой проблемы было бы передать ссылку на Content в качестве параметра метода. Например:

class Foo 
{ 
    public void LoadContent(ContentManager content) 
    { 
      Logo_Texture2d = content.Load<Texture2D>("Logo"); 
    } 
} 

public class Game1 : Game 
{ 
    //... 
    protected override void LoadContent() 
    { 
      Foo.LoadContent(Content); 
    } 
} 

EDIT: также вы загружаете контент через VS? Щелкните правой кнопкой мыши [ProjectName] Content (Content) -> Добавить -> Существующий элемент? Просто проверяю ...

+0

У меня уже есть что-то вроде этого, но я думаю, что подкласс не читает контентный контент, я поставлю два кода моего основного файла и мой логотип подкласса. – user2727653

+0

Добавлен еще один ответ в ответ на редактирование OP - охватывает другую тему, чем указанная здесь. –

0

Если вам нужно использовать Content в подклассе, вы sholud передать Content к этому классу, или, может быть установлено, что класс наследовать от GameComponent, так что вы можете просто получить доступ к менеджеру контента с помощью Game.Content.
Вам не нужно объявлять другой контент.

+0

, если мне не нужно объявлять его, почему он дает мне эту ошибку, изображение находится в нужном месте, я до сих пор не знаю почему. – user2727653

 Смежные вопросы

  • Нет связанных вопросов^_^