Окно SDL закрывается из-за SDL_Flip с массивом поверхности изображения

Я нахожусь в начале игры типа разбивания кирпичей и застрял на шаге SDL_Flip. Мой компилятор CodeBlocks ничего не говорит, и консоль не падает, но все же закрытие окна SDL и процесс консоли вернул код 3. Когда я запустил отладчик, он говорит:

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

и было сказано, что ошибка типа отображения находится в строке моего SDL_Flip(screen);

Вот проблеск моего кода. Мои структуры Brick_Coordinates и Brick_Surface уже инициализированы (мои координаты для 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 даже не работает, когда я пытаюсь использовать только одно изображение (без моих циклов). Может ли кто-нибудь указать мне, где находится моя проблема? заранее спасибо


person paolovador    schedule 08.03.2014    source источник
comment
Вызовите flip только один раз, после того, как вы засветите каждое изображение, я действительно рекомендую вам посмотреть несколько руководств.   -  person this    schedule 08.03.2014
comment
Спасибо. Это то, что я сделал в первую очередь. Я переместил Flip только для отладки, но до этого у меня была та же проблема. И для справки, я следил за 2-недельными уроками C в школе и следовал за очень большим уроком C (чтобы иметь 2 разные точки зрения), который занял у меня 2 недели, чтобы закончить и в котором есть полная часть о SDL и SDL_Изображение. Даже так я удивлен, обнаружив, что застрял перед вещами, с которыми никогда раньше не сталкивался. На мой взгляд, у меня не должно возникнуть проблем с печатью PNG с помощью SDL_image.   -  person paolovador    schedule 08.03.2014
comment
И, кстати, я думаю, что мой 2D-массив структур структуры поверхностей слишком необычен, чтобы найти что-то подобное в учебниках в Интернете. А моему учителю 19 лет (какая школа!) и плевать на мою проблему. Он говорит LetMeGoogle ThatForYou.   -  person paolovador    schedule 08.03.2014
comment
Забудьте этот код, изучите учебники, а затем идите оттуда.   -  person this    schedule 08.03.2014
comment
? Это именно то, что я делаю. Может быть, я использую не лучший или самый простой способ отобразить весь блок на моем экране, но я действительно не знаю, как еще я могу это сделать.   -  person paolovador    schedule 08.03.2014
comment
Загрузите изображение один раз. Затем отобразите его в цикле.   -  person this    schedule 08.03.2014


Ответы (2)


Причина была в том, что вы не сохранили экран в глобальную переменную.

У вас, вероятно, была строка в вашем SDL_Initialisation, похожая на эту:

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

Это создает новую локальную переменную с именем screen. Поскольку вы хотели сохранить это в глобальном, вы должны изменить его на:

screen = SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE);
person Bartlomiej Lewandowski    schedule 08.03.2014
comment
Большое спасибо. Но я уже объявил свой экранный указатель в файле main. Итак, это делает его (скрин) глобальной переменной, верно? А в Void SDL_Initialisation(SDL_Surface *screen) я просто делаю SDL_Init и screen = SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);. Таким образом, экран должен быть изменен глобально, не так ли? - person paolovador; 09.03.2014
comment
Нет, глобальная переменная объявлена ​​в глобальной области видимости. Не внутри какой-либо функции, даже основной. - person Bartlomiej Lewandowski; 09.03.2014

Согласно вашему отладчику и вашему примеру кода, ваша структура screen имеет значение null. Таким образом, ваш вызов SDL_BlitSurface потерпит неудачу. Причина, по которой это, вероятно, работает для вас, когда вы выполняете вызов Display внутри вашего Initialize, заключается в том, что вы только что инициализировали свой screen и использовали его сразу после этого.

Вам нужно сохранить поверхность, на которую вы пишете, и использовать ее снова, когда вы выполняете блиттинг.

Кроме того, как рекомендовали другие, вам следует взглянуть на учебник по SDL и, возможно, еще на несколько руководств по C, чтобы закрепить некоторые концепции.

person ysalmi    schedule 08.03.2014