C语言 SDL窗口关闭,因为SDL_Flip与图像表面阵列



我在一个破砖类型的游戏的开始,我被困在SDL_Flip步骤。我的CodeBlocks编译器什么也没说,控制台也没有崩溃,但是SDL窗口关闭了,控制台进程返回了代码3。当我运行调试器时,它说:

SDL_Flip()
Display(Bricks=0x28f69c, screen=0x0)

显示类型错误位于我的SDL_Flip(screen);

这里是我的代码的一瞥。我的Brick_CoordinatesBrick_Surface结构已经被另一个函数初始化(Brick_Coordinates的坐标和Brick_Surface的NULL):

void Display(BrickStruct Bricks[12][10],SDL_Surface *screen)
{
    int i=0,j=0;
    for(j=0;j<10;j++)
    {
        if( (j+1)%2==0 )  // If we are on even lines, display only 11 bricks
        {
            for(i=0;i<11;i++)
            {
                Bricks[i][j].Brick_Surface = IMG_Load("BrickTest1.png");
                SDL_BlitSurface(Bricks[i][j].Brick_Surface, NULL, screen, &Bricks[i][j].Brick_Coordinates);
                SDL_Flip(screen); 
            }
        }
        else   // If we are on odd lines, display the 12 bricks
        {
            for(i=0;i<12;i++)
            {
            }
        }
    }
}

我的结构是这样的:

typedef struct BrickStruct
{
    int type;
    SDL_Rect Brick_Coordinates;   
    SDL_Surface *Brick_Surface;  
}BrickStruct;
在我的main中,我的代码是这样的:
SDL_Surface *screen= NULL; 
BrickStruct Bricks[12][10];  // I create my 2D array of struct named Bricks
Display(Bricks,screen);

我已经用fprintf测试了坐标初始化的值。这些都很好。显然我的SDL_Blit正在工作。但Flip不是。我的屏幕表面足够大,可以容纳我所有的图像(480 × 540,我的图像是40 × 20)。我想知道这个问题是否与Blit不可能将图像放在另一个图像上有关,但是当我只尝试一个图像(没有我的循环)时,Flip甚至不起作用。有谁能好心告诉我我的问题在哪里吗?提前感谢

原因是您没有将screen保存到全局变量中。

您可能在SDL_Initialisation中有这样一行:

SDL_Surface *screen = SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE);

这将创建一个名为screen的新的局部变量。由于您想将其保存为全局文件,因此您应该将其更改为:

screen = SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE);

根据您的调试器和示例代码,您的screen结构为空。所以你对SDL_BlitSurface的呼叫将会失败。当你在Initialize中执行Display调用时,它可能对你有效的原因是你刚刚初始化了screen并在之后使用了它。

你需要存储你正在写入的表面,并在你进行比特时再次使用它。

另外,正如其他人所建议的,您应该看一下SDL的教程,或者更多的C教程来强化一些概念。

最新更新