SDL стирает несколько поверхностей одновременно


10

Я пытаюсь написать платформерную игру, в которой спрайты для фоновых уровней разбиты на куски 512x512. Я держу в памяти по 3 куска за раз, и я пытаюсь написать код, чтобы вывести все три на экран. Вот текущий код у меня есть:

SDL_Rect where;
where.y = -game->camera->y;

where.x = -game->camera->x - MAP_WIDTH;
SDL_BlitSurface(left_chunk, NULL, screen, &where);

where.x = -game->camera->x;
SDL_BlitSurface(center_chunk, NULL, screen, &where);

where.x = -game->camera->x + MAP_WIDTH;
SDL_BlitSurface(right_chunk, NULL, screen, &where);

Проблема, с которой я сталкиваюсь, заключается в том, что какой-то кусок, который будет перенаправлен первым, является единственным, который появляется. Остальные не отображаются на экране. Я думаю, что проблема может иметь какое-то отношение к альфа-прозрачности, но даже если куски вообще не пересекаются, они все равно не могут вспыхнуть. В других частях кода я выкладываю на экран сразу несколько объектов, например символы и фоны, и все они отображаются правильно. Этот конкретный сегмент кода - единственная область, с которой я сталкиваюсь.

Скриншот

Если я закомментирую строку, которая blits left_chunk, она изменится на это:

Скриншот после


Вы уверены, что ваши рассчитанные значения X позиционируют изображение в видимой области экрана?
Зак Человек

@ZackTheHuman Они частично за кадром, так как размер экрана только 300x175, а фрагменты карты 512x512. Сначала я подумал, что это может быть проблемой, но, кажется, они на экране или нет, не имеет значения, правильно ли они рендерится или нет. Я могу загрузить скриншот, чтобы проиллюстрировать проблему.
Extropic-двигатель

1
В документации SDL говорится, что SDL_BlitSurface сохраняет последний прямоугольник в dstrect после блитинга. Вы пробовали сбрасывать переменную where после каждого удара?
Асакерон

@Asakeron Вот и все! Я не ожидал , где должен быть изменен. Вы должны сделать свой комментарий ответом!
Extropic-двигатель

Ответы:


8

В документации SDL говорится, что SDL_BlitSurface сохраняет последний прямоугольник в dstrect после блитинга. Сброс где переменные исправляет проблему.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.