1

我正处于破砖游戏的开始阶段,但我陷入了困境SDL_Flip。我的 CodeBlocks 编译器什么也没说,控制台也没有崩溃,但是 SDL 窗口关闭并且控制台进程返回了代码 3。当我运行调试器时,它说:

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

并且说显示类型错误位于我的行SDL_Flip(screen);

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

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但当我只尝试一个图像(没有我的循环)时甚至不起作用。有人可以告诉我我的问题在哪里吗?提前致谢

4

2 回答 2

1

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

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

此外,正如其他人所建议的那样,您应该看一下 SDL 教程,也许还有一些 C 教程来强化一些概念。

于 2014-03-08T18:00:40.863 回答
1

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

你可能有SDL_Initialisation类似这样的一行:

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

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

screen = SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE);
于 2014-03-08T18:27:17.800 回答