Концептуальное: увеличение внутри цикла while - PullRequest
1 голос
/ 29 ноября 2011

Сценарий

Я работаю над классом HUD, чтобы помочь мне в разработке проекта OpenGL. Я хочу иметь возможность добавлять новые элементы на экран динамически (позиционирование произойдет автоматически) с использованием метода add_element(char*, float). Вот этот код:

class HUD {
public:
    HUD();
    ~HUD();
private:
    int elements,
        spacing;
public:
    void add_element(char*, float);
};

HUD::HUD() : elements(0), spacing(10) {}
HUD::~HUD() {}

void HUD::add_element(char* string, float value) {

    ++elements;
    // .. render to screen .. //
}

Основная идея такова: он будет располагать их вертикально для меня, пока я продолжаю добавлять элементы.

Проблема

Класс создается внутри основной функции, а элементы добавляются и выводятся на экран внутри и в конце моего игрового цикла. Это означает, что в каждом кадре счетчик element увеличивается, когда он должен увеличиваться только при первом добавлении уникального элемента. Я думал о добавлении уникальных идентификаторов в качестве аргумента, таких как нумерация их вручную каждый раз, когда я вызываю метод, но это, кажется, противоречит цели, к которой я иду

Я просто ищу некоторые идеи, которые могут решить этот тип приращения внутри цикла. У меня есть несколько сценариев, в которых мне нужно это сделать, и HUD - первый, с которым я столкнулся.

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

Я сделал аналогичную вещь, работая над игрой XNA (поэтому C #).У моего класса был список вещей, которые должны быть написаны на экране:

struct to_write {
    string text;
    Vector2 position;    // X and Y coords relative to the screen
}

private List<to_write> _logs;

Я сделал функцию «записи», которая добавляет новый элемент to_write в список _logs

void Write(string txt, Vector2 pos)
{
    _logs.AddLast(new to_Write() { text = txt, position = pos });
}

, нофактический вывод на экран происходил только во время функции рисования:

foreach(to_write w in _logs)
    // write w.text at coordinates w.position.x and w.position.y

_logs.Clear();

Последними были вызваны методы этого класса () и Draw (), позволяющие каждому другому компоненту добавлять свою собственную информацию в HUD.Вы можете упростить задачу, используя простой массив и сохраняя указатель массива. Таким образом, добавление элемента для записи и очистка списка - это O (1).

2 голосов
/ 29 ноября 2011

Позже эти «элементы», о которых вы пишете, будут экземпляром класса (это просто хороший способ сделать это), скажем: Element.Затем вы можете добавить закрытый член для класса HUD как std::set<Element>elements, ведь это контейнер, который не может иметь один и тот же объект дважды.Таким образом, в вашем методе add_element вы добавляете elements.insert( element ) с помощью метода elements.size(), вы получите уникальное количество элементов в нем.

Кстати, это не эффективно (при попытке вставить элементы в каждый кадр), ноВы получите картину. См. C ++ документ о std :: set

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...