由于带有图像表面阵列的SDL_Flip,SDL窗口关闭

时间:2014-03-08 14:00:05

标签: c arrays sdl sdl-image

我正处于破砖游戏类型的开始阶段,我陷入了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;

在我的主要内容中,我的代码是这样的:

SDL_Surface *screen= NULL; 

BrickStruct Bricks[12][10];  // I create my 2D array of struct named Bricks

Display(Bricks,screen);

我已经测试了fprintf初始化坐标的值。这些都很好。显然我的SDL_Blit正在发挥作用。但翻转不是。我的屏幕表面足够大,可用于我的所有图像(480x540,我的图像为40x20)。我想知道这个问题是否与Blit不可能将图像置于另一个图像之上,但Flip在我只尝试一个图像(没有我的循环)时甚至不起作用。 请有人能够表示我的问题在哪里? 提前致谢

2 个答案:

答案 0 :(得分:1)

根据您的调试器和示例代码,您的screen结构为空。因此,您对SDL_BlitSurface的调用将失败。当您在Initialize中进行展示广告调用时,它可能适合您的原因是您刚刚初始化了screen并在之后立即使用它。

您需要存储正在书写的表面,并在进行blitting时再次使用它。

另外,正如其他人所推荐的那样,你应该看一下SDL的教程,或许还有一些C教程来强化一些概念。

答案 1 :(得分:1)

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

您的SDL_Initialisation中可能有一行与此相似:

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

这会创建一个名为screen的新局部变量。由于您希望将其保存到全局版本中,因此应将其更改为:

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