c++ - 如何处理 GlutPostRedisplay?

标签 c++ opengl animation sprite glut

我正在制作一个游戏,其中我的玩家是一个 Sprite ,它会随着我按下右键或向上键(跳跃和奔跑)而改变,因为我在 pressKeySpecial 和 releaseKeySpecial 中写了“GlutPostRedisplay”。之后我做了一些动画,为此我制作了一个定时器函数(glutTimerFunc),它也使用 GlutPostRedisplay。现在的问题是,当我按下右键时,我的播放器不断更改其 Sprite 图像以在某个地方“运行”。我知道它是因为我在计时器中设置了 GlutPostRedisplay,所以它会继续重新显示 Sprite ,但是如果我从计时器功能中删除 GlutPostRedisplay,则其余动画将停止并仅在按下键时才起作用。

我很困惑在哪里实际设置 GlutPostRedisplay 调用,以便我所有的动画和播放器都能正常工作?我也尝试过 glutIdleFunc,但结果保持不变。

void pressKeySpecial(int key,int x,int y)
{
    switch (key)
    {

       case GLUT_KEY_LEFT:

       break;

       case GLUT_KEY_RIGHT:

                m.changePosition(10.0,0);
                m.changeMode(Mario::RUN);
                break; 

        case GLUT_KEY_UP:

            if(m.pos_Y<12) 
            {
                m.changePosition(0,9);
                m.changeMode(Mario::JUMP);
            }
            break;

    }
    glutPostRedisplay();
}

// TIMER 
void Timer(int value)
{
    t +=205;
    t1 +=705;
    down -=5;
    angle +=5;
    SplashTimer +=1;
    glutTimerFunc(30, Timer, 1);
   //glutIdleFunc(Timer);
   glutPostRedisplay();
}

最佳答案

如果没有输入,您必须重置您的模式。你需要这样的东西:

void pressKeySpecial(int key,int x,int y)
{
    switch (key)
    {
        case GLUT_KEY_LEFT:
            break;

        ...

        default:
            m.changeMode(Mario::STOP); // <- I used STOP because I don't know your default
            break; 
    }
    glutPostRedisplay();
}

void releaseKeySpecial( int key, int x, int y )
{
    m.changeMode(Mario::STOP); // <- I used STOP because I don't know your default 
}

关于c++ - 如何处理 GlutPostRedisplay?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34564376/

相关文章:

css - 左 Angular 动画不起作用

ios - 关于在 Swift 中使 UIView 从屏幕上消失的问题

c++ - MySQL NDB API AccessViolationException

c++ - 识别 llvm 中的虚拟调用站点

opengl - 为什么上传到着色器时需要将四元数转换为 4x4 矩阵?

Python minecraft pyglet glClear() 跳帧

opengl - glBufferData 中的提示标志实际上有什么作用吗?

java - Android - 来自动画 View 的 getAlpha()

c++ - 如何使用c++从图像采集卡中获取数据

c++ - 任何人都可以想出一种方法来检查错误吗?