SDL2 SLD_RenderCopy ничего не отображает

Я использую SDL2, чтобы научиться делать простую 2D-платформу. Я начинаю читать разработку игр SDL и учебное пособие для Lazy Foo, и я могу открыть окно и нарисовать поверхность, а затем отодвинуть эту поверхность на окне (как это делается в устаревшем SDL), но если я попытаюсь это сделать то же самое с аппаратным ускорением с использованием функций Renderer, он ничего не отображает! Я работаю на Windows 10, и когда я запускаю приложение, оно просто показывает пустое окно. Я попытался напечатать несколько строк отладки, и кажется, что он открывает растровое изображение, создает текстуру, но когда я печатаю размеры прямоугольника, который я получаю с помощью QueryTexture, он возвращает 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;
}

1 ответ

Решение

Проблема в том, что вы неправильно назначаете текстуру в Game::loadImage() функция. В соответствии

SDL_Texture *texture = SDL_CreateTextureFromSurface(m_pRenderer,surface);

созданная текстура присваивается локальной переменной указателя, которая выходит из области видимости в конце функции. Вместо этого вам нужно добавить текстуру в переменную класса:

m_pTexture = SDL_CreateTextureFromSurface(m_pRenderer,surface);

Как примечание, вы не используете возможности C++ для управления ресурсами. Я рекомендую вам потратить некоторое время на изучение рекомендуемых методов, например, из Основных рекомендаций C++.

Другие вопросы по тегам