Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ sdl_从文件加载BMP,而不使用整个文件路径_C++_Sdl_Sdl 2 - Fatal编程技术网

C++ sdl_从文件加载BMP,而不使用整个文件路径

C++ sdl_从文件加载BMP,而不使用整个文件路径,c++,sdl,sdl-2,C++,Sdl,Sdl 2,我正在尝试从文件加载图像,而不使用整个文件路径。就像在C#中一样,但是当加载映像时,我尝试的所有操作都会在控制台中抛出sdl错误 bool loadMedia() { //Loading success flag bool success = true; //Load splash image gHelloWorld = SDL_LoadBMP( "SDL2_tutorials02/hello_world.bmp" ); if( gH

我正在尝试从文件加载图像,而不使用整个文件路径。就像在C#中一样,但是当加载映像时,我尝试的所有操作都会在控制台中抛出sdl错误

bool loadMedia()
     {
     //Loading success flag
     bool success = true;

     //Load splash image
     gHelloWorld = SDL_LoadBMP( "SDL2_tutorials02/hello_world.bmp" );
     if( gHelloWorld == NULL )
     {
         printf( "Unable to load image %s! SDL Error: %s\n", "SDL2_tutorials02/hello_world.bmp", SDL_GetError() );
         success = false;
     }

      return success;
   }
<>这是我从一个在线教程中学习到的原始代码的一部分,试图教自己SDL,更多关于C++ +/P> 为InternetUssie编辑,这是我从教程中学到的全部源代码,如下所示:

//Using SDL and standard IO
#include <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( "SDL2_tutorials02/hello_world.bmp" );
if( gHelloWorld == NULL )
{
    printf( "Unable to load image %s! SDL Error: %s\n", "SDL2_tutorials02/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 );
    }
}
    //system halt for testing
system("pause");

//Free resources and close SDL
close();

return 0;
}
//使用SDL和标准IO
#包括
#包括
//屏幕尺寸常数
屏幕宽度=640;
屏幕上的常数=480;
//启动SDL并创建窗口
bool init();
//加载媒体
bool loadMedia();
//释放媒体并关闭SDL
无效关闭();
//我们将渲染到的窗口
SDL_窗口*gWindow=NULL;
//窗户所包含的表面
SDL_表面*gScreenSurface=NULL;
//我们将加载并显示在屏幕上的图像
SDL_表面*gHelloWorld=NULL;
boolinit()
{
//初始化标志
布尔成功=真;
//初始化SDL
if(SDL_Init(SDL_Init_视频)<0)
{
printf(“SDL无法初始化!SDL_错误:%s\n”,SDL_GetError());
成功=错误;
}
其他的
{
//创建窗口
gWindow=SDL_CreateWindow(“SDL教程”,SDL_WINDOWPOS_未定义,SDL_WINDOWPOS_未定义,屏幕宽度,屏幕高度,显示SDL_窗口);
if(gWindow==NULL)
{
printf(“无法创建窗口!SDL_错误:%s\n”,SDL_GetError());
成功=错误;
}
其他的
{
//获取窗口表面
gScreenSurface=SDL_GetWindowSurface(gWindow);
}
}
回归成功;
}
bool loadMedia()
{
//加载成功标志
布尔成功=真;
//加载飞溅图像
gHelloWorld=SDL_LoadBMP(“SDL2_tutorials02/hello_world.bmp”);
if(gHelloWorld==NULL)
{
printf(“无法加载图像%s!SDL错误:%s\n”,“SDL2_tutorials02/hello_world.bmp”,SDL_GetError());
成功=错误;
}
回归成功;
}
无效关闭()
{
//释放面
SDL_自由曲面(gHelloWorld);
gHelloWorld=NULL;
//破坏窗口
SDL_(格温多);
gWindow=NULL;
//退出SDL子系统
SDL_退出();
}
int main(int argc,char*args[]
{
//启动SDL并创建窗口
如果(!init())
{
printf(“初始化失败!\n”);
}
其他的
{
//加载媒体
如果(!loadMedia())
{
printf(“加载媒体失败!\n”);
}
其他的
{
//应用图像
SDL_BlitSurface(gHelloWorld,NULL,gscreenssurface,NULL);
//更新曲面
SDL_更新内表面(gWindow);
//等两秒钟
SDL_延迟(2000年);
}
}
//系统暂停测试
系统(“暂停”);
//释放资源并关闭SDL
close();
返回0;
}

如果有帮助的话,我在Lazy Foo'Productions上遵循了教程1中的说明。我希望适当添加的超链接只是在单击有关如何使用visual Studio 2010 ultimate在windows计算机上设置sdl的步骤后的设置部分。我使用system 32安装程序,使用控制台作为错误的输出源。

正如InternetUssie所说的,如果您运行的是已编译的可执行文件,则所有路径都与可执行文件运行的目录相关

您的问题似乎与您的IDE有关。当您从IDE构建和运行代码时,工作目录是从其他地方获取的。它可以是IDE构建程序调试版本的默认路径。很难说清楚,因为他们都不一样

如果要调试SDL项目,应将编译器的工作目录设置为编译可执行文件的目录,并将要读取的文件保存在该目录中

F.e.:如果您使用的是visual studio,则可以通过右键单击项目>设置>调试>工作路径选项进行设置,或者如果您使用cmake构建项目,也可以使用
set\u属性(目标项目\u名称属性VS\u调试器\u工作目录“路径”)进行设置。


如果这不能解决您的问题,请随时提问。另外,如果您使用的是cmake和VS,我可以为您提供一个完整的cmakelists.txt,它可以为VisualStudio生成SDL2项目,并设置所有必需的设置。

如何运行可执行文件?如果您自己运行它,相对路径通常取自包含它的目录。否则,工作目录可能是任何目录。请阅读
getcwd()
chdir()
以及一般的相关路径。查看是否有效:构建可执行文件;将
SDL2\u tutorials02
目录与可执行文件放在同一目录中;并双击资源管理器中的可执行文件,而不是从IDE运行它(这会更改工作目录)。希望这能有所帮助。或者:将
hello\u word.bmp
放入与构建的可执行文件相同的目录中;将
SDL\u LoadBMP(“SDL2\u tutorials02/hello\u world.bmp”)
更改为
SDL\u LoadBMP(“hello\u world.bmp”)
;然后双击Explorer中的可执行文件。它正常运行了一次,然后返回到控制台上抛出SDL错误,就像我再次尝试运行它时在IDE中一样,以确保它不是侥幸。我假设它位于visual Studio在安装VS2010 Ultimate开始时创建的项目文件夹中。因此,就像在我以前的c#程序中一样,我将.bmp图像添加到项目文件夹中相应的项目中。