Это мой 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
Я создал папку с именем images и внутри я добавил файл с именем bg.png 500×400 с черным фоном и белыми линиями, чтобы я мог установить его в качестве фона …
Проблема в том, что я всегда получаю черный экран вместо изображения, которое пытаюсь загрузить
Вы забыли о SDL_Flip()
while(p_running)
{
SDL_WaitEvent(&evt);
if(evt.type == SDL_QUIT)
p_running = false;
SDL_Flip(m_pScreen);
^^^^^^^^^^^^^^^^^^^^
}
И возможно ваш иде меняет рабочий каталог приложения, в таком случае попробуйте открыть изображение по полному пути.
Обычно вы хотите, чтобы ваш основной цикл очищал экран, рисовал спрайты и затем переворачивал буферы. Это можно легко сделать с помощью уже имеющегося кода, просто немного изменив цикл:
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
}
Если вы сделаете это изменение, имейте в виду, что вы должны удалить вызов Draw перед циклом.