C++ 我的C++;OpenGL SDL程序没有像我预期的那样工作

C++ 我的C++;OpenGL SDL程序没有像我预期的那样工作,c++,opengl,sdl,C++,Opengl,Sdl,我刚刚开始学习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_everythi

我刚刚开始学习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;
}
试一试:

#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;
}
#包括
#包括
类PlayerPaddle
{
私人:
int-xloc;
内洛克;
内桨高度;
内桨宽度;
公众:
PlayerPaddle()
{
xloc=0;
yloc=0;
桨叶高度=50;
桨叶宽度=15;
}
无效显示()
{
glPushMatrix();
glTranslatef(xloc,yloc,0);
glBegin(GL_QUADS);
glColor4f(1.0,1.0,1.0,1.0);
glVertex2f(0,0);
glVertex2f(桨叶宽度,0);
glVertex2f(桨叶宽度、桨叶高度);
glVertex2f(0,桨叶高度);
格伦德();
glPopMatrix();
}
无效句柄输入(常量SDL事件和事件)
{
if(event.type==SDL\u KEYDOWN)
{
开关(event.key.keysym.sym)
{
案例SDLK_UP:yloc+=10;中断;
案例SDLK_DOWN:yloc-=10;中断;
}
}
if(yloc<0)
{
yloc=0;
}
如果(yloc>640)
{
yloc=640;
}
}
};
void init_GL()
{
glClearColor(0,0,0,0);
glViewport(0,060480);
glMatrixMode(GL_投影);
glLoadIdentity();
格洛托(0640,0480,-1,1);
glMatrixMode(GLU模型视图);
glLoadIdentity();
}
void init_everything()
{
SDL_Init(SDL_Init_EVERYTHING);
SDL_设置视频模式(640480 32,SDL_OPENGL);
init_GL();
SDL_WM_SetCaption(“迈克尔·克洛弗的乒乓球”,空);
}
int main(int argc,char*argv[])
{ 
初始化一切();
游戏者桨;
bool-quit=false;
while(quit==false)
{
SDL_事件;
while(SDL_事件和事件))
{
处理输入(事件);
if(event.type==SDL\u QUIT)
{
退出=真;
}
}
glClear(GLU颜色缓冲位);
划桨;
SDL_GL_SwapBuffers();
}
SDL_退出();
返回0;
}
最值得注意的是,您的构造函数已损坏。您正在声明和设置局部变量,而不是成员变量。这导致了未初始化的成员变量,远离了la la land(-8万左右,在我的机器上),而且(显然)离您的视口很远:)


我切换了
glOrtho()
调用以生成标准的笛卡尔坐标系,左下角为(0,0),右上角为(640480)。

非常感谢!。现在你要指出,我对我的构造函数犯了这样一个愚蠢的错误感到很愚蠢,但在查看代码时,我并没有意识到这一点:/@Michael,事情发生了。。。但如果这个答案解决了所有问题,请将其标记为已接受。
#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
#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;
}