将glutTimerFunc与glutMouseFunc一起使用
Using glutTimerFunc with glutMouseFunc
我正在尝试做一个小游戏,在我的游戏中我有一些方块,当用户点击这些方块时,它们会突出显示。为了达到这个效果,我使用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
函数将访问此函数
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 将 std::allocate_shared 与多态资源分配器一起使用
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 将 exprtk 与自定义类的对象一起使用
- 将 std::set 与基于键的比较器一起使用
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 如何将AERT_Allocate与 std:vector 一起使用
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 将glutTimerFunc与glutMouseFunc一起使用