c++ /OF每次迭代改变属性的迭代对象

C++/OF iterating objects that change property each iteration?

本文关键字:迭代 改变 属性 对象 OF c++      更新时间:2023-10-16

我想做的是:创建一系列矩形,每帧生成一个挨着一个。每个矩形的高度是基于该时刻声音的频率,然后迭代器移动到下一个矩形,使最后一个矩形保持适当的高度。

发生了什么:屏幕变成了一个巨大的单一块,所有的空间都随着频率不断上下移动……我似乎不能让它一次迭代一个,而不是不断地改变它们。

我认为我的问题是:我不知道如何让每个迭代存储和保存自己的值,即使值是对象的一部分…

所讨论的代码:

float bldgHeighTemp;        
for (int i = 0; i <  1000 ; i+=30){   
    for (int f = 0; f < (int)(BUFFER_SIZE/2); f++){   
        bldg temp;   
        bldgs.push_back(temp);   
        bldgs[i].bldgPosX = i;   
        bldgs[i].bldgPosY = ofGetHeight()/2;   
        bldgs[i].bldgWidth = 30;   
        bldgs[i].bldgHeight = bldgHeighTemp;   
        bldgs[i].draw();   
        bldgHeighTemp = freq[f]*-6;    
    }
}

我如何正确地实现这个?

先设置bldgs[i].bldgHeight = bldgHeighTemp;,再设置bldgHeighTemp = freq[f]*-6;。也就是说,bldgHeighTemp是在设置之前使用的。

您的内部循环在每次迭代中向bldgs添加一个新项,但即使在推入一个新项之后,您仍使用相同的bldgs[i]。我不太确定我能弄清楚你到底想做什么。

我将这样重写:

float bldgHeighTemp;        
for (int i = 0; i <  1000 ; i+=30){   
    for (int f = 0; f < (int)(BUFFER_SIZE/2); f++){   
        bldg temp;
        temp.bldgPosX = i;   
        temp.bldgPosY = ofGetHeight()/2;   
        temp.bldgWidth = 30;   
        temp.bldgHeight = freq[f]*-6;   
        temp.draw();   
        bldgs.push_back(temp);   
    }
}

你的代码的问题是它添加的元素比它分配的属性要多,确保你理解它。

假设BUFFER_SIZE == 10,那么内部循环(for( int f =...)将运行5次,因此blgds.push_back()将被调用1000 * 5 = 5000次!但是您只分配给blds[i],其中i < 1000(这是由循环标题保证的)。所以,blgs[i]i >= 1000,实际上,你的大多数对象,都是未初始化的