Весь код не влезет, там 418 строк (это игра). Вот функция для спрайта, ниже фрагмент горения факелов из первой гифки.
//функция вывода спрайта и его стирания по фоновой фотокартинке размером w*h,x,y - положение спрайта на экране w1,h1 - размер спрайта (*bitmap - массив фона,*bitmap_- массив спрайта,true-нарисовать спрайт,false-затереть фоном)
void drawFoto_spr(int x,int y, const uint8_t *bitmap,int w,int h,const uint8_t *bitmap_,int w1,int h1,bool SPR) {
if(x<0||x+w1>128||y<0||y+h1>160){return;}
tft.setAddrWindow(x,y,x+w1-1,y+h1-1);
SPI.beginTransaction(SPISettings(40000000, MSBFIRST, SPI_MODE0));
digitalWrite(TFT_DC, HIGH);
digitalWrite(TFT_CS, LOW);
for(int j=0; j<h; j++) {
for(int i=0; i<2*w; i=i+2) {
if(i>=2*x&&i<2*(x+w1)&&j>=y&&j<y+h1){
if(bitmap_[(i-2*x)+1+(j-y)*2*w1]==bitmap_[1]&&bitmap_[(i-2*x)+(j-y)*2*w1]==bitmap_[0]){//условие определения фонового цвета по цвету первого пикселя массива
SPI.transfer(bitmap[i+1+j*2*w]);SPI.transfer(bitmap[i+j*2*w]);
}
else{
if(SPR) {SPI.transfer(bitmap_[(i-2*x)+1+(j-y)*2*w1]);SPI.transfer(bitmap_[(i-2*x)+(j-y)*2*w1]);}
else{SPI.transfer(bitmap[i+1+j*2*w]);SPI.transfer(bitmap[i+j*2*w]);}
}
}
}
}
digitalWrite(TFT_CS, HIGH);
SPI.endTransaction();
///
}
///горение факелов
if(millis()-Y_pl>100){
Y_pl=millis();FL_pl++;if(FL_pl>3){FL_pl=0;}
if(FL_pl==0){
drawFoto_spr(56,24,fon,128,160,plamia_1,32,12,true);
drawFoto_spr(55,124,fon,128,160,plamia_3,32,12,false);
}
if(FL_pl==1){
drawFoto_spr(56,24,fon,128,160,plamia_1,32,12,false);
drawFoto_spr(55,124,fon,128,160,plamia_3,32,12,true);
}
if(FL_pl==2){
drawFoto_spr(56,24,fon,128,160,plamia_2,32,12,true);
drawFoto_spr(55,124,fon,128,160,plamia_4,32,12,false);
}
if(FL_pl==3){
drawFoto_spr(56,24,fon,128,160,plamia_2,32,12,false);
drawFoto_spr(55,124,fon,128,160,plamia_4,32,12,true);
}
}