SDL не рисует изображение

Это мой 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 с черным фоном и белыми линиями, чтобы я мог установить его в качестве фона …

Проблема в том, что я всегда получаю черный экран вместо изображения, которое пытаюсь загрузить

0

Решение

Вы забыли о SDL_Flip()

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

И возможно ваш иде меняет рабочий каталог приложения, в таком случае попробуйте открыть изображение по полному пути.

1

Другие решения

Обычно вы хотите, чтобы ваш основной цикл очищал экран, рисовал спрайты и затем переворачивал буферы. Это можно легко сделать с помощью уже имеющегося кода, просто немного изменив цикл:

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 перед циклом.

1

По вопросам рекламы [email protected]