kopia lustrzana https://github.com/pimoroni/pimoroni-pico
88 wiersze
2.3 KiB
C++
88 wiersze
2.3 KiB
C++
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <math.h>
|
|
#include "pico/stdlib.h"
|
|
|
|
#include "libraries/pico_graphics/pico_graphics.hpp"
|
|
#include "galactic_unicorn.hpp"
|
|
#include "okcolor.hpp"
|
|
|
|
using namespace pimoroni;
|
|
|
|
PicoGraphics_PenRGB888 graphics(53, 11, nullptr);
|
|
GalacticUnicorn galactic_unicorn;
|
|
|
|
// extra row of pixels for sourcing flames and averaging
|
|
float heat[53][13] = {0.0f};
|
|
|
|
int main() {
|
|
|
|
stdio_init_all();
|
|
|
|
galactic_unicorn.init();
|
|
|
|
while(true) {
|
|
if(galactic_unicorn.is_pressed(galactic_unicorn.SWITCH_BRIGHTNESS_UP)) {
|
|
galactic_unicorn.adjust_brightness(+0.01);
|
|
}
|
|
if(galactic_unicorn.is_pressed(galactic_unicorn.SWITCH_BRIGHTNESS_DOWN)) {
|
|
galactic_unicorn.adjust_brightness(-0.01);
|
|
}
|
|
|
|
graphics.set_pen(0, 0, 0);
|
|
graphics.clear();
|
|
|
|
for(int y = 0; y < 12; y++) {
|
|
for(int x = 0; x < 53; x++) {
|
|
if(heat[x][y] > 0.5f) {
|
|
graphics.set_pen(255, 255, 180);
|
|
graphics.pixel(Point(x, y));
|
|
}else if(heat[x][y] > 0.4f) {
|
|
graphics.set_pen(220, 160, 0);
|
|
graphics.pixel(Point(x, y));
|
|
}else if(heat[x][y] > 0.3f) {
|
|
graphics.set_pen(180, 50, 0);
|
|
graphics.pixel(Point(x, y));
|
|
}else if(heat[x][y] > 0.2f) {
|
|
graphics.set_pen(40, 40, 40);
|
|
graphics.pixel(Point(x, y));
|
|
}
|
|
|
|
// update this pixel by averaging the below pixels
|
|
if(x == 0) {
|
|
heat[x][y] = (heat[x][y] + heat[x][y + 2] + heat[x][y + 1] + heat[x + 1][y + 1]) / 4.0f;
|
|
} else if(x == 52) {
|
|
heat[x][y] = (heat[x][y] + heat[x][y + 2] + heat[x][y + 1] + heat[x - 1][y + 1]) / 4.0f;
|
|
} else {
|
|
heat[x][y] = (heat[x][y] + heat[x][y + 2] + heat[x][y + 1] + heat[x - 1][y + 1] + heat[x + 1][y + 1]) / 5.0f;
|
|
}
|
|
|
|
heat[x][y] -= 0.01f;
|
|
heat[x][y] = heat[x][y] < 0.0f ? 0.0f: heat[x][y];
|
|
}
|
|
}
|
|
|
|
galactic_unicorn.update(&graphics);
|
|
|
|
// clear the bottom row and then add a new fire seed to it
|
|
for(int x = 0; x < 53; x++) {
|
|
heat[x][11] = 0.0f;
|
|
}
|
|
|
|
// add a new random heat source
|
|
for(int c = 0; c < 5; c++) {
|
|
int px = (rand() % 51) + 1;
|
|
heat[px][11] = 1.0f;
|
|
heat[px + 1][11] = 1.0f;
|
|
heat[px - 1][11] = 1.0f;
|
|
heat[px][12] = 1.0f;
|
|
heat[px + 1][12] = 1.0f;
|
|
heat[px - 1][12] = 1.0f;
|
|
}
|
|
|
|
sleep_ms(50);
|
|
}
|
|
|
|
return 0;
|
|
}
|