2014-09-21 42 views
-1

我现在有几个函数在draw方法中被按键激活。基本上,有一个复杂的正方形网格,并且每个正方形的颜色都是基于用户按下的键('a'使其变为红色,'b'使其变成绿色等等),用分配给每个正方形的方法填充。在处理中重置KeyPressed()

但是,每次按下第一个按键时,都会根据该按键填充所有的方块(例如,如果用户按下的第一个按键为'a',则所有方块都将是红色而不是只是第一个)。我怎样才能使第一个按键适用于第一个方法,第二个按键适用于第二个方法,依此类推,即使它在循环draw()方法中。下面是低于过于简化的版本:

void draw(){ 
    BoxOne(); 
    BoxTwo(); 
} 
void boxOne(){ 
    if(keyPressed){ 
     if(key == 'a'){ 
     fill(red); 
     } 
     if(key == 'b'){ 
     fill(green); 
     } 
     rect(10, 10, 10, 10); 
    } 
} 
void boxTwo(){ 
    if(keyPressed){ 
     if(key == 'a'){ 
     fill(red); 
     } 
     if(key == 'b'){ 
     fill(green); 
     } 
     rect(20, 20, 10, 10); 
    } 
} 

我想,反正是有“重置”的keyPressed选项,以便它需要在另一个关键的下一次?

回答

1

我想你想要的功能keyPressed()不是布尔全局变量keyPressed。请参阅文档http://processing.org/reference/keyPressed_.html。你可以将键映射到一个特定的盒子 - 我在这里展示一个简单的非最优方式,其中键映射到一个索引,然后让你查找正确的矩形的参数,就像我展示的那样。这很简单,但不是一般或非常漂亮,但它的作品。

我建议避免像boxOne()和boxTwo()中的重复代码 - 它们只在盒子坐标上有所不同。如果用由盒号驱动的更通用的fillBox()替换它们。

如果您只希望一次显示一个框,请在调用fillBox()之前调用background()函数。

int box = -1; 
int boxParams[] = {10, 10, 10, 10 
       , 20, 20, 10, 10 
       , 30, 30, 10, 10}; 

void draw(){ 
    //background(128, 128, 128); 
    if(box >= 0) { 
     fillBox(box); 
    } 
} 

void keyPressed() { 
    if(key == 'a') 
     box = 0; 
    else if(key == 'b') 
     box = 1; 
    else if(key == 'c') 
     box = 2; 
    else 
     box = -1; 
} 

void fillBox(int box){ 
    if(key == 'a'){ 
    fill(255, 0, 0); 
    } 
    else if(key == 'b'){ 
    fill(0,255, 0); 
    } 
    else if(key == 'c'){ 
    fill(0,0, 255); 
    } 
    rect(boxParams[box * 4], boxParams[box * 4 + 1], boxParams[box * 4 + 2], boxParams[box * 4 + 3]); 
}