【问题标题】:My C++ OpenGL SDL program is not working as I expected我的 C++ OpenGL SDL 程序没有按预期工作
【发布时间】: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

【问题讨论】:

    标签: c++ opengl sdl


    【解决方案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 事情发生了......但如果这个答案解决了所有问题,请将其标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多