2016-12-28 73 views
0

我正在使用SDL2来学习如何制作简单的2D平台。 我开始阅读SDL游戏开发和Lazy Foo的教程,并且我可以打开一个窗口并在窗口上绘制表面,并在窗口上绘制表面(如在传统SDL中完成的那样),但是如果尝试使用Renderer函数进行硬件加速时也不会显示任何东西! 我在Windows 10上运行,当我启动应用程序时,它只显示空的窗口。我试图打印一些调试行,它似乎打开位图,创建纹理,但是当我打印矩形的尺寸时,我用QueryTexture得到它返回0和0!SDL2 SLD_RenderCopy不显示任何东西

//Game.cpp: 
#include <SDL.h> 
#include <SDL_image.h> 
#include "Game.h" 
#include <iostream> 

bool Game::init(const char *title,int x,int y,int width,int height,int flags) 
{ 
    if (SDL_Init(SDL_INIT_VIDEO) < 0) 
     return false; 
    m_pWindow = SDL_CreateWindow(title,x,y,width,height,flags); 
    if (m_pWindow == NULL) 
     return false; 
    m_pRenderer = SDL_CreateRenderer(m_pWindow,-1,0); 
    if (m_pRenderer == NULL) 
     return false; 
    SDL_SetRenderDrawColor(m_pRenderer,0,0,0,255); 
    return true; 
} 

void Game::handle_events() 
{ 
    SDL_Event event; 
    while (SDL_PollEvent(&event) != 0) 
    { 
     switch (event.type) 
     { 
      case SDL_QUIT: 
       m_bRunning = false; 
       break; 
      default: 
       break; 
     } 
    } 
} 

void Game::render() 
{ 
    SDL_RenderClear(m_pRenderer); 
    SDL_RenderCopy(m_pRenderer,m_pTexture,&m_sourceRectangle,&m_destinationRectangle); 
    SDL_RenderPresent(m_pRenderer); 
} 

void Game::clean() 
{ 
    SDL_DestroyWindow(m_pWindow); 
    SDL_DestroyRenderer(m_pRenderer); 
    SDL_Quit(); 
} 

bool Game::loadImage() 
{ 
    SDL_Surface *surface = SDL_LoadBMP("logo.bmp"); 
    if (surface == NULL) 
     return false; 
    SDL_Texture *texture = SDL_CreateTextureFromSurface(m_pRenderer,surface); 
    if (texture == NULL) 
     return false; 
    SDL_FreeSurface(surface); 
    SDL_QueryTexture(m_pTexture,NULL,NULL,&m_sourceRectangle.w,&m_sourceRectangle.h); 
    m_destinationRectangle.x = m_sourceRectangle.x = 0; 
    m_destinationRectangle.y = m_sourceRectangle.y = 0; 
    m_destinationRectangle.w = m_sourceRectangle.w; 
    m_destinationRectangle.h = m_sourceRectangle.h; 
    return true; 
} 



// main.cpp: 
#include <SDL.h> 
#include "Game.h" 
#include <iostream> 
#include <Windows.h> 

Game *g_game = NULL; 

int main(int argc,char **argv) 
{ 
    AllocConsole(); 
    freopen("CON","w", stdout); 

    g_game = new Game(); 
    if (g_game->init("my 2D platform game!",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,800,600,SDL_WINDOW_SHOWN) != true) 
     return 1; 
    if (g_game->loadImage() != true) 
     return 2; 
    g_game->render(); 

    while (g_game->running()) 
    { 
     g_game->handle_events(); 
     g_game->update(); 
    } 

    g_game->clean(); 

    return 0; 
} 

回答

2

的问题是,你不 的Game::loadImage()功能正确分配质感。在线路

SDL_Texture *texture = SDL_CreateTextureFromSurface(m_pRenderer,surface); 

所创建的质感被分配到一个局部指针变量,它在函数的前端移到 超出范围。相反,你需要assing 质感的类变量:

m_pTexture = SDL_CreateTextureFromSurface(m_pRenderer,surface); 

作为一个说明,你是不是要 充分利用的C++功能,管理资源。我建议您在 上投入一些时间来了解推荐做法,例如从 C++ Core Guidelines

+0

哦对!那真是愚蠢......我来自嵌入式C编程,前一段时间我学习了一些OOP,现在我正在学习C++和所有类类型的东西。但是,这是一个可怕的错误:D – Luca

+0

我不赞同:)。尽管我仍然在学习C++的所有复杂性,并且确实需要很多东西。欢呼 – Meyer

+0

非常感谢! ;) – Luca