我正处于破砖游戏类型的开始阶段,我陷入了SDL_Flip
步骤。我的CodeBlocks编译器什么也没说,控制台没有崩溃,但SDL窗口关闭,控制台进程返回代码3.当我运行调试器时,它说:
SDL_Flip()
Display(Bricks=0x28f69c, screen=0x0)
并且显示位于我的SDL_Flip(screen);
以下是我的代码的一瞥。我的Brick_Coordinates
和Brick_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
在我只尝试一个图像(没有我的循环)时甚至不起作用。
请有人能够表示我的问题在哪里?
提前致谢
答案 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);