【问题标题】:Port SDL example to OpenGL & C++将 SDL 示例移植到 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 用于关键输入。

标签: c++ opengl port sdl


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多