2011-07-25 262 views
0

我所试图做的事:创建一系列产生的每一帧彼此相邻的矩形。每个矩形的高度基于当时的声音频率,然后迭代器移动到下一个矩形,将最后一个保持在适当的高度。C++/OF迭代每次迭代更改属性的对象?

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

我觉得我的问题是:我不知道如何让每一次迭代来存储并保存自己的价值观,即使值是对象的一部分......

中的代码问题:

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;  
    } 
} 

如何正确地实现这一点?

回答

0

您可以设置bldgs[i].bldgHeight = bldgHeighTemp;然后设置bldgHeighTemp = freq[f]*-6;秒。换句话说,在设置之前使用bldgHeighTemp

您的内循环每次迭代都会在bldgs中添加一个新项目,但即使在推送新项目后也会使用相同的bldgs[i]。我不太确定我能确定你实际上想要做什么。

+0

好吧,第一部分是有意义的... 第二部分,我有一个对象bldg.h,bldg.cpp并称它为矢量矢量 bldgs; 这有道理吗? – bree

+0

我想为每个框架添加一个新的矩形。我做错了吗? – bree

+0

我是否把它推回错误的地方?我觉得我在这里错过了一些东西... – bree

0

我会重写它这样:

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,所以atually,你的大多数对象,剩下未初始化。

+0

这是有道理的,我想要做的是推回所有其他声明? – bree

+0

另外,任何想法如何让每个bldg [i]拥有自己的频率?我尝试制作一个频率矢量,但矩形完全消失。 谢谢! – bree

+0

@user,你这里的频率是什么意思? – unkulunkulu