使用glutTimerFunc和glutMouseFunc

时间:2012-12-17 18:40:35

标签: c++ opengl graphics glut freeglut

我正在尝试做一个小游戏,在我的游戏中我有一些正方形,当用户点击这些正方形时,它们会突出显示。要实现此效果,我将glutMouseFuncglutTimerFunc一起使用。

当用户点击屏幕时,我选择像素并识别我需要突出显示的方块。一旦确定了方格,我就打电话给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

1 个答案:

答案 0 :(得分:1)

您希望shineEffect函数至少经过一个高亮循环,然后在突出显示的项目发生更改时停止。它更像是UI代码设计问题,而不是OpenGL或GLUT问题。

您需要实施的机制非常简单:

  • 为所有updateHighlights函数安装一次glutTimerFunc:此函数将负责更新所有点击元素的高亮显示,
  • 创建一个元素队列:每次单击一个元素时,将其添加到队列中

updateHighLights功能执行的任务应如下:

  • 如果队列包含一个元素,请像在程序中一样继续循环显示
  • 如果队列包含多个元素,则对于队列中的每个元素,
    • 执行突出显示周期
    • 如果循环结束,并且元素不是最后一个,则从队列中删除元素

这是对你的问题的另一种可能更灵活的看法。

Glut事件循环机制是非常简单的设计:只有一个钩子来放置你的“空闲工作”代码,所以在那里安装一个调用其他函数列表的函数可能更灵活。然后可以使用set原语修改该列表,以安装或删除在空闲时执行的特定任务。这可能比GLUT的“单一功能”方法更灵活。

例如,您可以将一个函数中的当前高亮代码与包含要突出显示的元素的结构隔离开来,并且当其元素通过高亮循环完成并且不再处于活动状态时,将该函数从列表中删除。

由于您使用的是C ++,因此在类中捆绑所有这些功能应该很容易:

  • 一个用于空闲任务列表的类
  • 一个用于空闲任务的基类
  • 一个派生的空闲任务类,用于突出显示正方形(包含正方形和活动状态的字段)
  • 用于跟踪活动方块的一个类,以便可以轻松地停用它并替换为新的活动方块。这个将由glutMouseFunc函数访问。