Иногда нам нужно отрисовывать только часть текстуры, или иметь несколько изображений. В большинстве случаев подгружать одну картинку со множеством спрайтов экономически целесообразнее, чем подгружать множество изображений.
![](https://habrastorage.org/getpro/habr/upload_files/420/85a/509/42085a509240e221684e0374d1988930.png)
![](https://habrastorage.org/getpro/habr/upload_files/732/1b9/7c3/7321b97c3f963a22b595c0cf96715a85.png)
в предыдущих уроках мы использовали 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; }
домашнее задание: дописать программу, чтобы круги меняли цвет.
Ссылка на изображения
ссылка на оригинал статьи https://habr.com/ru/articles/579682/
Добавить комментарий