2015-10-30 3 views
0

Трассировка стека: enter image description hereTTF_RenderText_Solid() сбоями игры и Visual Studio [C++] [SDL TTF]

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

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

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

** Место для обнаружения нарушения доступа 0x00000000 ** наиболее lilely означает, что вы пытаетесь прочитать элемент данных из нулевого указателя. Что касается того, где и почему, можете ли вы показать нам трассировку стека? –

+0

@ DanielStrul Я провел некоторое тестирование, и кажется, что шрифт никогда не загружается в переменную Sans. Шрифт находится в папке моего проекта, Fonts> Aaargh.ttf. –

+0

@ DanielStrul Добавлена ​​функция отслеживания стека. Я думаю, что это правильный вариант. –

ответ

2

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

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

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

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

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

+0

Ну, это имеет смысл, за исключением того, что я не могу отлаживать его сейчас ... Мой другой отладочный файл по-прежнему открыт, но я не могу его закрыть, а визуальная студия не находится в режиме отладки ... D: –

+0

Завершите приложение с помощью диспетчера задач – kovacsmarcell

+0

«Access Denied» :( –