Буфер для экрана не хранит все элементы, которые вы рисуете на нем, как отдельные элементы - он просто содержит конечный результат всех операций рисования. Таким образом, вы не можете просто нарисовать фон, затем нарисовать на нем фигуру, а затем переместить фигуру - вам нужно перерисовать затронутые части экрана с необходимыми изменениями.
У вас все еще есть изображения частей, и у вас все еще есть фоновое изображение; способ переместить нарисованную фигуру состоит в том, чтобы просто восстановить фон в старом положении, переместив его снова, а затем перевернув кусок в новом положении. Вместо того, чтобы рисовать весь экран и все фрагменты заново, вы можете просто нарисовать измененные области: отбросить только часть фона, чтобы стереть старый квадрат, а затем переместить фрагмент на новый квадрат.
Следующая функция аналогична вашей функции apply_surface()
, но вместо копирования всего исходного изображения по заданным координатам пункта назначения она копирует область заданной ширины и высоты из заданных координат исходного изображения. к тем же координатам пункта назначения. Затем его можно использовать для восстановления фона для небольшой части экрана.
/* Blit a region from src to the corresponding region in dest. Uses the same
* x and y coordinates for the regions in both src and dest. w and h give the
* width and height of the region, respectively.
*/
void erase_rect( int x, int y, int w, int h, SDL_Surface *src, SDL_Surface *dest)
{
SDL_Rect offset;
offset.x = x;
offset.y = y;
offset.w = w;
offset.h = h;
SDL_BlitSurface( src, &offset, dest, &offset );
}
Так что, если ваши квадраты 50х50, и вам нужно переместить фигуру из квадрата в (120, 40) в квадрат в (170, 90), вы можете сделать что-то вроде следующего:
/* erase old 50x50 square at (120,40) (to background image) */
erase_rect( 120, 40, 50, 50, background, screen );
/* draw piece at new position of (170,90) */
inserePeca(NORMAL, 170, 90, PRETA);