Я работаю над игрой и разрабатываю Главное меню, там у меня есть сценарий настроек. Эта сцена содержит несколько вкладок и для вкладки видео, я хотел бы выпадающее меню, которое позволяет переключать разрешения. Теперь, в последней части я понимаю логику, но, используя инфраструктуру XNA, я не понимаю логики выпадающего меню. Спасибо за любую помощь :)Выпадающее меню в моногаме/XNA
ответ
Я на самом деле сделал DropDown для моей игры, это на самом деле не так сложно, когда вы думаете об этом. Сначала вам понадобится класс DropDownContainer
и DropDownElement
. DropDownContainer
- это верхняя часть DropDown, где вы видите выбранную в данный момент опцию. DropDownElement
s - выбираемые параметры, которые вы показываете, когда пользователь нажимает DropDownContainer
.
Вот как работает код:
- Создать массив
DropDownElement
с в вашемDropDownContainer
классе. - В конструкторе
DropDownContainer
передайте числоDropDownElement
s и массив строк, где каждая строка является текстом определенногоDropDownElement
. - Создайте конструктор
DropDownElement
, возьмите строку и в ней введитеDraw(spriteBatch)
метод, нарисуйте эту строку над текстуройDropDownElement
. Пройдите в качестве позиции для контейнера, и он будет использоваться в качестве основы для позиционирования элементов. Пример цикла в конструкторе
DropDownContainer
«s:for (int i = 0; i < elements.Count; i++) { elements[i] = new DropDownElement(spriteFont, textArray[i], new Vector2(containerPosition.X, (containerPosition.Y + (34 * (i + 1))) + 2), this.textColor, content); // 34 = DropDownElement's Texture height }
- Убедитесь, что вы передаете в
ContentManager content
в конструкторах обоих классов, так что вы можете загрузить свои активы. - Есть ограничивающего
Rectangle
для обоих этих классов, где этоX
иY
являются(int)containerPosition.X, (int)containerPosition.Y
иWidth
иHeight
являются размерыTexture2D
. - В
DropDownContainer
«Update(gameTime)
метода s, есть чек, если курсор находится в пределахbounds
и если пользователь щелкает изменить флаг, как это:clicked = !clicked;
- В
DropDownContainer
»Draw(spriteBatch)
метода s, проверитьif (clicked)
и сделатьelements
массив, пересекая его. - Проигрывать DropDown следующим образом:
private DropDownContainer dropDown = new DropDownContainer(...);
и называть его соответствующими методами. - Чтобы проверить, какая опция была выбрана, просто введите
Text
свойствоDropDownElement
s. - Когда вы закончите с этим, вы можете добавить такие вещи, как эффекты наведения мыши и затухание цвета текста в/из, используя линейную интерполяцию.
Я также создал TextBox для своей игры XNA, но это касается некоторых тяжелых P/Invokes, и поскольку вы не знаете, как сделать базовый Drop Down, это было бы слишком сложно объяснить.
Edit обратиться комментарий ниже:
Есть несколько проблем с вашей логикой, я выделю их:
- без
string
собственности, который получает/устанавливает текст из элементы, как бы вы проверили, какой элемент был выбран? Например.if (container.Text == "text of first element") { /* user chose the lowest resolution */ }
- Если вы не передадите текст конструктору, нет способа установить текст
Element
, если нетText
. - Как вы бы добавили стоимость
1600x900
прямо на номерenum
? Если я не понимаю вас, нет никакого способа, которым вы могли бы поставитьstring
(1600x900 это строка) вenum
...
Даже если вы должны были сделать что-то вроде этого:
enum resOptions
{
_800x600 = 0,
_1280x1024 = 1,
_1920x1080 = 2,
// etc.
}
А может быть, попросите их заказать тот же путь в массиве DropDownElement
, но все же вам придется реализовать свой собственный способ, чтобы узнать, какой вариант пользователь нажал ... В конечном итоге вы проведете проверку свойства Text
DropDownContainer
.
Таким образом, я бы настоятельно советовал использовать здесь enum
, потому что он только слишком усложнял уже достаточно сложный алгоритм DropDown. Вам потребуется гораздо больше времени, чтобы написать способ проверить, какой вариант был выбран.
Я бы просто установить Container
«s Text
к щелкнули Element
» ы Text
по клику пользователя, и это, как я хотел бы проверить выбранный вариант. Если вы все еще хотите сделать это с помощью enum
, я боюсь, что я не буду очень помогать, потому что я уже дал вам понять, как сделать это простым способом. Если вы хотите сделать это по-другому, вам придется написать код для этого самостоятельно. В конце концов, идея этого сайта не «Напишите мой код для меня», а скорее «Дайте мне хорошую идею, как правильно ее написать себя».
Чрезмерное усложнение ситуации, когда вы можете просто сделать это как с меньшими усилиями, так и с меньшим количеством кода - это плохая практика программирования. Только если вы планируете расширить функциональность DropDown
, это делает ее сложной. Но в вашем случае я честно не вижу смысла устанавливать Text
вот так. Почему бы вам отказаться от простого, но эффективного решения и преследовать то, о чем вы не уверены?
Если у вас есть дополнительные вопросы, не стесняйтесь комментировать.
Я бы рекомендовал использовать существующую библиотеку пользовательского интерфейса. Вместо того, чтобы пытаться внедрить усовершенствованную систему пользовательского интерфейса с нуля.
Хорошая библиотека UI: Empty Keys
Благодарим вас за то, что вы показали мне это, однако, поскольку я в классе, к сожалению, я не могу загрузить сторонние библиотеки на этот компьютер без администратора. – Matttheawesome1
Я бы не сделал это как выпадающее меню.
Это очень простой элемент ui для мыши/клавиатуры. Подумайте, как пользователь будет взаимодействовать с этим при игре с контроллером.
Даже если вы не планируете играть в эту игру с контроллером, вы можете обнаружить, что избегать сложных элементов ui, таких как раскрывающееся меню, упрощает для вас продолжение прототипирования, а не отвлекает пользовательский интерфейс.
Предлагаемое решение: После выбора пункта меню, представляющего «разрешение изменения от NxM», замените или наложите текущее меню на новое подменю для выбора определенного разрешения из вертикального списка. Когда он закроется, вернитесь в предыдущее меню.
У меня есть небольшая идея. Вместо использования свойства «Текст» выпадающих элементов я мог бы вместо этого создать перечислитель масштаба разрешения по умолчанию (например, 1600x900) и установить его значение? И тогда, конечно, разрешите пользователю вводить собственное пользовательское разрешение, если это необходимо. – Matttheawesome1
@ Matttheawesome1, я отредактировал ответ, чтобы ответить на ваш вопрос. Если у вас есть дополнительные вопросы, не стесняйтесь комментировать. – PowerUser
А теперь я чувствую себя глупо, забыл, что перечисления не могут использовать строки. Почему это, если кто знает. Или может связать меня с другим вопросом. – Matttheawesome1