C++ 将GLUTIMERFUNC与glutMouseFunc一起使用
我正在尝试做一个小游戏,在我的游戏中,我有一些方块,当用户点击这些方块时,它们会高亮显示。为了达到这个效果,我将C++ 将GLUTIMERFUNC与glutMouseFunc一起使用,c++,opengl,graphics,glut,freeglut,C++,Opengl,Graphics,Glut,Freeglut,我正在尝试做一个小游戏,在我的游戏中,我有一些方块,当用户点击这些方块时,它们会高亮显示。为了达到这个效果,我将glutMouseFunc与glutTimerFunc一起使用 当用户单击屏幕时,我选择像素并确定需要高亮显示的正方形。一旦确定了正方形,我就调用glutTimerFunc。使用glutTimerFunc注册的函数将每个颜色分量的值增加0.01,直到它们达到我定义的最大值,然后该值返回到最小值 glutTimerFunc在60毫秒内执行,我获得了几乎平滑的光泽效果 我的问题是,如果我非
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);
}
}
}
void Memoria::shineEffect(闪烁值){
如果(值==1){
对于(闪烁i=0;i<3;i++){
如果(颜色[selectedSquare][i]>0){
颜色[selectedSquare][i]+=颜色增加;
如果(颜色[selectedSquare][i]>=MAX){
颜色[selectedSquare][i]=最大值;
值=-1;
}
}
}
glutTimerFunc(FPS、时间包装器、值);
}
否则{
如果(值==-1){
对于(闪烁i=0;i<3;i++){
如果(颜色[selectedSquare][i]>0){
颜色[selectedSquare][i]=颜色增加;
如果(colors[selectedSquare][i]您希望shineEffect
函数至少经过一个高亮显示循环,然后在高亮显示的项目发生更改时停止。这更多的是UI代码设计问题,而不是OpenGL或GLUT问题
您需要实现的机制非常简单:
- 使用
glutTimerFunc
一次性安装一个updateHighlights
函数:此函数将负责更新所有单击元素的突出显示
- 创建元素队列:每次单击元素时,将其添加到队列中
updateHighLights
功能执行的任务应如下所示:
- 如果队列包含一个元素,请像在程序中一样循环突出显示
- 如果队列包含多个元素,则对于队列中的每个元素,
- 逐步完成突出显示循环
- 如果循环结束,并且元素不是最后一个,请从队列中删除该元素
这里有另一个可能更灵活的方法来解决你的问题
Glut事件循环机制的设计非常简单:只有一个钩子可以放你的“空闲工作”代码,因此在那里安装一个调用其他函数列表的函数可能更灵活。然后可以使用set原语修改该列表,以安装或删除空闲时间内要执行的特定任务。这可能比GLUT的“一个函数”方法灵活得多
例如,您可以使用包含要高亮显示的元素的结构将当前高亮显示代码隔离在一个函数中,并在其元素完成高亮显示循环且不再处于活动状态时,让该函数从列表中删除自己
既然使用C++,在类中很容易将所有这些功能捆绑在一起:
- 一个类用于空闲任务列表
- 一个基类用于空闲任务
- 一个派生的空闲任务类,用于突出显示方块(带有方块和活动状态字段)
- 一个用于跟踪活动方块的类,以便可以轻松地将其停用并替换为新的活动方块。此类可通过
glutMouseFunc
函数访问
您希望shineEffect
函数至少经过一个突出显示循环,然后在突出显示的项目发生更改时停止。这更多是一个UI代码设计问题,而不是OpenGL或GLUT问题
您需要实现的机制非常简单:
- 使用
glutTimerFunc
一次性安装一个updateHighlights
函数:此函数将负责更新所有单击元素的突出显示
- 创建元素队列:每次单击元素时,将其添加到队列中
updateHighLights
功能执行的任务应如下所示:
- 如果队列包含一个元素,请像在程序中一样循环突出显示
- 如果队列包含多个元素,则对于队列中的每个元素,
- 逐步完成突出显示循环
- 如果循环结束,并且元素不是最后一个,请从队列中删除该元素
这里有另一个可能更灵活的方法来解决你的问题
Glut事件循环机制的设计非常简单:只有一个钩子可以放你的“空闲工作”代码,因此在那里安装一个调用其他函数列表的函数可能更灵活。然后可以使用set原语修改该列表,以安装或删除空闲时间内要执行的特定任务。这可能比GLUT的“一个函数”方法灵活得多
例如,您可以使用包含要高亮显示的元素的结构将当前高亮显示代码隔离在一个函数中,并在其元素完成高亮显示循环且不再处于活动状态时,让该函数从列表中删除自己
既然使用C++,在类中很容易将所有这些功能捆绑在一起:
- 一类