将 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++的主要内容,如果未能解决你的问题,请参考以下文章