这是我的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 500x400的文件,带有一些黑色背景和一些白线,所以我可以将其设置为我的背景......
问题是我总是得到黑屏而不是我试图加载的图像
答案 0 :(得分:1)
您忘记了SDL_Flip()
while(p_running)
{
SDL_WaitEvent(&evt);
if(evt.type == SDL_QUIT)
p_running = false;
SDL_Flip(m_pScreen);
^^^^^^^^^^^^^^^^^^^^
}
可能你的ide改变了应用程序的工作目录,在这种情况下尝试在完整路径上打开图像。
答案 1 :(得分: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调用。