TTF_RenderText_Solid() Crashing Game и Visual Studio [C++][sdl ttf]

Трассировки стека:

Итак, я пытаюсь создать 2D-игру и сейчас пытаюсь отобразить и переместить изображение, однако, когда я отлаживаю игру / запускаю ее, Visual Studio и игра зависает и не может выйти, даже когда используя диспетчер задач, чтобы убить его. Единственный способ разморозить его - выйти из системы или перезапустить компьютер, что заставит их обоих закрыться.

Я также получаю некоторую странную ошибку:

Unhandled exception at 0x71002A95 (SDL2_ttf.dll) in SDLGame.exe: 0xC0000005: Access violation reading location 0x00000000.

Я понятия не имею, что это значит и как это исправить, но я предполагаю, что это как-то связано с моим кодом, который мне нужно изменить.

Вот мой код:

#include <iostream>
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>

// Macros
#define pause system("PAUSE"); // Works on windows only, removed in alpha / beta versions.

// Pre "init" of functions
void QuitGame();
int InitGame();
void processInput();
void InitRects();

// Variables
int FramesPassed = 0;
int FramesPerSecond = 0; // Not used yet

SDL_Renderer* renderer = nullptr;
SDL_Window* window = nullptr;
SDL_Event evnt;

SDL_Rect sprite1_Rect;
SDL_Rect FPS_Text_Rect;

TTF_Font* Sans = TTF_OpenFont("Fonts/Aaargh.ttf", 40);

SDL_Color Color_White = { 255, 255, 255 };

SDL_Surface* FPS_Text_Surface = nullptr;

SDL_Texture* FPS_Text = nullptr;
SDL_Texture* testImg = nullptr;

static bool isRunning = true;

int SDL_main(int argc, char* argv[])
{
    InitGame();
    InitRects();

    std::cout << "Displaying text on screen using SDL TTF doesn't work" << std::endl;
    std::cout << "This happens when the TTF Surface is being rendered on screen" << std::endl;
    std::cout << "check line : 123 and 124." << std::endl;

    while (isRunning)
    {
        FramesPassed++;

        processInput();
        SDL_RenderClear(renderer); // Clears the last/current frame?

        // Render testImage on screen. (needs to be between render present and clear.)
        SDL_RenderCopy(renderer, testImg, NULL, &sprite1_Rect);
        SDL_RenderCopy(renderer, FPS_Text, NULL, &FPS_Text_Rect);

        SDL_RenderPresent(renderer); // Pretty much draws everything again.
    }

    return 0;
    QuitGame();

}

int InitGame()
{

    std::cout << "Game Initializing..." << std::endl;
    std::cout << "TTF SDL Initializing..." << std::endl;

    if (TTF_Init() < 0)
    {
        std::cout << "SDL TTF Failed To Initialize : " << TTF_GetError() << std::endl;
        pause
        QuitGame();
    }
    else
    {

        std::cout << "SDL TTF Initialized Successfully" << std::endl;

        if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
        {
            std::cout << "SDL Initialization Failed : " << SDL_GetError() << std::endl;
            pause
                QuitGame();
        }
        else
        {
            std::cout << "SDL Initializing" << std::endl;

            window = SDL_CreateWindow("Game Title", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1024, 720, SDL_WINDOW_SHOWN);
            if (window == NULL)
            {
                std::cout << "Window Creation Failed : " << SDL_GetError() << std::endl;
                pause
                    QuitGame();
            }
            else
            {
                std::cout << "SDL Initialized Successfully" << std::endl;
                std::cout << "Renderer Initializing..." << std::endl;

                renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
                if (renderer == NULL)
                {
                    std::cout << "Renderer Creation Failed : " << SDL_GetError() << std::endl;
                    pause
                        QuitGame();
                }

                else
                {
                    std::cout << "Renderer Initialized Successfully" << std::endl;
                    // This line (under) crashes game, and crashes visual studio...
                    FPS_Text_Surface = TTF_RenderText_Solid(Sans, "Frames Passed : " + FramesPassed, Color_White);
                    testImg = IMG_LoadTexture(renderer, "images/test.bmp");
                    FPS_Text = SDL_CreateTextureFromSurface(renderer, FPS_Text_Surface);
                }
            }
        }

    }
    std::cout << "Game Has Successfully Initialized!" << std::endl;
    return 0;

}

void InitRects()
{

    sprite1_Rect.h = 32;
    sprite1_Rect.w = 32;
    sprite1_Rect.x = 10;
    sprite1_Rect.y = 10;

    FPS_Text_Rect.h = 100;
    FPS_Text_Rect.w = 50;
    FPS_Text_Rect.x = 2;
    FPS_Text_Rect.y = 2;

}

void processInput()
{
    if (SDL_PollEvent(&evnt)) {

        switch (evnt.type) {

            case SDL_QUIT:
                QuitGame();
                break;

            case SDL_KEYDOWN:

                switch (evnt.key.keysym.sym) {
                    case SDLK_a:
                        sprite1_Rect.x -= 1;
                        break;
                    case SDLK_d:
                        sprite1_Rect.x += 1;
                        break;
                    case SDLK_w:
                        sprite1_Rect.y-= 1;
                        break;
                    case SDLK_s:
                        sprite1_Rect.y += 1;
                        break;
                }

            break;

        }
    }
}

void QuitGame()
{
    isRunning = false;
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
}

1 ответ

Решение

Проблема в том, что у вас есть шрифт как глобальная переменная и вы загружаете его прямо сейчас!

Вы должны сначала вызвать TTF_Init() и загрузить шрифт после!

Используя глобальную переменную vairable, вы загружаете ее перед инициализацией SDL_TTF, и таким образом TTF_OpenFont() вернет nullptr, а если вы попытаетесь прочитать nullptr, вы получите ошибку чтения местоположения нарушения доступа 0x00000000!

Просто вызовите TTF_OpenFont() в функции и после TTF_Init(), и она будет работать!

Просто совет, вы должны проверить, что Sans не nullptr перед его использованием!

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