SDL2 SLD_RenderCopy 不显示任何内容

SDL2 SLD_RenderCopy doesn't display anything

我正在使用 SDL2 学习如何制作简单的 2D 平台。 我开始阅读 SDL 游戏开发和 Lazy Foo 的教程,我能够打开 window 并在表面上绘制并在 window 上将该表面 blit(就像在旧版 SDL 中所做的那样) ), 但如果我尝试使用渲染器函数对硬件加速做同样的事情,它不会显示任何东西! 我在 windows 10 运行,当我启动应用程序时它只显示空的 window。我试图打印一些调试行,它似乎打开了位图,创建了纹理,但是当我打印矩形的尺寸时,我用 QueryTexture 得到它 returns 0 和 0 !

//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;
}

问题是你没有正确分配纹理 Game::loadImage() 函数。在行

SDL_Texture *texture = SDL_CreateTextureFromSurface(m_pRenderer,surface);

创建的纹理被分配给一个局部指针变量,它去 在函数末尾超出范围。相反,你需要评估 class 变量的纹理:

m_pTexture = SDL_CreateTextureFromSurface(m_pRenderer,surface);

请注意,您没有充分利用 C++ 功能来 管理资源。我建议你投入一些时间 在学习推荐的做法时,例如从 C++ Core Guidelines.