首页 文章

如何处理GlutPostRedisplay?

提问于
浏览
1

我正在制作一个游戏,其中我的玩家是一个精灵,当我按下右键或向上键(跳跃并运行)时我会在pressKeySpecial和releaseKeySpecial中写下“GlutPostRedisplay” . 之后,我做了一些动画,我已经制作了一个使用GlutPostRedisplay的计时器功能(glutTimerFunc) . 现在的问题是,当我按下右键时,我的播放器会继续更改其精灵图像以便在某个地方“运行” . 我知道它,因为我已经在计时器中设置了GlutPostRedisplay,所以它继续重新显示精灵,但如果我从计时器功能中删除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();
}

1 回答

  • 0

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

    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 
    }
    

相关问题