2025-02-26 23:13:56 +01:00

92 lines
3.1 KiB
C++

/*THINGS TO ADD:
PARTICLE MOVEMENT TO USE SPEED INSTEAD OF ++///check
IMPLEMENT THE SLIDER
IMPLEMENT A PARTICLE COUNTER
USE DYNAMIC MEMORY
USE VEC2 CLASS//check
MAKE THEM reflect FAST AFTER TOUCHING THE POINT
*/
#include "CFactor.h"
#include <vector>
#include <random>
#include <cmath>
#include "Particle.h"
#include "focalPoint.h"
#include <algorithm>
#include <initializer_list>
#include "Settings.h"
using namespace std;
///Nush unde sa le declar asa ca le scriu aici global aca o sa avem nevoie de ele oricum
std::vector<Particle>particule;//container in care tin toate particulele de pe ecran
Settings Sett(150000,255,255,255,1000);//setari initiale ale jocului
focalPoint f(demo.GetMouseX(),demo.GetMouseY(),Sett.focalPointAttraction);//unde initializez point to follow in fct de pozitia mouseului
void Start()
{
//just the usual generate random thing
std::default_random_engine generator;
std::uniform_int_distribution<int> Xdistribution(0,2*ScreenWidth);
std::uniform_int_distribution<int> Ydistribution(0,2*ScreenHeight);
//aici umplem vectorul cu nr initial de particule din settings
auto StartParticleNumber=Sett.nr_particule;
while(StartParticleNumber)
{
Particle p(Xdistribution(generator),Ydistribution(generator));//generam random o pozitie
particule.push_back(p);//o adaugam in vector
StartParticleNumber--;//scadem din settings numarul de particule
}
}
void Update(float dt)
{
f.Update(demo.GetMouseX(),demo.GetMouseY());//la fiecare frame facem update la pozitia focal-poitului
for(int i=0; i<particule.size(); i++)
{
f.AtrractParticle(particule[i]);
/*if(particule[i].touchedFPoint) ///NOT USING THIS BUT I M KEEPING IT(THAT WHAT SHE SAID) BECAUSE IT MADE ME TOO HAPPY TO JUST DUMP IT
{
///WHAT THE HELL IT WORKS!!!!!!!!!!!!!!!!!!!!!!!!!!!!
particule[i].ResetPosition({rand()%(2*ScreenWidth),rand()%(2*ScreenHeight)});
particule[i].touchedFPoint=false;
}*/
auto DetermineDistance=[](Vec2 lhs,Vec2 rhs)->float///aici calculez shadeul. lambda e pt distanta dintre 2 pct pe care o folosesc la forumula finala
{
float deltax=(rhs.x-lhs.x)*(rhs.x-lhs.x);
float deltay=(rhs.y-lhs.y)*(rhs.y-lhs.y);
return sqrt(deltax+deltay);
};
float h= DetermineDistance(Vec2(0,0),Vec2(ScreenWidth,ScreenHeight));//diagonala ecranului,cea mai mare distanta care poate fi gasita pe un ecran.
float d=DetermineDistance(particule[i].GetPosition(),f.GetPosition());//apelam domnisoara lambda
float rat=d/h;//color ratio->rezulatul e ratie care determina distanta particulei relativ la pozitia fP ului. determina o nunata in timp real
particule[i].changeColor(Sett.redValue*rat,Sett.greenValue*rat,255-Sett.blueValue*rat*sin(rat));//just doodling around to get a nice shade
}
Draw();
}
void Draw()
{
for(int i=0; i<particule.size(); i++) //desenam particulele
PutPixel(particule[i].GetX(),particule[i].GetY(),particule[i].getColor());
}
int main()
{
Start();
StartWindow();
return 0;
}