我正在尝试做一个小游戏,在我的游戏中我有一些正方形,当用户点击这些正方形时,它们会突出显示。要实现此效果,我将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
。
答案 0 :(得分:1)
您希望shineEffect
函数至少经过一个高亮循环,然后在突出显示的项目发生更改时停止。它更像是UI代码设计问题,而不是OpenGL或GLUT问题。
您需要实施的机制非常简单:
updateHighlights
函数安装一次glutTimerFunc
:此函数将负责更新所有点击元素的高亮显示, updateHighLights
功能执行的任务应如下:
这是对你的问题的另一种可能更灵活的看法。
Glut事件循环机制是非常简单的设计:只有一个钩子来放置你的“空闲工作”代码,所以在那里安装一个调用其他函数列表的函数可能更灵活。然后可以使用set原语修改该列表,以安装或删除在空闲时执行的特定任务。这可能比GLUT的“单一功能”方法更灵活。
例如,您可以将一个函数中的当前高亮代码与包含要突出显示的元素的结构隔离开来,并且当其元素通过高亮循环完成并且不再处于活动状态时,将该函数从列表中删除。
由于您使用的是C ++,因此在类中捆绑所有这些功能应该很容易:
glutMouseFunc
函数访问。