2013-04-30 4 views
1

У меня есть оператор switch, который берет кортеж и выбирает, какой набор вложенных операторов switch должен входить на основе второго значения кортежа. Все работает достаточно хорошо, но так как мне нужно загрузить 4 карты вокруг центральной карты для плавных переходов каждый раз, когда оператор switch заканчивается тем, что занимает больше места, чем требуется. Итак, я перерабатываю метод, который теперь просто загружает и рисует базовые спрайты. Я столкнулся с несколькими проблемами с исключениями исключения null refrence для менеджера контента при загрузке спрайтов и не знаю, как правильно передать контент методу Load.Оператор переопределения загрузки карты рефакторинга в XNA

Вот мои abreviated Коммутационные заявления в Draw:

GraphicsDevice.Clear(Color.CornflowerBlue); 
spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend); 
Map.FindLocation(Map.LocationXY, ZoneDecider); 
switch (Map.TupleHolder.Item1) 
{ 
    case 0: 
    { 
     switch (Map.TupleHolder.Item2) 
     { 
     case 0: 
      if (LoadNextMap) 
      { 
       if (Right) 
       { 
        backgroundCenter.LoadContent(this.Content,"BackgroundBottom"); 
        backgroundCenter.position = new Vector2(0, 0); 
       } 
       else if (Left) 
       { 
        backgroundCenter.LoadContent(this.Content, "BackgroundBottom"); 
        backgroundCenter.position = new Vector2(0, 0); 
       } 
       else if (Top) 
       { 
        backgroundCenter.LoadContent(this.Content, "BackgroundBottomRight"); 
        backgroundCenter.position = new Vector2(0, 0); 
       } 
       else if(Bottom) 
       { 
        backgroundCenter.LoadContent(this.Content, "BackgroundRight"); 
        backgroundCenter.position = new Vector2(0, 0); 
       } 
       backgroundWest.LoadContent(this.Content, "BackgroundBottom"); 
       backgroundWest.position = new Vector2(westTransition, 0); 
       backgroundEast.LoadContent(this.Content, "BackgroundBottomRight"); 
       backgroundEast.position = new Vector2(eastTransition, 0); 
       backgroundNorth.LoadContent(this.Content, "BackgroundMid"); 
       backgroundNorth.position = new Vector2(0, northTransition); 
       backgroundSouth.LoadContent(this.Content, "BackgroundBottomRight"); 
       backgroundSouth.position = new Vector2(0, southTransition); 
       LoadNextMap = false; 
      } 
      //new SpriteBatch(graphicsDevice) 
      backgroundCenter.Draw(this.spriteBatch); 
      //Drawbackground.drawBackground(backgroundWest, backgroundEast, 
      // backgroundNorth, backgroundSouth); 
      backgroundWest.Draw(this.spriteBatch); 
      backgroundEast.Draw(this.spriteBatch); 
      backgroundNorth.Draw(this.spriteBatch); 
      backgroundSouth.Draw(this.spriteBatch); 

      break; 

Это не идеально, поэтому для начала рефакторинга я двигаюсь секции из стороны Ф.О. КРП заявления на новый метод.

Новый метод:

public class DrawNextBackground 
{ 
    SpriteBatch spriteBatch; 
    ContentManager theContentManager; 

    public void drawBackground(Background backgroundWest, 
     Background backgroundEast, Background backgroundNorth, Background backgroundSouth) 
    { 
     float eastTransition = 1068; 
     float westTransition = -1068; 
     float northTransition = -936; 
     float southTransition = 936; 

     backgroundWest.LoadContent(this.theContentManager, "BackgroundBottom"); 
     backgroundWest.position = new Vector2(westTransition, 0); 
     backgroundEast.LoadContent(this.theContentManager, "BackgroundBottomRight"); 
     backgroundEast.position = new Vector2(eastTransition, 0); 
     backgroundNorth.LoadContent(this.theContentManager, "BackgroundMid"); 
     backgroundNorth.position = new Vector2(0, northTransition); 
     backgroundSouth.LoadContent(this.theContentManager, "BackgroundBottomRight"); 
     backgroundSouth.position = new Vector2(0, southTransition); 
     backgroundWest.Draw(this.spriteBatch); 
     backgroundEast.Draw(this.spriteBatch); 
     backgroundNorth.Draw(this.spriteBatch); 
     backgroundSouth.Draw(this.spriteBatch); 
    } 
} 

Метод Load:

public void LoadContent(ContentManager theContentManager, string theAssetName) 
    { 
     SpriteSize = theContentManager.Load<Texture2D>(theAssetName); 
    } 

Как я могу идти о получении метода Load заметить каждый объект имеет содержание? Все, что я пробовал до сих пор, не сработало.

+0

Как будут выглядеть ваши плавные переходы? ваш спрайт все время находится в центре вашего окна, а ваша карта движется или наоборот, и карта переключается, если вы выходите из нее? – WiiMaxx

+0

Когда я выхожу из карты, следующая карта движется в направлении игрока. Как только следующая карта передает плеер, игрок начинает перемещаться с помощью карты, пока не достигнет противоположной стороны. Переход похож на переключатель карты в Zelda. – ZeroPhase

+0

Это работает сейчас? или нулевой ref все еще остается? что такое тип класса вашего исходного класса и что он наследует? – WiiMaxx

ответ

2

Для нулевого содержимого вы должны пройти оригинальный контент-менеджер (в Game1.cs) для вашего класса, чтобы рисовать, не пытайтесь создать новый.

//add this to the drawNextBackground class 
    //where the content manager in game1.cs is "Content" 
    //Content is inherited from another class, and an example 
    //should be visible in the LoadContent method in game1.cs   
    public void initialize(ContentManager contentManager) 
    { 
      theContentManager = contentManager; 
    } 
+0

Это должно быть в состоянии получить ContentManager, который у меня есть, в моем обычном классе рисования? – ZeroPhase

+0

Я не вижу ничего инициализированного в качестве менеджера контента в game1.cs 'Content.RootDirectory =« Content »;' – ZeroPhase

+0

ContentManager в game1.cs называется «Content». Он унаследован от другого класса, поэтому вы не увидите переменную экземпляра, но вызывается в методе LoadContent. Что-то вроде: Content.Load (...). – Colton

2

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

Что о загрузке только 3 Карты в Макс давайте думать об этом
вы знаете:
игрока (положение, скорость, направление перемещения),
Карта (размер, ходить способные направления покинуть Карта).

Пример Карта

--------------------- 
    | P | | | | | 
    --------------------- 
    | | | | | | 
    --------------------- 
    | | | | | | 
    --------------------- 
    | | | | | | P = Player 
    --------------------- 

Итак, теперь вы можете сказать, если P.Position близко к краю карты нагрузки эта карта здесь было бы сверху, слева
это уменьшит ваши затраты на погрузочные

теперь вы можете затратить это, добавив несколько деталей к вашей карте, назовем ее как Walkdirections

--------------------- 
    | X | X | X | X | X | 
    --------------------- 
    | P | | | | | 
    --------------------- 
    | | | | | | 
    --------------------- 
    | | | | | | P = Player 
    --------------------- X = Player can't pass this field 

как проектировщик вашей карты вы знаете, что он не может идти сверху на карте 14, так что вы не должны загрузить его, проверяя map.Walkdirections

держать свою старую карту, пока он находится в диапазоне нагрузки, может быть, он хочет вернуться

  Map 1    Map 2 
    --------------------- --------------------- 
    | | | | | | | X | X | X | X | X | 
    --------------------- --------------------- 
    | | | | | | | P | | | | | 
    --------------------- --------------------- 
    | | | | | | | | | | | | 
    --------------------- --------------------- 
    | | | | | | | | | | | | P = Player 
    --------------------- --------------------- X = Player can't pass this field 

некоторые вещи в P.Speed ​​вы должны увеличить диапазон нагрузки со скоростью игрока

я надеюсь, что это поможет вам
кстати я ничего об XNA не знаю, на данный момент

+0

Итак, следующая карта будет загружаться только тогда, когда я близок к запуску перехода к карте. Это определенно полезно, но это не решает моего нулевого отказа от рефактора. – ZeroPhase

+0

@ ZeroPhase - ваш LoadContent() также реорганизован? если нет, вы должны проверить свое значение 'theContentManager', потому что они пустые, возможно, вам не хватает заполнить. не должно быть пустым после вашего 'Load()' из 'theContentManager.Load (theAssetName);' – WiiMaxx

+0

@ZeroPhase oh, вы никогда не инициализируете его 'ContentManager theContentManager;' должно быть что-то вроде 'ContentManager theContentManager = new ContentManager() ; 'потому что иначе он всегда будет null – WiiMaxx

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