将 SDL 示例移植到 OpenGL 和 C++

Port SDL example to OpenGL & C++

本文关键字:OpenGL C++ SDL      更新时间:2023-10-16

我非常努力地在这里实现这个教程,但不使用SDL。ie。仅使用OpenGL绘制图形,使用普通c++检查碰撞。

下面是我的尝试,但仍然不能正常工作。我就是看不出我的逻辑和教程有什么不同?

帮助我了解我哪里出错了,或者帮助我将示例移植到OpenGL/c++。

void move(){
    sprite.x += x_Vel;
    if(check_collision(sprite,platform1) || check_collision(sprite,platform2))
    { 
        sprite.x -= x_Vel;
    }
    sprite.y += y_Vel;
    if(check_collision(sprite,platform1) || check_collision(sprite,platform2))
    {
        sprite.y -= y_Vel;
    }
}
void drawSprite (RECT rect) { ... }
void mySKeyboard(int key, int x, int y) { ... }
void main (int argc, char** argv){ ... }

仅在按下键时更新显示。

相反,创建一个调用glutPostRedisplay()的'idle'函数,并将其设置为glutIdleFunc()。这将使渲染连续。

我还建议使用双缓冲而不是单缓冲。

并注意,你的move()函数更新全局sprite,但渲染函数调用它有sprite传递值,所以将始终呈现以前的值。

如何应对碰撞取决于你自己。你可以把速度设为0如果你想让物体停止。如果你想要反弹,你可以否定它。或者你也可以不去管它,如果你想在精灵越过障碍时让它继续朝同一个方向前进。

所以可以做以下修改:

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    drawSprite(sprite);
    drawPlatform(platform1);
    drawPlatform(platform2);
    glutSwapBuffers();
//  glFlush();
}
void mySKeyboard(int key, int x, int y)
{
    switch(key){
    case GLUT_KEY_LEFT:
        x_Vel -= speed;
//      glutPostRedisplay();
        break;
etc...
void update()
{
    glutPostRedisplay();
}
void main (int argc, char** argv)
{
...
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);    // Set display mode.
    glutIdleFunc(update);

在你的移动函数中,你也必须重置你的速度,以防止碰撞发生时的运动:

void move(){
    sprite.x += x_Vel;
    if(check_collision(sprite,platform1) || check_collision(sprite,platform2))
    { 
        sprite.x -= x_Vel;
        x_Vel *= 0.9;//Decrease x_Vel
    }
    sprite.y += y_Vel;
    if(check_collision(sprite,platform1) || check_collision(sprite,platform2))
    {
        sprite.y -= y_Vel;
        y_Vel *= 0.9;//Decrease y_Vel
    }
}

你会注意到你不想把速度设置为0,只是减少它们以避免浮动框。