第一个问题,我真的需要帮助。所以我想学习 C ++上的SDL2 api。我使用的是覆盆子pi 3型号B.我是第一次关注Youtube上的教程(CodingMadeEasy更具体),但现在我正在关注lazyfoo的教程。我复制了CME的代码并尝试显示图像(.bmp),但窗口没有显示任何内容,SDL_GetError()也没有报错。我认为必须 我写的代码有点不对,或者我从互联网上下载的图片可能不是.bmp所以我去了lazyfoo的教程http://lazyfoo.net/tutorials/SDL/02_getting_an_image_on_the_screen/index.php并下载了源代码和.bmp文件。但是当我运行它时,我得到相同的输出:一个空白窗口和SDL_GetError()没有在控制台上报告任何内容。这是代码:
/*This source code copyrighted by Lazy Foo' Productions
(2004-2015)
and may not be redistributed without written permission.*/
//Using SDL and standard IO
#include <SDL2/SDL.h>
#include <stdio.h>
//Screen dimension constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
//Starts up SDL and creates window
bool init();
//Loads media
bool loadMedia();
//Frees media and shuts down SDL
void close();
//The window we'll be rendering to
SDL_Window* gWindow = NULL;
//The surface contained by the window
SDL_Surface* gScreenSurface = NULL;
//The image we will load and show on the screen
SDL_Surface* gHelloWorld = NULL;
bool init()
{
//Initialization flag
bool success = true;
//Initialize SDL
if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
success = false;
}
else
{
//Create window
gWindow = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
if( gWindow == NULL )
{
printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
success = false;
}
else
{
//Get window surface
gScreenSurface = SDL_GetWindowSurface( gWindow );
}
}
return success;
}
bool loadMedia()
{
//Loading success flag
bool success = true;
//Load splash image
gHelloWorld = SDL_LoadBMP( "02_getting_an_image_on_the_screen/hello_world.bmp" );
if( gHelloWorld == NULL )
{
printf( "Unable to load image %s! SDL Error: %s\n", "02_getting_an_image_on_the_screen/hello_world.bmp", SDL_GetError() );
success = false;
}
return success;
}
void close()
{
//Deallocate surface
SDL_FreeSurface( gHelloWorld );
gHelloWorld = NULL;
//Destroy window
SDL_DestroyWindow( gWindow );
gWindow = NULL;
//Quit SDL subsystems
SDL_Quit();
}
int main( int argc, char* args[] )
{
//Start up SDL and create window
if( !init() )
{
printf( "Failed to initialize!\n" );
}
else
{
//Load media
if( !loadMedia() )
{
printf( "Failed to load media!\n" );
}
else
{
//Apply the image
SDL_BlitSurface( gHelloWorld, NULL, gScreenSurface, NULL );
//Update the surface
SDL_UpdateWindowSurface( gWindow );
//Wait two seconds
SDL_Delay( 2000 );
}
}
//Free resources and close SDL
close();
return 0;
}
如果您需要.bmp文件,请访问上面的链接并下载源代码和文件。它不允许我上传它。这是我得到的输出:Output。这个透明,灰色的窗户。我正在使用gnu c ++编译器并使用它编译
g++ 02_getting_an_image_on_the_screen.cpp -w -lSDL2 -o hl
并得到那个transparant-ish灰色的窗口。我猜它是透明的,因为我的终端配置就是这样。要查看问题是什么,我删除了.bmp以查看sdl是否报告错误,这意味着它能够在正确的位置读取.bmp,只是无法显示它。我搜索谷歌几个小时没找到。在堆栈溢出时,最接近我的问题是这个SDL window does not show我甚至尝试了轮询事件,以便让系统有机会让它的事件循环运行,正如那里建议的那样,但无论窗口保持打开多长时间,.bmp都会没有出现。更奇怪的是,这不是第一次发生在我身上。我在一年前尝试过学习SDL2,但同样的事情发生在那时。我使用的是一个便宜的Windows 10笔记本,内存为2GB,并使用了代码:: blocks(mingw编译器版本)并且发生了同样的事情,除了窗口不透明,它是白色的,就像你在创建一个窗口时得到的那样在Windows中使用sdl而不显示任何内容。出于某种原因,代码块没有让我设置窗口到nullptr
说它不知道它是什么所以我不得不把它设置为NULL
而不是。因此,我认为窗口不显示.bmp也是编译器的错误。所以我下载了Microsoft visual studio 2015,但结果是一样的:没有显示图像。那时,我放弃了,但现在我回来了,因为我有一台新机器(rpi型号3b)和一个新的编译器(gnu c / c ++),认为SDL不会再困扰我,但SDL不会似乎放弃了。我真的需要帮助。是的,.bmp位于正确的位置,我在代码中包含了正确的名称。请记住,我已尝试在2台机器,3台编译器,2种不同的操作系统和2种不同的cpu架构(armv71和x86)上进行此操作,此时它变得令人沮丧。我有一些很棒的想法,如果SDL2让我可以轻松实现。对不起,长篇文章和任何帮助表示赞赏。谢谢。
您的代码在我的iMac上运行正常。我做的唯一更改如下所示,也许尝试进行相同的更改,看看它是否适合您。
首先,有许多不同类型的BMP文件,你可能已经掌握了一个在你的图片查看器应用程序中工作正常的文件,但SDL对加载它感到“不满意”。毫无疑问,使用ImageMagick创建您自己的BMP文件,然后您可以确定您有一个好的。我在终端使用了这个:
convert -size 640x480 gradient:red-cyan image.bmp
其次,在任何“集成开发环境”之外运行程序,即仅从终端和当前目录中的所有图像(无路径),并且名称中没有空格。原因是IDE可能会对事件循环和屏幕更新造成严重破坏,并且IDE通常看起来正在运行一个程序,但实际上正在运行/some/where/else/Debug/program
,这会破坏您打开的文件的路径,例如你的"02_getting_an_image_on_the_screen/hello_world.bmp"
,这也意味着目录分隔符不会导致问题。
第三,考虑使用pkgconfig
来获取头路径和库。例如,在我的Mac上,它添加了一个我可能没有意识到的线程安全定义:
pkg-config --cflags --libs sdl2
样本输出
-D_THREAD_SAFE -I/usr/local/include/SDL2 -L/usr/local/lib -lSDL2
所以,为了编译,我使用:
g++ main.cpp $(pkg-config --cflags --libs sdl2) -o main