Home > other >  Why doesn't my SDL2 code display images with SDL_Texture*
Why doesn't my SDL2 code display images with SDL_Texture*

Time:03-09

I have a C project where I'm initially trying to display a PNG image to the screen.

This is my code.

RenderWindow.hpp

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>

class RenderWindow
{

public:
    RenderWindow(const char *p_title, int p_width, int p_height);
    void render();
    void cleanUp();

private:
    SDL_Window *window;
    SDL_Renderer *renderer;
    SDL_Surface *image = IMG_Load("~/SDL2_Game/images/Green_Tile.png");
    SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, image);
};

RenderWindow.cpp

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <iostream>
#include "RenderWindow.hpp"

RenderWindow::RenderWindow(const char* p_title, int p_w, int p_h):window(NULL), renderer(NULL)
{

window = SDL_CreateWindow(p_title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, p_w, p_h, SDL_WINDOW_SHOWN);
if (window == NULL) std::cout << "Window failed to init: " << SDL_GetError() << std::endl;

renderer = SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED);
}
void RenderWindow::render(){
SDL_RenderClear(renderer);
//SDL_Rect dstrect = { 5, 5, 320, 240 };
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);
}
void RenderWindow::cleanUp(){
SDL_DestroyTexture(texture);
SDL_FreeSurface(image);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
}

main.cpp

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <iostream>
#include "RenderWindow.hpp"

int main(int argc, char** argv){

    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
    std::cout << "Problem with initialization. " << SDL_GetError() << std::endl;
    }
    else {
    std::cout << "Initialization success!" <<std::endl;
    }
    if (!IMG_Init(IMG_INIT_PNG)){
     std::cout << "Problem with Image initialization " <<SDL_GetError() << std::endl;  
       
    }
    
RenderWindow win("RPG_Game_v_1.0", 800, 600);
win.render();
bool gameRunning = true;
SDL_Event event;

while(gameRunning){
while(SDL_PollEvent(&event)){
if (event.type == SDL_QUIT) gameRunning = false;
}
}

win.cleanUp();
IMG_Quit();
SDL_Quit();
return 0;
}

I'm on a Linux machine.

I compile this with

 g   -g -o game ./*.cpp -lSDL2main -lSDL2 -lSDL2_image

Only a window is displaying. There is no image. I've tried refactoring my code with SDL_BlitSurface() and it does indeed display the PNG image. But why is this code not working? is it due to the fact that I'm using SDL_Texture* and my current system does not have a discrete graphics card?

CodePudding user response:

I think that the call to SDL_CreateTextureFromSurface fails because it is called before SDL_CreateWindow and SDL_CreateRenderer, thereby initializing texture to NULL.

Please move the initizalization of texture (and image) to after window and renderer are initialized.

To further help with such issues, please check if the result of SDL functions != NULL and print SDL_GetError() to get more information about what went wrong.

  •  Tags:  
  • c
  • Related