将 SDL 示例移植到 OpenGL 和 C++
Port SDL example to OpenGL & C++
我非常努力地在这里实现这个教程,但不使用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,只是减少它们以避免浮动框。
相关文章:
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 了解 GLM- openGL 中的相机转换
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- OpenGL大的3D纹理(>2GB)非常慢
- OpenGl glm rotate
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- OpenGL在启用深度测试时不会丢弃我的碎片
- OpenGL相机和相机空间转型的困惑
- OpenGL将纹理四边形渲染为(0,0)
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 发布旋转矩阵(openGL/glm)
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 无法使用VAO和EBO(openGL)绘制多个对象
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- OpenGL 16 位模板缓冲区?
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 在 openGL 中多次绑定缓冲区
- opengl glBegin(GL_LINES) 和 glBegin(GL_POINT) 在 2D 中不可视化点矢量