我的 C++ OpenGL SDL 程序没有按预期工作
Posted
技术标签:
【中文标题】我的 C++ OpenGL SDL 程序没有按预期工作【英文标题】:My C++ OpenGL SDL program is not working as I expected 【发布时间】:2011-09-29 21:16:09 【问题描述】:我刚刚开始学习 OpenGL,并且正在尝试制作乒乓球游戏。 我无法让桨叶出现在屏幕上,我无法理解原因:我认为使用这段代码,它应该出现在左上角,并在按下向上和向下键时移动。
main.cpp -
#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>
#include "classes.h"
#include "functions.h"
int main (int argc, char *argv[])
init_everything();
PlayerPaddle paddle;
bool quit = false;
while( quit == false )
while( SDL_PollEvent( &event ) )
paddle.handle_input();
if( event.type == SDL_QUIT )
quit = true;
glClear( GL_COLOR_BUFFER_BIT );
paddle.show();
SDL_GL_SwapBuffers();
SDL_Quit();
return 0;
classes.h -
#ifndef CLASSES_H
#define CLASSES_H
SDL_Event event;
// ******************* Beginning of PlayerPaddle class *******************
class PlayerPaddle
private:
int xloc;
int yloc;
int paddle_height;
int paddle_width;
public:
PlayerPaddle();
void show();
void handle_input();
;
PlayerPaddle::PlayerPaddle()
int xloc = 0;
int yloc = 0;
int paddle_height = 50;
int paddle_width = 15;
void PlayerPaddle::show()
glBegin( GL_QUADS );
glColor4f( 1.0, 1.0, 1.0, 1.0 );
glVertex3f( 0, yloc, 0 );
glVertex3f( paddle_width, yloc, 0 );
glVertex3f( paddle_width, paddle_height, 0 );
glVertex3f( 0, paddle_height, 0 );
glEnd();
glLoadIdentity();
void PlayerPaddle::handle_input()
if( event.type == SDL_KEYDOWN )
switch( event.key.keysym.sym )
case SDLK_UP:
yloc -= 10;
paddle_height -= 10;
break;
case SDLK_DOWN:
yloc += 10;
paddle_height += 10;
break;
if (yloc < 0)
yloc += 10;
paddle_height += 10;
if (yloc > 640)
yloc -= 10;
paddle_height -= 10;
// ******************* End of the PlayerPaddle class *******************
#endif
functions.h -
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
void init_GL()
glClearColor( 0, 0, 0, 0 );
glViewport(0, 0, 640, 480);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( 0, 640, 480, 0, 1, -1 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
void init_everything()
SDL_Init( SDL_INIT_EVERYTHING );
SDL_SetVideoMode( 640, 480, 32, SDL_OPENGL );
init_GL();
SDL_WM_SetCaption( "Pong by Michael Clover", NULL );
#endif
【问题讨论】:
【参考方案1】:试一试:
#include <SDL.h>
#include <SDL_opengl.h>
class PlayerPaddle
private:
int xloc;
int yloc;
int paddle_height;
int paddle_width;
public:
PlayerPaddle()
xloc = 0;
yloc = 0;
paddle_height = 50;
paddle_width = 15;
void show()
glPushMatrix();
glTranslatef( xloc, yloc, 0 );
glBegin( GL_QUADS );
glColor4f( 1.0, 1.0, 1.0, 1.0 );
glVertex2f( 0, 0 );
glVertex2f( paddle_width, 0 );
glVertex2f( paddle_width, paddle_height );
glVertex2f( 0, paddle_height );
glEnd();
glPopMatrix();
void handle_input( const SDL_Event& event )
if( event.type == SDL_KEYDOWN )
switch( event.key.keysym.sym )
case SDLK_UP: yloc += 10; break;
case SDLK_DOWN: yloc -= 10; break;
if (yloc < 0)
yloc = 0;
if (yloc > 640)
yloc = 640;
;
void init_GL()
glClearColor( 0, 0, 0, 0 );
glViewport(0, 0, 640, 480);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( 0, 640, 0, 480, -1, 1 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
void init_everything()
SDL_Init( SDL_INIT_EVERYTHING );
SDL_SetVideoMode( 640, 480, 32, SDL_OPENGL );
init_GL();
SDL_WM_SetCaption( "Pong by Michael Clover", NULL );
int main (int argc, char *argv[])
init_everything();
PlayerPaddle paddle;
bool quit = false;
while( quit == false )
SDL_Event event;
while( SDL_PollEvent( &event ) )
paddle.handle_input( event );
if( event.type == SDL_QUIT )
quit = true;
glClear( GL_COLOR_BUFFER_BIT );
paddle.show();
SDL_GL_SwapBuffers();
SDL_Quit();
return 0;
最值得注意的是你的构造函数很糟糕。您正在声明和设置局部变量而不是您的成员变量。这导致未初始化的成员变量,在 la-la 土地(我的机器上 -8 万左右)和(显然)离你的视口不远:)
我切换了 glOrtho()
调用以生成标准笛卡尔坐标系,左下角为 (0,0),右上角为 (640,480)。
【讨论】:
非常感谢!现在你指出我对构造函数犯了这样一个愚蠢的错误感到很愚蠢,但我在查看代码时并没有发现:/ @Michael 事情发生了......但如果这个答案解决了所有问题,请将其标记为已接受。以上是关于我的 C++ OpenGL SDL 程序没有按预期工作的主要内容,如果未能解决你的问题,请参考以下文章