diff --git a/src/display.cpp b/src/display.cpp index b444ae36b4fc09ce16dfdfb3f79cefe3ed61fa26..eed3e09340aadcf16699f34b8aad82bea918f57d 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -18,6 +18,9 @@ rgb24 gameColor = {colorR, colorG, colorB}; rgb24 textColor = {255, 255, 255}; rgb24 pixelColor = {255, 255, 255}; +uint8_t fontWidth = 3; +uint8_t fontHeight = 5; + 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); @@ -105,29 +108,57 @@ void ageColor(uint8_t age, uint8_t decay) } } -void showMessage(String strMsg) +void showMessage(int lineOffset, String message, bool firstLine, bool lastLine) { - uint8_t fontWidth = 3; - uint8_t fontHeight = 5; - indexedLayer.fillScreen(0); - uint8_t msgLen = strMsg.length(); + if (firstLine) + { + indexedLayer.fillScreen(0); + } + + uint8_t lineSpacing = 3; + uint8_t msgLen = message.length(); uint8_t msgWidth = (msgLen * fontWidth) + msgLen; + uint8_t linePosY; + if (lineOffset < 0) + { + linePosY = (matrix.getScreenHeight() / 2) - floor(fontHeight / 2) - (lineOffset * -1) * (fontHeight + lineSpacing); + } + else if (lineOffset == 0) + { + linePosY = (matrix.getScreenHeight() / 2) - floor(fontHeight / 2); + } + else if (lineOffset > 0) + { + linePosY = (matrix.getScreenHeight() / 2) - floor(fontHeight / 2) + lineOffset * (fontHeight + lineSpacing); + } + char charMsg[msgLen + 1]; - strMsg.toCharArray(charMsg, msgLen + 1); - indexedLayer.drawString((matrix.getScreenWidth() / 2) - (msgWidth / 2), (matrix.getScreenHeight() / 2) - ceil(fontHeight / 2), 1, charMsg); - indexedLayer.swapBuffers(false); + message.toCharArray(charMsg, msgLen + 1); + indexedLayer.drawString((matrix.getScreenWidth() / 2) - (msgWidth / 2), linePosY, 1, charMsg); + + if (lastLine) + { + indexedLayer.swapBuffers(false); + } +} + +void showStartScreen() { + showMessage(-1, "Game", true, false); + showMessage(0, "of", false, false); + showMessage(1, "Life", false, true); } -void showEndScreen(uint16_t ticks) +void showEndScreen(uint16_t ticks, uint16_t cells) { char msg_game[15]; sprintf(msg_game, "Game %d ended", gameEra); - char msg_evo[12]; - sprintf(msg_evo, "Ticks: %d", ticks); - indexedLayer.fillScreen(0); - indexedLayer.drawString((matrix.getScreenWidth() / 2) - (strlen(msg_game) * 4) / 2, (matrix.getScreenHeight() / 2) - 2 - 5, 1, msg_game); - indexedLayer.drawString((matrix.getScreenWidth() / 2) - (strlen(msg_evo) * 4) / 2, (matrix.getScreenHeight() / 2) + 2, 1, msg_evo); - indexedLayer.swapBuffers(false); + showMessage(-1, String(msg_game), true, false); + char msg_ticks[12]; + sprintf(msg_ticks, "Ticks: %d", ticks); + showMessage(0, String(msg_ticks), false, false); + char msg_cells[12]; + sprintf(msg_cells, "Cells: %d", cells); + showMessage(1, String(msg_cells), false, true); } void displayBrightness(uint8_t brightness) diff --git a/src/display.h b/src/display.h index 9b9f31f22df4fb89e519b75cc71124f759db6f1b..252fe822f5b971b61f2f30255dab29e646e7de66 100644 --- a/src/display.h +++ b/src/display.h @@ -17,8 +17,9 @@ extern uint8_t colorB; void setupDisplay(); void displayLoop(); void ageColor(uint8_t age, uint8_t decay); -void showEndScreen(uint16_t ticks); -void showMessage(String msg); +void showStartScreen(); +void showEndScreen(uint16_t ticks, uint16_t cells); +void showMessage(int lineOffset, String message, bool firstLine, bool lastLine); void displayBrightness(uint8_t brightness); void gameBrightness(uint8_t brightness); void setGameColor(uint8_t r, uint8_t g, uint8_t b); diff --git a/src/gameoflife.cpp b/src/gameoflife.cpp index cc0fe513c58ac2d067fb4adc4588dc391a79938e..297c6eebc561a1930f518833c3f0d61184eb3b2d 100644 --- a/src/gameoflife.cpp +++ b/src/gameoflife.cpp @@ -168,7 +168,7 @@ void gameLoop() { finalTicks = currentTick - noEvolutionTicksLimit; currentMillis = millis(); - showEndScreen(finalTicks); + showEndScreen(finalTicks, cellsAliveNow); if (updateHighscores(gameEra, finalTicks, cellsAliveNow)) { sendHighscores(); diff --git a/src/main.cpp b/src/main.cpp index 6bec0862bb977cef33a9fd12eff2c437830a49dc..9333df6e75fcd80992f3826b19bdc304ae9857a4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,7 +21,7 @@ void setup() logLine("", true); loadSettings(); setupDisplay(); - showMessage("Game of Life"); + showStartScreen(); setupNetwork(); clearDisplay(); setupGame(); diff --git a/src/network.cpp b/src/network.cpp index fe1100d0004644ce990bbf1c98e35efe877f2853..5b63710de6abc1b169cc0866e26a1776d2fbbb93 100644 --- a/src/network.cpp +++ b/src/network.cpp @@ -73,7 +73,7 @@ void setupOTA() if (percent > otaProgress) { char msg[9]; sprintf(msg, "OTA:%3d%%", percent); - showMessage(String(msg)); + showMessage(0, String(msg), true, true); logLine("OTA: ", false); logLine((String)percent, false); logLine("%");