1

我正在尝试做一个小游戏,在我的游戏中我有一些方块,当用户点击这些方块时,它们会被突出显示。为了达到这个效果,我使用glutMouseFuncwith 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);
        }
    }
}

timeWrappershineEffect如果传入参数的值为 1 或 -1,则调用。

4

1 回答 1

1

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

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

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

updateHighLights函数执行的任务应该如下:

  • 如果队列包含一个元素,请像您在程序中所做的那样继续循环其突出显示
  • 如果队列包含多个元素,对于队列中的每个元素,
    • 步高亮循环
    • 如果循环结束,并且该元素不是最后一个,则从队列中删除该元素

这是解决您的问题的另一种可能更灵活的方法。

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

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

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

  • 空闲任务列表的一类
  • 空闲任务的一个基类
  • 一个派生的空闲任务类,用于突出显示正方形(带有正方形和活动状态的字段)
  • 一个类来跟踪活动方块,以便它可以很容易地被停用并被新的活动方块替换。这个glutMouseFunc函数将被访问。
于 2012-12-17T19:29:50.193 回答