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

Posted

技术标签:

【中文标题】将 SDL 示例移植到 OpenGL 和 C++【英文标题】:Port SDL example to OpenGL & C++ 【发布时间】:2013-03-20 19:21:46 【问题描述】:

我非常努力地完成本教程here,但没有使用 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) ... 

【问题讨论】:

您能否更具体地说明问题,还是我们必须扫描整个代码? 我遇到的主要问题是小方块的移动并与矩形碰撞。我对速度和 x/y 位置感到困惑。如果发生碰撞,我不确定如何阻止精灵移动。 GLUT 不是 OpenGL。它是一个第三方库,可用于打开和管理 OpenGL 窗口。 确实如此。你是对的。我主要将 Glut 用于关键输入。 【参考方案1】:

您仅在按下某个键时更新显示。

取而代之的是,创建一个调用glutPostRedisplay() 的“空闲”函数,并将其设置为glutIdleFunc()。这将使渲染连续。

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

请注意,您的 move() 函数会更新全局 sprite,但调用它的渲染函数将 sprite 按值传递,因此将始终渲染以前的值。

如何应对碰撞由您决定。如果您只想让事情停止,您可以将速度设置为零。如果你想让事情反弹,你可以否定它。或者,如果您希望在精灵越过障碍物时继续朝着相同的方向前进,您可以不理会它。

所以也许做以下改变:

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);

【讨论】:

哦,我明白了。你能给我一个 glutIdleFunc() 的例子吗?我确实尝试将值设置为零,但没有奏效。当然,我可能实施错了。 我的整个实现一定是错误的,因为这些更改使我的精灵一按方向键就消失了……我感觉在 OpenGL/c++ 中做起来不像我那么容易第一个想法。 您可能需要检查精灵没有飞离屏幕一侧... 我认为这实际上超出了我现在的能力。我认为它正在飞出屏幕。我只是感到困惑,当逻辑相同时,使用 SDL 的实现会有多大差异。不过感谢您的帮助。感谢您的宝贵时间。 我刚刚重新编写了我的程序,您的void update 等非常方便。效果很好。现在我只需要完善碰撞。再次感谢。【参考方案2】:

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

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,只需将它们递减以避免浮动框。

【讨论】:

以上是关于将 SDL 示例移植到 OpenGL 和 C++的主要内容,如果未能解决你的问题,请参考以下文章

C++ - SDL/OpenGL 加载图像的颜色被反转

神秘的 OpenGL/SDL 内存增长

SDL+OpenGL 程序没有出现在 linux 上

将项目移植到我的笔记本电脑会导致空白屏幕

C++ OpenGL SDL 屏幕问题

OpenGL C++ SDL 2D 阴影