Как мне создать игровые меню, которые я хочу разместить внутри контейнера? - PullRequest
1 голос
/ 29 февраля 2012

Мне нужно написать игру XNA для проекта в моей программе колледжа.Я делаю пошаговую RPG в духе игр Gameboy Pokemon.Я хотел бы выровнять пункты меню с контейнером внизу экрана, не более чем с 4 опциями.Это должно дать вам общее представление о том, как я хочу, чтобы экран боя выглядел:

Pokemon Battle Image

В настоящее время у меня есть система меню, которая выравнивает все пункты меню по центру экрана.Это означает, что меню выглядят так:

Начать игруОпцииВыйти

, но в центре экрана.

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

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

Если вы не хотите жестко кодировать позиции, это может быть довольно сложно, в зависимости от того, насколько вы хотите гибкости.

Я бы создал контейнерный класс, который является частью древовидной структуры (см. граф сцены ), с родительским контейнером и списком дочерних контейнеров. Это наиболее распространенный способ обработки относительного позиционирования. Вот краткий пример:

public class Container
{
    public Container Parent { get; set; }

    public List<Container> Children { get; set; }

    public Vector2 RelativePosition { get; set; }

    public Vector2 AbsolutePosition
    {
        get
        {
            // The container is the root node
            if (Parent == null)

                return RelativePosition;

            else

                return RelativePosition + Parent.AbsolutePosition;
        }
    }
}

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

0 голосов
/ 01 марта 2012

Как заявил Люциус, создание класса Container является лучшим решением.В настоящее время я разрабатываю UI-приложение для XBox.

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

Я создал класс Container, который содержит примерно следующие атрибуты:

 VectorTopLeft (Which the element which contains a Container object uses for drawing)
 VectorTopRight
 VectorBottomLeft
 VectorBottomRight

 Align (Enum: Right, Center, Left)
 VerticalAlign (Enum: Top, Middle, Bottom)
 NewRow (bool)
 PreviousContainer (Container)
 ParentContainer (Container)
 Width (Getter)
 Height (Getter)
 PercentageHeight (getter/setter) (Percentage of the height of the parent container)
 PercentageWidth (getter/setter) (Percentage of the width of the parent container)
 PixelHeight (getter/setter) (Absolute height in pixels)
 PixelWidth (getter/setter) (Absolute width in pixels)
 AspectRatio: Used for setting the width to a ratio of the height, usefull for different screen aspects (4/3 or 16/9 for example)

  MarginLeft
  MarginRight
  MarginTop
  MarginBottom

Следующие векторы содержат поля, это векторы, используемые процедурой выравнивания.

 AbsoluteVectorTopLeft
 AbsoluteVectorTopRight
 AbsoluteVectorBottomLeft
 AbsoluteVectorBottomRight

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

  AbsoluteWidth (getter)
  AbsoluteHeight (getter)

А затем некоторые флаги, которые устанавливаются в true, если что-то решающее меняется, и необходимо пересчитать вектор / размер.

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

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

Система может иметь некоторые незначительные недостатки, но в данный момент она работает как шарм для всего моего позиционирования, связанного с GUI, и работает чертовски быстро!

...