diff --git a/src/display.cpp b/src/display.cpp index c627dabc4fbcf9027fbc4d6daea0a280ad940ebb..54efa26a471a9384a422a985d4b548690c9d1367 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -10,18 +10,21 @@ const uint8_t kDmaBufferRows = 2; // known working: const uint8_t kPanelType = SMARTMATRIX_HUB75_64ROW_MOD32SCAN; // use SMARTMATRIX_HUB75_16ROW_MOD8SCAN for common 16x32 panels const uint8_t kMatrixOptions = (SMARTMATRIX_OPTIONS_NONE); // see http://docs.pixelmatix.com/SmartMatrix for options const uint8_t kBackgroundLayerOptions = (SM_BACKGROUND_OPTIONS_NONE); +const uint8_t kIndexedLayerOptions = (SM_INDEXED_OPTIONS_NONE); -const int defaultBrightness = (10 * 255) / 100; +const int defaultBrightness = (brightnessPercent * 255) / 100; rgb24 colorWhite = {0xff, 0xff, 0xff}; rgb24 colorBlack = {0x00, 0x00, 0x00}; SMARTMATRIX_ALLOCATE_BUFFERS(matrix, kMatrixWidth, kMatrixHeight, kRefreshDepth, kDmaBufferRows, kPanelType, kMatrixOptions); SMARTMATRIX_ALLOCATE_BACKGROUND_LAYER(backgroundLayer, kMatrixWidth, kMatrixHeight, COLOR_DEPTH, kBackgroundLayerOptions); +SMARTMATRIX_ALLOCATE_INDEXED_LAYER(indexedLayer, kMatrixWidth, kMatrixHeight, COLOR_DEPTH, kIndexedLayerOptions); void setupDisplay() { matrix.addLayer(&backgroundLayer); + matrix.addLayer(&indexedLayer); matrix.begin(); matrix.setBrightness(defaultBrightness); backgroundLayer.enableColorCorrection(true); @@ -42,6 +45,25 @@ void displayLoop() } } +void fadeOut(int ticks) +{ + const uint transitionTime = 5000; + unsigned long currentMillis = millis(); + + while (millis() - currentMillis < transitionTime) + { + char evolutions[16]; + sprintf(evolutions, "Evolutions: %d", ticks); + char msg[] = "Life has ended"; + indexedLayer.setFont(font3x5); + indexedLayer.drawString((matrix.getScreenWidth() / 2) - (strlen(msg) * 4) / 2, (matrix.getScreenHeight() / 2) - 2 - 5 , 1, msg); + indexedLayer.drawString((matrix.getScreenWidth() / 2) - (strlen(evolutions) * 4) / 2, (matrix.getScreenHeight() / 2) + 2, 1, evolutions); + indexedLayer.swapBuffers(); + indexedLayer.fillScreen(0); + } + indexedLayer.swapBuffers(); +} + void clearDisplay() { backgroundLayer.fillScreen({0, 0, 0}); diff --git a/src/display.h b/src/display.h index 777b26da8b5c5bc6adcc379f174aac5b57658d9b..ffb957966a07de86943186b9b4c78a55cc8756b6 100644 --- a/src/display.h +++ b/src/display.h @@ -6,9 +6,11 @@ #include <SmartMatrix.h> extern bool runGame; +extern int brightnessPercent; void setupDisplay(); void displayLoop(); +void fadeOut(int ticks); void clearDisplay(); #endif diff --git a/src/gameoflife.cpp b/src/gameoflife.cpp index 67c70ab1028d55ed906d06157974691bff8b8c32..a9c7554ff8e652c1df3f8743bfe3710009e792f0 100644 --- a/src/gameoflife.cpp +++ b/src/gameoflife.cpp @@ -15,14 +15,14 @@ int noEvolutionTicks; void setupGameOfLife() { - randomSeed(analogRead(34)); - createRandomMatrix(g); - for (int i = 0; i < 10; i++) - addGlider(random(SCREEN_HEIGHT), random(SCREEN_WIDTH), g); - clearDisplay(); currentTick = 0; cellsAliveBefore = 0; noEvolutionTicks = 0; + randomSeed(analogRead(34)); + createRandomMatrix(g); + for (int i = 0; i < 10; i++) { + addGlider(random(SCREEN_HEIGHT), random(SCREEN_WIDTH), g); + } } void createRandomMatrix(int (&a)[SCREEN_HEIGHT][SCREEN_WIDTH]) @@ -97,7 +97,7 @@ void gameOfLife(int (&a)[SCREEN_HEIGHT][SCREEN_WIDTH]) if (noEvolutionTicks > noEvolutionTicksLimit) { - setupGameOfLife(); + endGame(); } } @@ -118,6 +118,17 @@ void addGlider(int i1, int j1, int (&a)[SCREEN_HEIGHT][SCREEN_WIDTH]) void gameLoop() { - if (runGame) + if (runGame) { gameOfLife(g); + } +} + +void endGame() { + fadeOut(currentTick - noEvolutionTicksLimit); + resetGame(); +} + +void resetGame() { + clearDisplay(); + setupGameOfLife(); } diff --git a/src/gameoflife.h b/src/gameoflife.h index 3b84e7642b9bd1e35c3c7937361630fe947ef8c4..cc7b9fabdb9c2760fd11e22b36fabce3eb298626 100644 --- a/src/gameoflife.h +++ b/src/gameoflife.h @@ -17,5 +17,7 @@ void createRandomMatrix(int (&a)[SCREEN_HEIGHT][SCREEN_WIDTH]); void gameOfLife(int (&a)[SCREEN_HEIGHT][SCREEN_WIDTH]); void addGlider(int i1, int j1, int (&a)[SCREEN_HEIGHT][SCREEN_WIDTH]); void gameLoop(); +void endGame(); +void resetGame(); #endif diff --git a/src/main.cpp b/src/main.cpp index d30ed7a22ecec9c20b22594387b655729f372ef8..02936ab04cf359a76abce292ca5f8c2a5876dac7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,6 +5,7 @@ #include "gameoflife.h" int noEvolutionTicksLimit = 100; +int brightnessPercent = 20; void setup() {