我在一个破砖类型的游戏的开始,我被困在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;
在我的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教程来强化一些概念。