#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#define TFT_DC 6
#define TFT_CS 10
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
#define R ILI9341_RED
#define W ILI9341_WHITE
#define Y ILI9341_YELLOW
#define B ILI9341_BLUE
#define K ILI9341_BLACK
#define G ILI9341_GREEN
#define F ILI9341_BLACK // фон
#define SPRITE_W 11
#define SPRITE_H 5
PROGMEM const unsigned int sprite[] = {
F,R,R,R,R,R,R,R,R,R,F,
R,R,R,W,W,W,W,W,W,W,W,
F,R,R,Y,Y,Y,Y,Y,B,B,B,
F,F,B,B,B,B,B,B,B,B,F,
F,F,F,G,G,G,G,G,G,F,F,
};
PROGMEM const uint16_t sprite1[] = {
F,Y,Y,Y,Y,Y,Y,Y,Y,Y,F,
Y,Y,K,K,K,Y,K,K,K,Y,Y,
Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,
Y,Y,Y,K,K,K,K,K,Y,Y,Y,
F,Y,Y,Y,Y,K,Y,Y,Y,Y,F,
};
struct str_sprite{ // структура для зберігання атрибутів 1 спрайта
int x;
int y;
int w;
int h;
byte type;
};
#define CNT_MAS 10
str_sprite mas[CNT_MAS]; // масив спрайтів (масив структур)
void initMas(){
for (int i=0; i<CNT_MAS; i++) {
mas[i].x = random(300);
mas[i].y = random(200);
mas[i].w = SPRITE_W;
mas[i].h = SPRITE_H;
}
}
void drawOneSprite(int x, int y, uint16_t* spr, int width, int height) {
int length=width*height;
tft.startWrite();
tft.setAddrWindow(x,y,width,height);
for (int n=0; n<length; n++) {
tft.SPI_WRITE16( pgm_read_word( &spr[n] ) );
}
tft.endWrite();
}
void clearOneSprite(int x, int y, int width, int height) {
int length=width*height;
tft.startWrite();
tft.setAddrWindow(x,y,width,height);
for (int n=0; n<length; n++) {
tft.SPI_WRITE16( F );
}
tft.endWrite();
}
int x=50, y=20;
void setup(){
tft.begin();
tft.setRotation(1);
tft.print("Sprite");
//tft.fillScreen( F );
initMas();
tft.drawRGBBitmap(x,y, sprite1, SPRITE_W, SPRITE_H );
while (1) {
for( int i=0; i<CNT_MAS; i++ ) {
drawOneSprite(mas[i].x, mas[i].y, sprite, mas[i].w, mas[i].h );
}
delay(50);
for( int i=0; i<CNT_MAS; i++ ) {
clearOneSprite(mas[i].x, mas[i].y, mas[i].w, mas[i].h);
mas[i].x += random(11)-5;
mas[i].y += random(11)-5;
}
}
}
void loop(){
}