将 glutTimerFunc 与 glutMouseFunc 一起使用
Posted
技术标签:
【中文标题】将 glutTimerFunc 与 glutMouseFunc 一起使用【英文标题】:Using glutTimerFunc with glutMouseFunc 【发布时间】:2012-12-17 18:40:34 【问题描述】:我正在尝试做一个小游戏,在我的游戏中我有一些方块,当用户点击这些方块时,它们会被突出显示。为了达到这个效果,我使用glutMouseFunc
和glutTimerFunc
。
当用户点击屏幕时,我选择像素并确定我需要突出显示的方块。一旦确定了正方形,我就会打电话给glutTimerFunc
。用glutTimerFunc
注册的函数将颜色的每个分量的值增加0.01,直到它们达到我定义的一个最大值,然后这个值又回到一个最小值。
glutTimerFunc
在 60 毫秒内执行,我得到了几乎平滑的发光效果。
我的问题是,如果我非常快速地点击两个方块,效果会从第一个方块开始,但不会结束,所以方块仍然突出显示,第二个方块完成整个效果。如果我像疯子一样点击每个方格,所有方格都会突出显示。
即使我点击其他方块,我怎样才能使这种发光效果终止?
这是一段sn-p代码
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);
timeWrapper
调用shineEffect
,如果传入参数的值为 1 或 -1。
【问题讨论】:
【参考方案1】:您希望shineEffect
函数至少经过一个高亮循环,然后在高亮显示的项目发生变化时停止。这更像是一个 UI 代码设计问题,而不是 OpenGL 或 GLUT 问题。
您需要实现的机制非常简单:
一次性安装updateHighlights
函数和 glutTimerFunc
:此函数将负责更新所有点击元素的高光,
创建元素队列:每次单击元素时,将其添加到队列中,
updateHighLights
函数执行的任务应该如下:
这里有另一种可能更灵活的方法来解决您的问题。
Glut 事件循环机制的设计非常简单:只有一个挂钩可以放置您的“空闲工作”代码,因此在其中安装一个调用其他函数列表的函数可能更灵活。然后可以使用一组原语修改该列表,以安装或删除要在空闲时间执行的特定任务。这可能比 GLUT 的“单一功能”方法灵活得多。
例如,您可以将当前突出显示代码隔离在一个函数中,其中包含要突出显示的元素的结构,并让该函数在其元素通过突出显示循环完成并且不再处于活动状态时将其从列表中删除。
由于您使用的是 C++,因此将所有这些功能捆绑在类中应该很容易:
空闲任务列表的一类 空闲任务的一个基类 一个派生的空闲任务类,用于突出显示正方形(带有用于正方形和活动状态的字段) 一个类来跟踪活动方块,以便它可以很容易地被停用并被新的活动方块替换。这个可以通过glutMouseFunc
函数访问。
【讨论】:
以上是关于将 glutTimerFunc 与 glutMouseFunc 一起使用的主要内容,如果未能解决你的问题,请参考以下文章