2013-05-15 12 views
2

Как вы рисуете список строк с помощью spritebatch, чтобы он выглядел следующим образом:XNA - Как изменить ориентацию чертежа списка строк

Item1 Item2 
Item3 Item4 

Вместо Пункт 1 Пункт 2 Пункт 3 Пункт 4 или вместо:

Item1 
Item2 
Item3 
Item4 
+1

Просто создайте петлю; вы можете использовать два, если хотите. Существует несколько способов сделать это. Самый простой способ - это каждая вторая итерация, увеличивая количество строк. Затем нарисуйте. –

ответ

2

Нечто подобное было бы сделать его немного легче изменить позже:

int y = startPointY; 
int x = startPointX; 
int switchAt = items.Count/2; //<--- or where ever you might want to break up the strings 
int max = 0; 

for(int i = 0; i < items.Count; i++) 
{ 
    spriteBatch.DrawString(font, items[i], new Vector2(x, y), Color); 

    if(max < spriteFont.MeasureString(items[i])) 
    { 
     //this is to make sure the next column of strings are aligned 
     max = spriteFont.MeasureString(items[i]); 
    } 

    y += someYSpace; 

    if(i == switchAt) 
    { 
     x += max + someXSpace;//someXSpace not neccessary 
     y = startPointY;   
    }   
} 

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

Ваш рефакторинга код:

 Color color; 
     int linePadding = 3; 
     int switchAt = buttonList.Count/2 - 1;//minus one because the list starts at 0, and goes up to 3, so 1 is the switch point 


     else 
     { 
      spriteBatch.Draw(mMenuPhoto, new Rectangle(800, 150, mMenuPhoto.Width, mMenuPhoto.Height), Color.White); 
      float X = 210; 
      float Y = 600 - (spriteFont.LineSpacing * (buttonList.Count)/2) + ((spriteFont.LineSpacing + linePadding)); 
      float max = 0; 
      float linesXSpace = 30;//to seperate this lines to make room for '|' 

      for (int i = 0; i < buttonList.Count; i++) 
      { 
       color = (i == selected) ? Color.LightGray : Color.DarkSlateGray; 
       if (max < spriteFont.MeasureString(buttonList[i]).X) 
       { 
        max = spriteFont.MeasureString(buttonList[i]).X; 
       } 

       if (i != selected) 
       { 
        spriteBatch.DrawString(spriteFont, buttonList[i], new Vector2(X, Y), color); 
        Y += spriteFont.MeasureString(buttonList[i]).Y;  
        if (i == switchAt) 
        { 
         X += max + linesXSpace; 
         Y = 600 - (spriteFont.LineSpacing * (buttonList.Count)/2) + ((spriteFont.LineSpacing + linePadding)); 
        }      

       } 
       else 
       {  
        spriteBatch.DrawString(spriteFont, buttonList[i], new Vector2(X, Y), color); 
        spriteBatch.DrawString(spriteFont2, "|", new Vector2(X - 20, Y), Color.DarkGreen); 
        Y += spriteFont.MeasureString(buttonList[i]).Y; 
        if (i == switchAt) 
        { 
         X += max + linesXSpace; 
         Y = 600 - (spriteFont.LineSpacing * (buttonList.Count)/2) + ((spriteFont.LineSpacing + linePadding) * i); 
        }            
       } 
      } 
     } 

P.S. Мне нравится, как он выглядит до сих пор ^^.

+0

Посмотрите, почему мне нужен левый выровнять? : P – TheQuantumBros

+0

Вы можете разрешить им нажимать влево и вправо, чтобы прокручивать вправо и влево в меню, просто чтобы сделать его более интуитивным. Но это работает в любом случае. – Colton

+0

Я просто сделал это xD Как прямо перед тем, как вы предложили его xD – TheQuantumBros