96 lines
2.6 KiB
C++
96 lines
2.6 KiB
C++
#include "starfielddisplay.h"
|
|
|
|
// 3rdparty lib includes
|
|
#include <randomutils.h>
|
|
#include <esprandom.h>
|
|
#include <screenmanager.h>
|
|
|
|
// local includes
|
|
#include "displays/menus/demosmenu.h"
|
|
#include "globals.h"
|
|
#include "screens.h"
|
|
|
|
StarfieldDisplay::StarfieldDisplay() :
|
|
za(cpputils::randomNumber<uint8_t>(espcpputils::esp_random_device{})),
|
|
zb(cpputils::randomNumber<uint8_t>(espcpputils::esp_random_device{})),
|
|
zc(cpputils::randomNumber<uint8_t>(espcpputils::esp_random_device{})),
|
|
zx(cpputils::randomNumber<uint8_t>(espcpputils::esp_random_device{}))
|
|
{
|
|
}
|
|
|
|
void StarfieldDisplay::initScreen(espgui::TftInterface &tft)
|
|
{
|
|
Base::initScreen(espgui::TftInterface &tft);
|
|
|
|
disableScreenFlip(true);
|
|
|
|
tft.fillScreen(TFT_BLACK);
|
|
tft.setRotation(1);
|
|
|
|
// fastSetup() must be used immediately before fastPixel() to prepare screen
|
|
// It must be called after any other graphics drawing function call if fastPixel()
|
|
// is to be called again
|
|
//tft.fastSetup(); // Prepare plot window range for fast pixel plotting
|
|
}
|
|
|
|
void StarfieldDisplay::redraw(espgui::TftInterface &tft)
|
|
{
|
|
Base::redraw(tft);
|
|
|
|
uint8_t spawnDepthVariation = 255;
|
|
|
|
for(int i = 0; i < NSTARS; ++i)
|
|
{
|
|
if (sz[i] <= 1)
|
|
{
|
|
sx[i] = 160 - 120 + cpputils::randomNumber<uint8_t>(espcpputils::esp_random_device{});
|
|
sy[i] = cpputils::randomNumber<uint8_t>(espcpputils::esp_random_device{});
|
|
sz[i] = spawnDepthVariation--;
|
|
}
|
|
else
|
|
{
|
|
int old_screen_x = ((int)sx[i] - 160) * 256 / sz[i] + 160;
|
|
int old_screen_y = ((int)sy[i] - 120) * 256 / sz[i] + 120;
|
|
|
|
// This is a faster pixel drawing function for occassions where many single pixels must be drawn
|
|
tft.drawPixel(old_screen_x, old_screen_y,TFT_BLACK);
|
|
|
|
sz[i] -= 2;
|
|
if (sz[i] > 1)
|
|
{
|
|
int screen_x = ((int)sx[i] - 160) * 256 / sz[i] + 160;
|
|
int screen_y = ((int)sy[i] - 120) * 256 / sz[i] + 120;
|
|
|
|
if (screen_x >= 0 && screen_y >= 0 && screen_x < 320 && screen_y < 240)
|
|
{
|
|
uint8_t r, g, b;
|
|
r = g = b = 255 - sz[i];
|
|
tft.drawPixel(screen_x, screen_y, color565(r,g,b));
|
|
}
|
|
else
|
|
sz[i] = 0; // Out of screen, die.
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void StarfieldDisplay::stop()
|
|
{
|
|
Base::stop();
|
|
disableScreenFlip(false);
|
|
}
|
|
|
|
void StarfieldDisplay::buttonPressed(espgui::Button button)
|
|
{
|
|
Base::buttonPressed(button);
|
|
|
|
switch (button)
|
|
{
|
|
using espgui::Button;
|
|
case Button::Left:
|
|
espgui::popScreen();
|
|
break;
|
|
default:;
|
|
}
|
|
}
|