我正在尝试做一个小游戏,在我的游戏中我有一些方块,当用户点击这些方块时,它们会突出显示。为了达到这个效果,我使用glutMouseFunc
和glutTimerFunc
。
当用户点击屏幕时,我选择像素并确定需要突出显示的正方形。一旦识别出正方形,我就调用glutTimerFunc
。用glutTimerFunc
注册的函数将颜色的每个分量的值增加0.01,直到它们达到我定义的一个最大值,然后这个值回到一个最小值。
glutTimerFunc
在60毫秒内执行,我得到了几乎平滑的发光效果。
我的问题是,如果我很快点击两个方块,效果从第一个方块开始,但没有结束,所以方块保持高亮显示,第二个方块完成整个效果。如果我像疯子一样点击每个方块,所有方块都会突出显示。
即使我点击了其他方块,我如何才能终止这种发光效果?
以下是的代码片段
void Memoria::shineEffect(GLint value) {
if(value == 1) {
for(GLint i = 0; i < 3; i++) {
if(colors[selectedSquare][i] > 0) {
colors[selectedSquare][i] += COLOR_INCREASE;
if(colors[selectedSquare][i] >= MAX) {
colors[selectedSquare][i] = MAX;
value = -1;
}
}
}
glutTimerFunc(FPS, timeWrapper, value);
}
else {
if(value == -1) {
for(GLint i = 0; i < 3; i++) {
if(colors[selectedSquare][i] > 0) {
colors[selectedSquare][i] -= COLOR_INCREASE;
if(colors[selectedSquare][i] <= MIN) {
value = 0;
colors[selectedSquare][i] = MIN;
}
}
}
glutTimerFunc(FPS, timeWrapper, value);
}
}
}
如果参数中传递的值为1或-1,则timeWrapper
调用shineEffect
。
您希望shineEffect
函数至少经过一个高亮循环,然后在高亮项目发生更改时停止。这更多的是一个UI代码设计问题,而不是OpenGL或GLUT问题。
您需要实现的机制非常简单:
- 用CCD_ 10安装一个CCD_
- 创建一个元素队列:每次单击元素时,将其添加到队列中
updateHighLights
功能执行的任务应如下所示:
- 如果队列包含一个元素,请像在程序中一样循环使用它的高亮显示
- 如果队列包含多于一个元素(对于队列中的每个元素),
- 步进高亮循环
- 如果循环结束,并且元素不是最后一个,则从队列中删除该元素
下面是另一个可能更灵活的解决问题的方法。
Glut事件循环机制的设计非常简单:只有一个钩子可以放置"空闲工作"代码,因此在那里安装一个调用其他函数列表的函数可能更灵活。然后可以使用set原语修改该列表,以安装或删除要在空闲时间执行的特定任务。这可能比GLUT的"单功能"方法灵活得多。
例如,您可以使用包含要高亮显示的元素的结构将当前高亮显示代码隔离在一个函数中,并在其元素通过高亮显示循环完成且不再处于活动状态时,让该函数将其自身从列表中删除。
既然您使用的是C++,那么将所有这些功能捆绑在类中应该很容易:
- 空闲任务列表的一个类
- 空闲任务的一个基类
- 一个派生的空闲任务类,用于突出显示正方形(带有用于正方形和活动状态的字段)
- 一个类来跟踪活动正方形,这样它就可以很容易地被新的活动正方形停用和替换。
glutMouseFunc
函数将访问此函数