stergosz
stergosz

Reputation: 5860

SDL doesn't draw image

This is my main.cpp

#include <cstdlib>
#include <iostream>

#include "Sprite.h"
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
#include "SDL/SDL_mixer.h"

#undef main

SDL_Surface* m_pScreen;
SDL_Surface* bg_image;

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

        SDL_Event evt;
        bool p_running = true;

        // initialize SDL
        SDL_Init(SDL_INIT_EVERYTHING);
        SDL_EnableUNICODE( SDL_ENABLE );
        TTF_Init();

        // set the title bar text
        SDL_WM_SetCaption("test1", NULL);

        // create the screen surface
        m_pScreen = SDL_SetVideoMode(500, 400, 32, SDL_DOUBLEBUF);

        bg_image = NULL;

        bg_image = Sprite::Load("images/bg.png");

        Sprite::Draw(m_pScreen, bg_image, 0, 0);


        while(p_running)
        {
          SDL_WaitEvent(&evt);
          if(evt.type == SDL_QUIT)
            p_running = false;
        }

        SDL_Quit();

       system("pause");
       return 0;

}

Sprite.h:

#ifndef  _SPRITE_H_
#define _SPRITE_H_

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

class Sprite
{
    public:

             Sprite();

             static SDL_Surface* Load(char* pFile);

             static bool Draw( SDL_Surface* dest, SDL_Surface* src, int x, int y );

             static bool Draw( SDL_Surface* dest, SDL_Surface* src, int x, int y, int x2,
              int y2, int width, int height );
};



// constructor
Sprite::Sprite() {}

SDL_Surface* Sprite::Load( char* File )
{
    SDL_Surface* temp = NULL;
    SDL_Surface* optimized = NULL;

    if(( temp = IMG_Load(File)) == NULL )
    {
          return NULL;
    }

    optimized = SDL_DisplayFormatAlpha(temp);

    SDL_FreeSurface(temp);

    //Uint32 colorkey = SDL_MapRGB( optimized->format, 0xFF, 0x80, 0xC0 );//0xFF, 0x04, 0xC1 );
    //SDL_SetColorKey( optimized, SDL_RLEACCEL | SDL_SRCCOLORKEY, colorkey );

    return optimized;
}

bool Sprite::Draw( SDL_Surface* dest, SDL_Surface* src, int x, int y )
{
      if(dest == NULL || src == NULL)
       {
                  return false;
       }

       SDL_Rect  destR;

       destR.x = x;
       destR.y = y;

       SDL_BlitSurface(src, NULL, dest, &destR);

        return true;
}




#endif

I have created a folder named images and inside i ahve added a file called bg.png 500x400 with some black background and some white lines so i can set that as my background...

The problem is that i always get a black screen instead of the image i try to load

Upvotes: 0

Views: 1330

Answers (2)

tehten
tehten

Reputation: 156

You forgot about SDL_Flip()

while(p_running)
{
  SDL_WaitEvent(&evt);
  if(evt.type == SDL_QUIT)
    p_running = false;
  SDL_Flip(m_pScreen);
  ^^^^^^^^^^^^^^^^^^^^
}

And probably your ide changes a working directory of application, in that case try to open image on a full path.

Upvotes: 1

emartel
emartel

Reputation: 7773

Usually, you want your main loop to clear the screen, draw the sprites and then flip the buffers. This can be done quite easily with the code you already have by simply changing your loop a bit:

while(p_running)
{
  SDL_PollEvent(&evt); // Poll for new events
  if(evt.type == SDL_QUIT)
  {
    p_running = false;
    break;
  }

  SDL_FillRect(m_pScreen, NULL, 0); // Clear the screen

  // Perform "game" logic here, like moving the sprite

  Sprite::Draw(m_pScreen, bg_image, 0, 0); // Draw the sprite

  SDL_Flip(m_pScreen); // Flip the buffers

}

If you do this change, keep in mind that you should remove the Draw call before the loop.

Upvotes: 1

Related Questions