Reputation: 5860
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
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
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