-1

就在第一行发生了* * 核心转储。

SDL_Init(SDL_INIT_EVERYTHING);
SDL_Init(SDL_INIT_VIDEO);

SDL_Surface *screen;
SDL_Surface *background;
SDL_Surface *tablero;
SDL_Surface *x;
SDL_Surface *o; 
SDL_Rect posFondo;
//SDL_Rect posPlayerX[5];
//SDL_Rect posPlayerO[5];
SDL_Event suceso;

// Definir
x = SDL_LoadBMP("players.bmp");
o = SDL_LoadBMP("players.bmp");
tablero = SDL_LoadBMP("tablero.bmp");

/* Clear bg colors */
SDL_SetColorKey(x, SDL_SRCCOLORKEY,
    SDL_MapRGB(x->format, 255, 0, 255));

SDL_SetColorKey(o, SDL_SRCCOLORKEY,
    SDL_MapRGB(o->format, 255, 0, 255));

SDL_SetColorKey(tablero, SDL_SRCCOLORKEY,
    SDL_MapRGB(tablero->format, 255, 0, 255));
/* END */

screen = SDL_SetVideoMode(600, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
if (screen == NULL) { return 0; }

/* Positions */
posFondo.x = 0;
posFondo.y = 0;

while (true) {
    SDL_BlitSurface(tablero, NULL, screen, &posFondo);
    //SDL_BlitSurface

    while(SDL_PollEvent(&suceso)) {
        if (suceso.type == SDL_QUIT) {
            break; break;
        }
    } 
    SDL_Flip(screen);   
    SDL_Delay ( 5 );
}   

我找不到问题,我尝试删除一些东西并添加动态变量(新的,删除类型)并且不...

4

1 回答 1

3

我在您的代码中只看到两个错误。对于初学者,无需调用 SDL_Init() 两次。当您调用 SDL_Init(SDL_INIT_EVERYTHING) 时,您已经在初始化视频。摆脱对 SDL_Init() 的第二次调用。您的代码中的第二个问题将在您的:

while(SDL_PollEvent(&suceso)){
    if(suceso.type == SDL_QUIT){
        break; break;
    }
}

当您调用第一个 break 时,它会退出 while 循环。从未使用过第二次休息。因此,我猜你会遇到循环永远不会结束的情况。这是我为您的循环推荐的内容:

bool quit = false;
while (!quit) {
    SDL_BlitSurface(tablero, NULL, screen, &posFondo);
    //SDL_BlitSurface

    while(SDL_PollEvent(&suceso)) {
        if (suceso.type == SDL_QUIT) {
            quit = true;
        }
    } 
    SDL_Flip(screen);   
    SDL_Delay ( 5 );
}  

编辑:您可能还应该将您的 SDL_Surface* 初始化为 NULL。

编辑#2:除非你的桌面表面要改变,否则真的不需要每帧调用 SDL_BlitSurface() 和 SDL_Flip() 。如果您使用 SDL_WaitEvent() 而不是 SDL_PollEvents(),您可以在用户执行某项操作时更新屏幕等,而不是无缘无故地一直更新。

于 2013-07-02T00:41:04.253 回答