Как вы рисуете список строк с помощью spritebatch, чтобы он выглядел следующим образом:XNA - Как изменить ориентацию чертежа списка строк
Item1 Item2
Item3 Item4
Вместо Пункт 1 Пункт 2 Пункт 3 Пункт 4 или вместо:
Item1
Item2
Item3
Item4
Как вы рисуете список строк с помощью spritebatch, чтобы он выглядел следующим образом:XNA - Как изменить ориентацию чертежа списка строк
Item1 Item2
Item3 Item4
Вместо Пункт 1 Пункт 2 Пункт 3 Пункт 4 или вместо:
Item1
Item2
Item3
Item4
Нечто подобное было бы сделать его немного легче изменить позже:
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. Мне нравится, как он выглядит до сих пор ^^.
Посмотрите, почему мне нужен левый выровнять? : P – TheQuantumBros
Вы можете разрешить им нажимать влево и вправо, чтобы прокручивать вправо и влево в меню, просто чтобы сделать его более интуитивным. Но это работает в любом случае. – Colton
Я просто сделал это xD Как прямо перед тем, как вы предложили его xD – TheQuantumBros
Просто создайте петлю; вы можете использовать два, если хотите. Существует несколько способов сделать это. Самый простой способ - это каждая вторая итерация, увеличивая количество строк. Затем нарисуйте. –