David
David

Reputation: 25

I have an error when I'm trying to copy a texture with SDL_RenderCopy, in C++

This is my .cpp file:

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

It compiles without error, and when I run the executable it renders a white window, with no text on it(even if it should have some text).

The error comes when I try to use SDL_RenderCopy, and as I acknowledged using SDL_Error(), apparently the texture is invalid, even if I check it before using it.

This is the exact thing that I get in the console when running the code:

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

Upvotes: 0

Views: 511

Answers (1)

keltar
keltar

Reputation: 18399

if(Message = NULL) is an assignment, not comparison, so your previous value of Message is lost and it is NULL after that, and that result is used as logic value (NULL == 0 == false, for that matter). Enabling compiler warnings should produce a message pinpointhing this specific problem, e.g. -Wall for gcc gives

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

To compare values, use == operator.

Also your texture goes out of scope without DestroyTexture, which is clearly a resource leak.

Upvotes: 6

Related Questions