概念:在while循环内递增

时间:2011-11-29 14:33:56

标签: c++ while-loop auto-increment

方案

我正在开发一个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 .. //
}

基本思想是:当我继续添加元素时,它会垂直定位它们。

问题

该类在main函数内实例化,并且在我的游戏循环内和结束时添加元素并将其绘制到屏幕上。这意味着,每个帧,element计数器都会递增,而它应该仅在第一次添加唯一元素时递增。我曾考虑过添加唯一标识符作为参数,比如每次调用方法时都会手动编号,但这似乎打败了我想要的目的。

我只是在寻找可以解决循环内这种递增问题的一些想法。我有几个场景我需要这样做,而HUD是我遇到的第一个。

2 个答案:

答案 0 :(得分:2)

后来你写的这些“元素”将是一个类的实例(这只是一个很好的方法),让我们说:元素。然后你可以为HUD类添加一个私有成员std::set<Element>elements,巫婆是一个容器,它不能有两次相同的对象。因此,在add_element方法中,使用方法elements.insert( element )添加elements.size(),您将获得其中的唯一元素计数。

顺便说一句,这不是很有效(试图在每一帧中插入元素)但你得到了图片。 See c++ doc about std::set

答案 1 :(得分:2)

我在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();

这个类的Update()和Draw()方法是最后一个被调用的方法,允许每个其他组件将自己的信息添加到HUD。您可以通过使用简单数组并保留数组指针来简化操作,这样添加要写入和清除列表的元素都是O(1)。