Dosyć skomplikowana wydawać się może poniższa funkcja, która ma za zadanie w miejsce wcześniej narysowanego bąbelka powietrza przerysować wycinek z tła poziomicy, aby wyczyścić ekran.
1 2 |
void TFTN_WriteBall(const unsigned short *buffer, const unsigned short *bufferball, int xPos, int yPos, int xSize, int ySize) |
Można by przerysowywać całą bitmapę tła ale strasznie długo to trwa, dlatego odświeżana jest tylko używana część ekranu. Funkcja przyjmuje następujące parametry:
*buffer – wskaźnik do tablicy z tłem poziomicy
*bufferball – wskaźnik do tablicy z rysunkiem stalowej kulki
xPos oraz yPos – to pozycja wspomnianej kuleczki na tle
xSize oraz ySize – określa wymiar bitmapy kulki do wyświetlenia.
Sama funkcja wygląda następująco:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
void TFTN_WriteBall(const unsigned short *buffer, const unsigned short *bufferball, int xPos, int yPos, int xSize, int ySize) { //Draw bitmap unsigned short Word0,Word1; unsigned short x=0,y=0; // Set column address range TFTN_SendCmd(CASET); TFTN_SendData(xPoss); TFTN_SendData(xPoss+xSize-1); // Set row address range TFTN_SendCmd(PASET); TFTN_SendData(yPoss); TFTN_SendData(yPoss+ySize-1); // Write memory TFTN_SendCmd(RAMWR); //Przerysowanie w miejscu starej kulki tla poziomicy for(y=0;y<ySize;y++) { for(x=0;x<xSize;x=x+2) { Word0=buffer[((yPoss+y)*132)+xPoss+x]; Word1=buffer[((yPoss+y)*132)+xPoss+x+1]; //pixel 1 RG TFTN_SendData( (Word0 >> 4) & 0xFF); //pixel 1 B, pixel 2 R TFTN_SendData(((Word0 & 0x0F) << 4) | ((Word1 >> 8) & 0xF)); TFTN_SendData( Word1 & 0xFF); } } TFTN_SendCmd(NOP); // Set column address range TFTN_SendCmd(CASET); TFTN_SendData(xPos); TFTN_SendData(xPos+xSize-1); // Set row address range TFTN_SendCmd(PASET); TFTN_SendData(yPos); TFTN_SendData(yPos+ySize-1); // Write memory TFTN_SendCmd(RAMWR); //Rysowanie kulki for(y=0;y<ySize;y++) { for(x=0;x<xSize;x=x+2) { //Jesli piksel kulki jest czrny to przerysuj piksel z tla if(bufferball[(y*xSize)+x]==0) { Word0=buffer[((yPos+y)*132)+xPos+x]; } //Gdy kolor piksela kulki jest różny od 0x000 rysuj piksel z kulki else { Word0=bufferball[(y*xSize)+x]; } //To samo dla kolejnego piksela if(bufferball[(y*xSize)+x+1]==0) { Word1=buffer[((yPos+y)*132)+xPos+x+1]; } else { Word1=bufferball[(y*xSize)+x+1]; } // Zaktualizuj ekran //pixel 1 RG TFTN_SendData( (Word0 >> 4) & 0xFF); //pixel 1 B, pixel 2 R TFTN_SendData(((Word0 & 0x0F) << 4) | ((Word1 >> 8) & 0xF)); TFTN_SendData( Word1 & 0xFF); } } //Zapamietaj stara pozycje kulki xPoss=xPos; yPoss=yPos; TFTN_SendCmd(NOP); } |
W miejscu wyznaczonym przez akcelerometr rysowana zostaje bitmapa kulki z tym, że kolor czarny nie jest renderowany, a na jego miejsce jest przerysowywana piksel po pikselu bitmapa tła, aby kulka wyglądała profesjonalnie a nie jako kwadrat z rysunkiem kuli.
W momencie gdy uzyskamy poziom w osi x oraz y, kulka znajdzie się w środku najmniejszego okręgu narysowanego na tle, a buzzer wyda dźwięk informując nas dodatkowo o tym fakcie. Jako że bitmapa kulki jest na przemian usuwana oraz przerysowywana na nowo uzyskujemy efekt przeźroczystości, i zwykła bitmapa uzyskuje efekt bąbelka powietrza w wodzie.