SDL图像仅偶尔显示

时间:2015-03-12 08:17:26

标签: c++ sdl sdl-2

以下代码用于显示SDL窗口左上角的骑手图片。使用此代码,图像偶尔会按预期显示,但大多数情况下,当我运行程序时,我只会得到一个黑色窗口。知道为什么吗?

#include "Game.h"
#include <iostream>

bool Game::init(const char* title, int xpos, int ypos, int width, int height, bool fullScreen)
{
    int flags = 0;
    if (fullScreen)
    {
        flags = SDL_WINDOW_FULLSCREEN;
    }
    //attempt to initialize SDL
    if (SDL_Init(SDL_INIT_EVERYTHING)==0) {
        std::cout << "SDL init success \n";
        //init the window
        m_pWindow = SDL_CreateWindow(title, xpos, ypos, width, height, flags);
        if (m_pWindow !=0) // window init successful
        {
            std::cout << "Window creation successful\n";
            m_pRenderer = SDL_CreateRenderer(m_pWindow, -1, 0);
            if(m_pRenderer !=0) // renderer init success
            {
                std::cout << "renderer creation successful\n";
                SDL_SetRenderDrawColor(m_pRenderer, 0, 0, 0, 255);
            }
            else
            {
                std::cout << "renderer init failed!\n";
                return false; // render init failed
            }
        }
        else
        {
            std::cout << "Window init failed!\n";
            return false; //window init failed
        }
    }
    else
    {
        std::cout << "SDL init failed!\n";
        return false; // SDL init failed
    }

    std::cout << "Init success\n";
    m_bRunning = true; // everything init-d successfully, main game loop running

    SDL_Surface* pTempSurface = SDL_LoadBMP("rider.bmp");
    if(!pTempSurface)
    {
        std::cout << "Error, tempsurface is null";
    }

    m_pTexture = SDL_CreateTextureFromSurface(m_pRenderer, pTempSurface);

    SDL_FreeSurface(pTempSurface);

    SDL_QueryTexture(m_pTexture, NULL, NULL, &m_sourceRectangle.w, &m_sourceRectangle.h);

    m_destinationRectangle.x = m_sourceRectangle.x = 0;
    m_destinationRectangle.x = m_sourceRectangle.x = 0;
    m_destinationRectangle.h = m_sourceRectangle.h;
    m_destinationRectangle.w = m_sourceRectangle.w;

   return true;
}

void Game::render()
{
    SDL_RenderClear(m_pRenderer); // clear the renderer to the draw color
    SDL_RenderCopy(m_pRenderer, m_pTexture, &m_sourceRectangle, &m_destinationRectangle);
    SDL_RenderPresent(m_pRenderer);
}

void Game::handleEvents()
{
    SDL_Event event;
    if (SDL_PollEvent(&event))
    {
        switch (event.type)
        {
            case SDL_QUIT:
                m_bRunning = false;
                break;

            default:
                break;
        }
    }
}

void Game::clean()
{
    std::cout << "cleaning app\n";
    SDL_DestroyWindow(m_pWindow);
    SDL_DestroyRenderer(m_pRenderer);
    SDL_Quit();
}

0 个答案:

没有答案