You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MiniGolfPro/main.cpp

136 lines
2.5 KiB

2 years ago
#include "pixelGameEngine.h"
using namespace olc;
#define WIDTH 640
#define HEIGHT 480
struct Ball{
vf2d pos={};
vf2d vel={};
vf2d acc={};
float radius=0;
float mass=0;
};
class MiniGolfPro : public olc::PixelGameEngine
2 years ago
{
public:
std::vector<Ball>balls;
Ball*selectedBall;
MiniGolfPro()
2 years ago
{
sAppName = "Mini Golf Pro";
}
void AddBall(vf2d pos,float r){
Ball b;
b.pos=pos;
b.radius=r;
b.mass=r*10;
balls.emplace_back(b);
2 years ago
}
public:
bool OnUserCreate() override
{
for (int i=0;i<20;i++){
AddBall({float(rand()%ScreenWidth()),float(rand()%ScreenHeight())},rand()%16+2);
}
2 years ago
return true;
}
bool OnUserUpdate(float fElapsedTime) override
{
auto DoCirclesOverlap = [](vf2d pos1, float r1, vf2d pos2, float r2){
return fabs((pos1.x - pos2.x)*(pos1.x - pos2.x) + (pos1.y - pos2.y)*(pos1.y - pos2.y)) <= (r1 + r2)*(r1 + r2);
};
auto IsPointInCircle = [](vf2d pos, float r, vf2d point){
return fabs((pos.x - point.x)*(pos.x - point.x) + (pos.y - point.y)*(pos.y - point.y)) < (r * r);
};
if (GetMouse(0).bPressed||GetMouse(1).bPressed){
selectedBall = nullptr;
for (Ball&b:balls){
if (IsPointInCircle(b.pos,b.radius,GetMousePos()))
{
selectedBall = &b;
break;
}
}
}
if(GetMouse(0).bHeld){
if(selectedBall!=nullptr){
selectedBall->pos.x=GetMouseX();
selectedBall->pos.y=GetMouseY();
}
}
if(GetMouse(0).bReleased){
selectedBall=nullptr;
}
if(GetMouse(1).bReleased){
if(selectedBall!=nullptr){
selectedBall->vel.x=5*(selectedBall->pos.x-(float)GetMouseX());
selectedBall->vel.y=5*(selectedBall->pos.y-(float)GetMouseY());
}
selectedBall=nullptr;
}
2 years ago
Clear(BLACK);
for(Ball&b:balls){
b.acc.x=-b.vel.x*0.8f;
b.acc.y=-b.vel.y*0.8f;
b.vel.x+=b.acc.x*fElapsedTime;
b.vel.y+=b.acc.y*fElapsedTime;
b.pos.x+=b.vel.x*fElapsedTime;
b.pos.y+=b.vel.y*fElapsedTime;
if(b.pos.x<0){
b.pos.x+=ScreenWidth();
}
if(b.pos.y<0){
b.pos.y+=ScreenHeight();
}
if(b.pos.x>=ScreenWidth()){
b.pos.x-=ScreenWidth();
}
if(b.pos.y>=ScreenHeight()){
b.pos.y-=ScreenHeight();
}
if(fabs(b.vel.x*b.vel.x+b.vel.y*b.vel.y)<0.01){
b.vel.x=0;
b.vel.y=0;
}
}
for(Ball&b:balls){
if(selectedBall==&b){
FillCircle(b.pos,b.radius,YELLOW);
} else {
FillCircle(b.pos,b.radius);
}
}
2 years ago
return true;
}
bool OnUserDestroy()override{
return true;
}
};
int main()
{
MiniGolfPro demo;
2 years ago
if (demo.Construct(640, 480, 4, 4))
demo.Start();
return 0;
}