0

我在这里非常努力地完成本教程,但没有使用 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){ ... }
4

2 回答 2

2

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

取而代之的是,创建一个调用 的“空闲”函数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);
于 2013-03-20T20:03:49.837 回答
1

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

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

于 2013-03-20T19:44:34.920 回答