У меня ошибка при попытке скопировать текстуру с помощью SDL_RenderCopy в C ++ - PullRequest
0 голосов
/ 02 октября 2018

Это мой файл .cpp:

#include  <iostream>
#include  <SDL2/SDL.h>
#include  <SDL2/SDL_ttf.h>

bool runningOnEmpty = false;
const char* title;
int xpos, ypos, width, height;
bool fullscreen = false;
SDL_Window *window;
SDL_Renderer *renderer;

void init(){
  int flags = 0;
  if(fullscreen){
    flags = SDL_WINDOW_FULLSCREEN;
  }

  if(!SDL_Init(SDL_INIT_EVERYTHING)){
    std::cout << "Sdl initialised!!\n";

    window = SDL_CreateWindow(title, xpos, ypos, width, height, flags);
    if(window){
      std::cout << "window created!!\n";
    }

    renderer = SDL_CreateRenderer(window, -1, 0);
    if(renderer){
      std::cout << "renderer created!!\n";

      SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
    }

    runningOnEmpty = true;
  } else {
    runningOnEmpty = false;
  }
  if(TTF_Init()==-1) {
    std::cout << "cannot init TTF: " << TTF_GetError() << "\n";
  } else {
    std::cout << "TTF initialized!" << "\n";
  }
}

void render(){
  SDL_RenderClear(renderer);
  TTF_Font* rFont = TTF_OpenFont("./fonts/roboto.ttf", 20);
  if(!rFont){
    std::cout << "Cannot open font: " << TTF_GetError() << "\n";
  }
  SDL_Color White = {0, 0, 0};
  SDL_Surface* surfaceMessage = TTF_RenderText_Solid(rFont, "Score: ", White);

  if(surfaceMessage == NULL)
    std::cout << "Cannot make surface!" << SDL_GetError() << "\n";

  SDL_Texture* Message = SDL_CreateTextureFromSurface(renderer, surfaceMessage);

  SDL_Rect mr;
  mr.x = 50, mr.y = 50, mr.w = 100, mr.h = 100;

  if(Message = NULL)
    std::cout << "Cannot make texture!" << SDL_GetError() << "\n";

  if(SDL_RenderCopy(renderer, Message, NULL, &mr))
    std::cout << "Cannot render text!" << SDL_GetError() << "\n";

  SDL_FreeSurface(surfaceMessage);
  SDL_RenderPresent(renderer);
}

void clean(){
  SDL_DestroyWindow(window);
  SDL_DestroyRenderer(renderer);
  SDL_Quit();
  std::cout << "Game cleaned!\n";
}

void handleEvents(){
  SDL_Event event;
  SDL_PollEvent(&event);
  switch(event.type){
  case SDL_QUIT:
    runningOnEmpty = false;
    break;

  default:
    break;
  }
}

int main(){
  title = "Test";
  xpos  = SDL_WINDOWPOS_CENTERED;
  ypos  = SDL_WINDOWPOS_CENTERED;

  width = 800, height = 900;
  fullscreen = false;

  init();
  render();

  while(runningOnEmpty){
    handleEvents();
  }

  clean();

  return 0;
}

Он компилируется без ошибок, и когда я запускаю исполняемый файл, он отображает белое окно без текста (даже если в нем должен быть какой-то текст).

Ошибка возникает, когда я пытаюсь использовать SDL_RenderCopy, и, как я подтвердил использование SDL_Error (), текстура, по-видимому, недействительна, даже если я проверяю ее перед использованием.

ЭтоТочная вещь, которую я получаю в консоли при запуске кода:

Sdl initialised!!
window created!!
renderer created!!
TTF initialized!
Cannot render text!Invalid texture
Game cleaned!

1 Ответ

0 голосов
/ 02 октября 2018

if(Message = NULL) является присваиванием, а не сравнением, поэтому ваше предыдущее значение Message потеряно, и после этого оно составляет NULL, и этот результат используется в качестве логического значения (NULL == 0 == false, в этом отношении).Включение предупреждений компилятора должно генерировать сообщение, точно определяющее эту конкретную проблему, например, -Wall для gcc дает

warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   if(Message = NULL)

Для сравнения значений используйте оператор ==.

Также ваша текстура выходит изобласть действия без DestroyTexture, что явно является утечкой ресурсов.

...