2017-02-21 3 views
1

Я работаю над игрой и разрабатываю Главное меню, там у меня есть сценарий настроек. Эта сцена содержит несколько вкладок и для вкладки видео, я хотел бы выпадающее меню, которое позволяет переключать разрешения. Теперь, в последней части я понимаю логику, но, используя инфраструктуру XNA, я не понимаю логики выпадающего меню. Спасибо за любую помощь :)Выпадающее меню в моногаме/XNA

ответ

2

Я на самом деле сделал DropDown для моей игры, это на самом деле не так сложно, когда вы думаете об этом. Сначала вам понадобится класс DropDownContainer и DropDownElement. DropDownContainer - это верхняя часть DropDown, где вы видите выбранную в данный момент опцию. DropDownElement s - выбираемые параметры, которые вы показываете, когда пользователь нажимает DropDownContainer.

Вот как работает код:

  1. Создать массив DropDownElement с в вашем DropDownContainer классе.
  2. В конструкторе DropDownContainer передайте число DropDownElement s и массив строк, где каждая строка является текстом определенного DropDownElement.
  3. Создайте конструктор DropDownElement, возьмите строку и в ней введите Draw(spriteBatch) метод, нарисуйте эту строку над текстурой DropDownElement.
  4. Пройдите в качестве позиции для контейнера, и он будет использоваться в качестве основы для позиционирования элементов. Пример цикла в конструкторе 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 
    } 
    
  5. Убедитесь, что вы передаете в ContentManager content в конструкторах обоих классов, так что вы можете загрузить свои активы.
  6. Есть ограничивающего Rectangle для обоих этих классов, где это X и Y являются (int)containerPosition.X, (int)containerPosition.Y и Width и Height являются размеры Texture2D.
  7. В DropDownContainer «Update(gameTime) метода s, есть чек, если курсор находится в пределах bounds и если пользователь щелкает изменить флаг, как это: clicked = !clicked;
  8. В DropDownContainer» Draw(spriteBatch) метода s, проверить if (clicked) и сделать elements массив, пересекая его.
  9. Проигрывать DropDown следующим образом: private DropDownContainer dropDown = new DropDownContainer(...); и называть его соответствующими методами.
  10. Чтобы проверить, какая опция была выбрана, просто введите Text свойство DropDownElement s.
  11. Когда вы закончите с этим, вы можете добавить такие вещи, как эффекты наведения мыши и затухание цвета текста в/из, используя линейную интерполяцию.

Я также создал TextBox для своей игры XNA, но это касается некоторых тяжелых P/Invokes, и поскольку вы не знаете, как сделать базовый Drop Down, это было бы слишком сложно объяснить.

Edit обратиться комментарий ниже:

Есть несколько проблем с вашей логикой, я выделю их:

  1. без string собственности, который получает/устанавливает текст из элементы, как бы вы проверили, какой элемент был выбран? Например. if (container.Text == "text of first element") { /* user chose the lowest resolution */ }
  2. Если вы не передадите текст конструктору, нет способа установить текст Element, если нет Text.
  3. Как вы бы добавили стоимость 1600x900 прямо на номер enum? Если я не понимаю вас, нет никакого способа, которым вы могли бы поставить string (1600x900 это строка) в enum ...

Даже если вы должны были сделать что-то вроде этого:

enum resOptions 
{ 
    _800x600 = 0, 
    _1280x1024 = 1, 
    _1920x1080 = 2, 
    // etc. 
} 

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

Таким образом, я бы настоятельно советовал использовать здесь enum, потому что он только слишком усложнял уже достаточно сложный алгоритм DropDown. Вам потребуется гораздо больше времени, чтобы написать способ проверить, какой вариант был выбран.

Я бы просто установить Container «s Text к щелкнули Element» ы Text по клику пользователя, и это, как я хотел бы проверить выбранный вариант. Если вы все еще хотите сделать это с помощью enum, я боюсь, что я не буду очень помогать, потому что я уже дал вам понять, как сделать это простым способом. Если вы хотите сделать это по-другому, вам придется написать код для этого самостоятельно. В конце концов, идея этого сайта не «Напишите мой код для меня», а скорее «Дайте мне хорошую идею, как правильно ее написать себя».

Чрезмерное усложнение ситуации, когда вы можете просто сделать это как с меньшими усилиями, так и с меньшим количеством кода - это плохая практика программирования. Только если вы планируете расширить функциональность DropDown, это делает ее сложной. Но в вашем случае я честно не вижу смысла устанавливать Text вот так. Почему бы вам отказаться от простого, но эффективного решения и преследовать то, о чем вы не уверены?

Если у вас есть дополнительные вопросы, не стесняйтесь комментировать.

+0

У меня есть небольшая идея. Вместо использования свойства «Текст» выпадающих элементов я мог бы вместо этого создать перечислитель масштаба разрешения по умолчанию (например, 1600x900) и установить его значение? И тогда, конечно, разрешите пользователю вводить собственное пользовательское разрешение, если это необходимо. – Matttheawesome1

+0

@ Matttheawesome1, я отредактировал ответ, чтобы ответить на ваш вопрос. Если у вас есть дополнительные вопросы, не стесняйтесь комментировать. – PowerUser

+0

А теперь я чувствую себя глупо, забыл, что перечисления не могут использовать строки. Почему это, если кто знает. Или может связать меня с другим вопросом. – Matttheawesome1

1

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

Хорошая библиотека UI: Empty Keys

+0

Благодарим вас за то, что вы показали мне это, однако, поскольку я в классе, к сожалению, я не могу загрузить сторонние библиотеки на этот компьютер без администратора. – Matttheawesome1

0

Я бы не сделал это как выпадающее меню.

Это очень простой элемент ui для мыши/клавиатуры. Подумайте, как пользователь будет взаимодействовать с этим при игре с контроллером.

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

Предлагаемое решение: После выбора пункта меню, представляющего «разрешение изменения от NxM», замените или наложите текущее меню на новое подменю для выбора определенного разрешения из вертикального списка. Когда он закроется, вернитесь в предыдущее меню.

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