Display slowly fades out

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
master
sigonasr2 2 years ago
parent 7a5a5c2fde
commit 886d92c39a
  1. BIN
      C++ProjectTemplate
  2. BIN
      CaveExplorer.ch8
  3. 12
      main.cpp
  4. BIN
      output.ch8
  5. 154
      splash.h

Binary file not shown.

Binary file not shown.

@ -1,5 +1,7 @@
#include "pixelGameEngine.h"
#include "Polygon.h"
#define OLC_PGEX_SPLASHSCREEN
#include "splash.h"
#include <ios>
#include <stack>
#include <bitset>
@ -13,6 +15,7 @@ using namespace olc;
class Chip8Emulator : public olc::PixelGameEngine
{
public:
//SplashScreen s;
Chip8Emulator()
{
sAppName = "CHIP-8!";
@ -47,6 +50,7 @@ public:
0xF0,0x80,0xF0,0x80,0x80 // F
};
std::array<bool,2048>display;
std::array<uint8_t,2048>screen;
std::stack<uint8_t>stack;
float pulse=0;
uint8_t delay_timer,sound_timer;
@ -355,7 +359,13 @@ public:
Clear(VERY_DARK_BLUE);
for (int x=0;x<ScreenWidth();x++){
for (int y=0;y<ScreenHeight();y++){
Draw({x,y},display[y*ScreenWidth()+x]?WHITE:BLACK);
if (display[y*ScreenWidth()+x]){
screen[y*ScreenWidth()+x]=255;
Draw({x,y},WHITE);
} else {
screen[y*ScreenWidth()+x]=std::max(0,screen[y*ScreenWidth()+x]-36);
Draw({x,y},{screen[y*ScreenWidth()+x],screen[y*ScreenWidth()+x],screen[y*ScreenWidth()+x]});
}
}
}
}

Binary file not shown.

@ -0,0 +1,154 @@
#pragma once
#include "pixelGameEngine.h"
namespace olc
{
class SplashScreen : public olc::PGEX
{
public:
SplashScreen();
protected:
virtual void OnAfterUserCreate() override;
virtual bool OnBeforeUserUpdate(float& fElapsedTime) override;
private:
olc::Renderable spr;
std::vector<std::pair<olc::vf2d, olc::vf2d>> vBoom;
olc::vf2d vScale;
olc::vf2d vPosition;
float fParticleTime = 0.0f;
float fAspect = 0.0f;
bool bComplete = false;
};
}
#ifdef OLC_PGEX_SPLASHSCREEN
#undef OLC_PGEX_SPLASHSCREEN
namespace olc
{
SplashScreen::SplashScreen() : olc::PGEX(true)
{
}
void SplashScreen::OnAfterUserCreate()
{
const char logo[] =
"000000000000000000000000000000000000000000000000000000000000000000005"
"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEED1EE"
"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEED5EEE"
"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE@E@000"
"0000000000000000000000000000000000000000000000000000000000001E1D:ZZZZ"
"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ1D5BZZZZZZ"
"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ5@E:P0002Z0"
"02ZZX000000000000ZP0000000000000000000000000000ZX000Z002XE1DX?o`o:Poo"
"800SooaE5@E1ED5BX?ol5E@E0E1ED?oo5@E1ED5DE1D5E@ZQEEBPEE2QD5BSooclZ?olQ"
"AB?oo5DEEDEEDE:SooaEEAE5DEEDoolEADEEDEAE5AEEBZ5EE:5EE:5@E:?oo?bXoob55"
"8o3lEAEEAD5ADZ?oo5@E5EEAD5Cl01E5AD5AE5DE5@E:X01DXEEDXE1DXo3lo:Sl0800S"
"ooaE1ED5EE5BXo00EEDEEE5EE?oo5EE5EE5DEEDEEDZQEEBQD5BQD5BSl?cl0?`0ZZZ?o"
"o5D5E@EEDE03loaEEAEEDEEDoolEED5EDEAEEAEEBZ5EE:5@E:5@E:?oo?oloob008o00"
"EAEEAD01EE?co5EE5EEAD03l01DE@05AE5AE5@0:XE000EEDXE1DXooloocoo8DDSlZQE"
"5EE5EE5EDoolE1DE4E5EE?oo5AE5EE5DE5DEEDZQEEAAEEBQD5BPoo3oo3olQAB?bZ5DE"
"1D5EDEE@ooaD5AD1D5EDoolE1DEE@EAD5@EEBZ5EE51ED:5@E:P000000020080:X0000"
"00000000000000000000000000000000000:X0000002XE1DZZZZZZZZZZZZZZZZZZZZZ"
"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZQD5@ZZZZZZZZZZZZZZZZZZZZZZ"
"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZX5@E@00000000000000000000000"
"00000000000000000000000000000000000000001E1EEEEEEEEEEEEEEEEEEEEEEEEEE"
"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEED5EEEEEEEEEEEEEEEEEEEEEEEEEEE"
"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE@5EEEEEEEEEEEEEEEEEEEEEEEEEEEE"
"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEED0000000000000000000000000000000"
"0000000000000000000000000000000000000";
spr.Create(203, 24);
int px = 0, py = 0;
for (size_t b = 0; b < 1624; b += 4)
{
uint32_t sym1 = (uint32_t)logo[b + 0] - 48;
uint32_t sym2 = (uint32_t)logo[b + 1] - 48;
uint32_t sym3 = (uint32_t)logo[b + 2] - 48;
uint32_t sym4 = (uint32_t)logo[b + 3] - 48;
uint32_t r = sym1 << 18 | sym2 << 12 | sym3 << 6 | sym4;
for (int i = 0; i < 12; i++)
{
olc::Pixel p = olc::RED;
switch ((r & 0xC00000) >> 22)
{
case 0: p = olc::Pixel(0, 0, 0, 255); break;
case 1: p = olc::Pixel(255, 255, 255, 255); break;
case 2: p = olc::Pixel(255, 120, 26, 255); break;
case 3: p = olc::Pixel(79, 193, 255, 255); break;
}
spr.Sprite()->SetPixel(px, py, p);
if (++px == 203) { py++; px = 0; }
r <<= 2;
}
}
spr.Decal()->Update();
vBoom.resize(spr.Sprite()->width * spr.Sprite()->height);
vScale = { float(pge->ScreenWidth()) / 500.0f, float(pge->ScreenWidth()) / 500.0f };
fAspect = float(pge->ScreenWidth()) / float(pge->ScreenHeight());
vPosition = olc::vf2d(
(250 - spr.Sprite()->width) / 2.0f,
(250 - spr.Sprite()->height) / 2.0f / fAspect);
for (int y = 0; y < spr.Sprite()->height; y++)
for (int x = 0; x < spr.Sprite()->width; x++)
vBoom[y * spr.Sprite()->width + x] = std::make_pair(
vPosition + olc::vf2d(x, y),
olc::vf2d(
(float(rand()) / float(RAND_MAX)) * 10.0f - 5.0f,
(float(rand()) / float(RAND_MAX)) * 10.0f - 5.0f)
);
}
bool SplashScreen::OnBeforeUserUpdate(float& fElapsedTime)
{
if (bComplete) return false;
fParticleTime += fElapsedTime;
for (int y = 0; y < spr.Sprite()->height; y++)
for (int x = 0; x < spr.Sprite()->width; x++)
{
if (fParticleTime < 1.0f)
{
}
else if (fParticleTime < 2.0f)
{
vBoom[y * spr.Sprite()->width + x].first =
olc::vf2d(
(250 - spr.Sprite()->width) / 2.0f + float(x),
(250 - spr.Sprite()->height) / 2.0f / fAspect + float(y)
) +
olc::vf2d(
(float(rand()) / float(RAND_MAX)) * 0.5f - 0.25f,
(float(rand()) / float(RAND_MAX)) * 0.5f - 0.25f);
}
else if(fParticleTime < 5.0f)
{
vBoom[y * spr.Sprite()->width + x].first += vBoom[y * spr.Sprite()->width + x].second * fElapsedTime * 20.0f;
}
else
{
bComplete = true;
}
pge->DrawPartialDecal(vScale * vBoom[y * spr.Sprite()->width + x].first * 2.0f, spr.Decal(), olc::vf2d(x, y), { 1, 1 }, vScale * 2.0f, olc::PixelF(1.0f, 1.0f, 1.0f, std::min(1.0f, std::max(4.0f - fParticleTime, 0.0f))));
}
olc::vi2d vSize = pge->GetTextSizeProp("Copyright OneLoneCoder.com 2022");
pge->DrawStringPropDecal(olc::vf2d(float(pge->ScreenWidth()/2) - vSize.x/2, float(pge->ScreenHeight()) - vSize.y * 3.0f), "Copyright OneLoneCoder.com 2022", olc::PixelF(1.0f, 1.0f, 1.0f, 0.5f), olc::vf2d(1.0, 2.0f));
return true;
}
}
#endif
Loading…
Cancel
Save