Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.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++ 在C+;中的SDL2窗口上显示.bmp时出现问题+;_C++_Sdl 2 - Fatal编程技术网

C++ 在C+;中的SDL2窗口上显示.bmp时出现问题+;

C++ 在C+;中的SDL2窗口上显示.bmp时出现问题+;,c++,sdl-2,C++,Sdl 2,第一个问题,我真的需要帮助。所以我在努力学习 基于C++的SDL2 API。我使用的是树莓皮3模型B。我第一次在Youtube上看教程(更具体地说是CodingMadeEasy) 但现在我正在学习lazyfoo的教程。我复制了CME的代码,并尝试显示图像(.bmp),但窗口也没有显示任何内容 SDL_GetError()没有报告任何错误。我想一定有 我写的代码可能有问题,或者我从互联网上下载的图像可能不是.bmp,所以我来到这里的lazyfoo教程,下载了源代码和.bmp文件。但是当我运行它时,

第一个问题,我真的需要帮助。所以我在努力学习
基于C++的SDL2 API。我使用的是树莓皮3模型B。我第一次在Youtube上看教程(更具体地说是CodingMadeEasy) 但现在我正在学习lazyfoo的教程。我复制了CME的代码,并尝试显示图像(.bmp),但窗口也没有显示任何内容 SDL_GetError()没有报告任何错误。我想一定有
我写的代码可能有问题,或者我从互联网上下载的图像可能不是.bmp,所以我来到这里的lazyfoo教程,下载了源代码和.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以查看sdl是否报告了错误,它是否报告了错误,这意味着它能够在正确的位置读取.bmp,只是无法显示它。我在谷歌搜索了几个小时,什么也没找到。关于堆栈溢出,最接近我的问题是 我甚至尝试轮询事件,以便让系统有机会运行它的事件循环,正如那里所建议的那样,但无论窗口保持打开多久,.bmp都不会显示。 更奇怪的是,这不是我第一次遇到这种情况。一年前我试着学习SDL2,但那时候也发生了同样的事情。我使用的是一个廉价的Windows10笔记本,内存为2GB,使用的是code::blocks(mingw编译器版本),同样的事情也发生了,只是窗口不是透明的,它是白色的,就像用sdl创建窗口时一样 在Windows中不显示任何内容。出于某种原因,codeblocks不允许我将窗口设置为
NULL ptr
,因为它无法识别它是什么,所以我不得不将其设置为
NULL
。因此,我认为窗口不显示.bmp也是编译器的错。所以我下载了Microsoft visual studio 2015 但结果是一样的:没有显示任何图像。
当时,我放弃了,但现在我回来了,因为我有一台新机器(RPIModel3B)和一个新编译器(GNUC/c++),认为SDL不会再困扰我,但SDL似乎不会放弃。我真的需要帮助。是的,.bmp位于正确的位置,我在代码中包含了正确的名称。请记住,我曾尝试在两台机器、三台编译器、两个完全不同的操作系统和两种不同的cpu体系结构(armv71和x86)上执行此操作,但现在它越来越令人沮丧。我有一些惊人的想法,如果SDL2允许的话,这些想法很容易实现。很抱歉发了这么长的帖子,非常感谢您的帮助。谢谢。

您的代码在我的iMac上运行良好。我所做的唯一改变如下,所以也许可以尝试做同样的改变,看看它是否适合你

首先,有许多不同类型的BMP文件,可能您已经掌握了一个在图片查看器应用程序中运行良好的文件,但SDL对加载它感到“不高兴”。为免生疑问,请使用ImageMagick创建您自己的BMP文件,然后您可以确定您有一个好的BMP文件。我在终端中使用了这个:

convert -size 640x480 gradient:red-cyan image.bmp
其次,在任何“集成开发环境”之外运行您的程序,即仅从终端运行,所有图像都在当前目录中(没有路径),并且名称中都没有空格。原因是IDE可能会对事件循环和屏幕更新造成严重破坏,而且IDE通常看起来运行的是一个程序,但实际上运行的是
/some/where/else/Debug/program
,这会打乱您打开的文件路径,例如,您的
“02\u在屏幕上获取图像/hello\u 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

谢谢你的帮助。我尝试了,但输出仍然相同:.bmp未显示。谢谢你告诉我ImageMagick的事。它真的很好。也许可以尝试更改ImageMagick命令来生成GIF,看看是否能加载到SDL.1中。除非您完全知道自己在做什么,否则永远不要使用
-w
编译器开关。2.您的路径显示您的图像在子目录中,是吗?3.从您的屏幕截图上看,您似乎不是在终端上运行您的程序,那么您希望在哪里看到错误输出?4.从screemshot判断,您的窗口根本没有得到更新(您看到的只是文件管理器和桌面的“bachground”),bmp加载不太可能是问题的根源;您不在特定事件上重画的事实是。使事件循环和渲染循环。绘制一次并等待不是一种显示方式。我总是从终端运行它,但对于这个屏幕截图,我只是执行输出文件(“hl”)。不,即使我从终端运行它,我也没有看到任何错误@凯尔塔,你能解释一下渲染循环是什么意思吗?我是一个游戏开发新手。在你们提到的教程的下一部分中会有描述。最常见的方法是创建一个在退出条件下中断的循环,在每次迭代中它都会处理事件并重新绘制您想要显示的内容。甚至从教程中下载了源代码和bmp。没用。不管怎样,谢谢。对不起,我看不懂。请编辑您的问题,以包括您的实际代码、此目录中的
ls-la
输出以及程序的完整输出。因为在技术上,所讨论的代码不需要显示任何内容。另外,现在可能是开始使用调试器检查程序流和变量的好时机
g++ main.cpp $(pkg-config --cflags --libs sdl2) -o main