【c++】將SDL埠移植到OpenGL和C++
阿新 • • 發佈:2021-01-28
我正在非常努力地實現本教程here,但是沒有使用SDL。即。僅使用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()的“空閒”函式,並使用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);
