Иногда нам нужно отрисовывать только часть текстуры, или иметь несколько изображений. В большинстве случаев подгружать одну картинку со множеством спрайтов экономически целесообразнее, чем подгружать множество изображений.

в предыдущих уроках мы использовали SDL_RenderCopy(gRenderer,gTexture,NULL,NULL) пришло время разобраться что делают два последних параметра:

#include<SDL2/SDL.h>

int main(void)
{
  SDL_Init(SDL_INIT_VIDEO);
  SDL_Window* window= SDL_CreateWindow("Part of Image",0,0,640,480, 0);
  
  SDL_Renderer *gRenderer = SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED);
  
  SDL_Surface* bgSurface = SDL_LoadBMP("hw.bmp");
  SDL_Surface* CircleSurface = SDL_LoadBMP("sprites.bmp");

создаем окно(window) к нему подключаем отображение(gRenderer) и подгружаем два изображения(bgSurface, CircleSurface).

	SDL_SetColorKey(CircleSurface,SDL_TRUE,SDL_MapRGB(CircleSurface->format,0,0xFF,0xFF)); 

  SDL_Texture* bgTexture = SDL_CreateTextureFromSurface(gRenderer,bgSurface); 
  SDL_Texture* circleTexture = SDL_CreateTextureFromSurface(gRenderer,CircleSurface);

  SDL_RenderCopy(gRenderer,bgTexture,NULL,NULL);
 	SDL_RenderPresent(gRenderer);
 	SDL_Delay(1000); //необязательная пауза на секунду

у изображения(CircleSurface) делаем прозрачный фон, создаем два слоя(bgTexture, circleTexture), отрисовываем слой(bgTexture),

 SDL_Rect dstrect;
 dstrect.x = 0; dstrect.y = 0;
 dstrect.h = 100; dstrect.w = 100;
 
 SDL_Rect clip = {0,0,100,100}; //тут показаны два варианта задания Rect

 SDL_RenderCopy(gRenderer,circleTexture,&clip ,&dstrect);
 SDL_RenderPresent(gRenderer);

создаем два прямоугольника(dstrect, clip); dstrect будет отвечать за позицию на экране, clip за нужный нам спрайт из изображения.

отображаем спрайт захваченный координатами clip из изображения cirlceTexture, в координаты dstrect

 clip.y=100;
 dstrect.x = 540; dstrect.y = 0;
 dstrect.h = 100; dstrect.w = 100;
 SDL_RenderCopy(gRenderer,circleTexture,&clip,&dstrect);
 
 clip.y=0; clip.x=100;
 dstrect.x = 0; dstrect.y = 380;
 SDL_RenderCopy(gRenderer,circleTexture,&clip ,&dstrect);
 
 clip.y =100;
 dstrect.x=540;
 SDL_RenderCopy(gRenderer,circleTexture,&clip ,&dstrect);

 SDL_RenderPresent(gRenderer);
 SDL_Delay(1000);

меняем координаты clip для изменения цвета круга, и dstrect для изменения координат на экране. проделываем это три раза, и отрисовываем в окно.

 //TODO дописать код, чтобы круги меняли цвет.
 SDL_DestroyWindow(window); 
 SDL_Quit; 
}

домашнее задание: дописать программу, чтобы круги меняли цвет.
Ссылка на изображения

<< предыдущий урок