const int numDrops = 8; // Number of raindrops // Structure to store raindrop positions struct Raindrop { int x; int y; }; // Array to store raindrops Raindrop drops[numDrops]; // Function to initialize raindrops within the specified area void initRaindrops(int w, int h) { for (int i = 0; i < numDrops; i++) { //mod for like waterfall from right side drops[i].x = random(0, w); drops[i].y = random(0, h); if ((drops[i].y<(w/2)) && (drops[i].x<(w/2)) ){ drops[i].x = random(w/2, w); drops[i].y = random(w/2, w); } } } // Function to update raindrop positions within the specified area void updateRaindrops(int w, int h) { for (int i = 0; i < numDrops; i++) { //drops[i].y += random(1, 4); // Update y position drops[i].y += random(1, 3); // Update y position. 2 more looks like water from pipe if (drops[i].y >= h) { // Reset position if it goes out of bounds drops[i].x = random(0, w); drops[i].y = 0; if ((drops[i].y<(w/2)) && (drops[i].x<(w/2)) ){ drops[i].x = random(w/2, w); drops[i].y = random(w/2, w); } } } } // Function to draw raindrops within the specified area void drawRaindrops(int x, int y) { for (int i = 0; i < numDrops; i++) { u8g2.drawPixel(drops[i].x+x, drops[i].y+y); } } // Function to animate rain with keyframes, position, and size void animateRain(int keyframes, int x, int y, int w, int h) { for (int frame = 0; frame < keyframes; frame++) { //u8g2.clearBuffer(); drawRaindrops(x, y); //u8g2.sendBuffer(); updateRaindrops(w, h); //delay(100); // Adjust delay for animation speed } }