generated from sigonasr2/CPlusPlusProjectTemplate
Add bumper colors and playfield
Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
parent
7b337b9c7c
commit
9b7f3e5d9a
File diff suppressed because one or more lines are too long
Binary file not shown.
47
main.cpp
47
main.cpp
@ -19,6 +19,9 @@ struct Line{
|
||||
vf2d startPos={};
|
||||
vf2d endPos={};
|
||||
float radius=0;
|
||||
float bounceFactor=0.8;
|
||||
float bumperLeft=0;
|
||||
float bumperRight=0;
|
||||
};
|
||||
|
||||
class MiniGolfPro : public olc::PixelGameEngine
|
||||
@ -46,27 +49,42 @@ public:
|
||||
balls.emplace_back(b);
|
||||
}
|
||||
|
||||
void AddLine(vf2d pos1,vf2d pos2,float r){
|
||||
void AddLine(vf2d pos1,vf2d pos2,float r,float bounceFactor){
|
||||
Line l;
|
||||
l.startPos=pos1;
|
||||
l.endPos=pos2;
|
||||
l.radius=r;
|
||||
l.bounceFactor=bounceFactor;
|
||||
lines.push_back(l);
|
||||
}
|
||||
|
||||
bool isLeft(Line line, vf2d point) {
|
||||
return (line.endPos.x - line.startPos.x)*(point.y - line.startPos.y) - (line.endPos.y - line.startPos.y)*(point.x - line.startPos.x) > 0;
|
||||
}
|
||||
|
||||
public:
|
||||
bool OnUserCreate() override
|
||||
{
|
||||
for (int i=0;i<20;i++){
|
||||
AddBall({float(rand()%ScreenWidth()),float(rand()%ScreenHeight())},rand()%16+2);
|
||||
}
|
||||
AddLine({12,4},{64,4},5);
|
||||
AddLine({76,4},{132,4},5);
|
||||
AddLine({12,68},{64,68},5);
|
||||
AddLine({76,68},{132,68},5);
|
||||
AddLine({4,12},{4,60},5);
|
||||
AddLine({140,12},{140,60},5);
|
||||
AddLine({0,450},{640,450},10,0.8);
|
||||
ConsoleCaptureStdOut(true);
|
||||
for(int x=0;x<320;x+=20){
|
||||
AddLine({float(x+320),(1.f/18000)*std::abs(powf(float(x),2.6f))},{x+20+320.f,(1.f/18000)*std::abs(powf(float(x+20),2.6f))},10,0.4);
|
||||
if(x<260){
|
||||
AddLine({float(-x+320),(1.f/18000)*std::abs(powf(float(x),2.6f))},{float(-x-20+320),(1.f/18000)*std::abs(powf(float(x+20),2.6f))},10,0.4);
|
||||
}
|
||||
}
|
||||
for(int x=0;x<260;x+=20){
|
||||
AddLine({float(x+320),(1.f/12000)*std::abs(powf(float(x),2.6f))+60},{x+20+320.f,(1.f/12000)*std::abs(powf(float(x+20),2.6f))+60},10,0.4);
|
||||
if(x<150){
|
||||
AddLine({float(-x+320),(1.f/12000)*std::abs(powf(float(x),2.6f))+60},{float(-x-20+320),(1.f/12000)*std::abs(powf(float(x+20),2.6f))+60},10,0.4);
|
||||
}
|
||||
}
|
||||
AddLine({640,190},{640,480},10,0.4);
|
||||
AddLine({580,220},{580,480},10,0.4);
|
||||
AddLine({60,100},{90,290},15,1.5);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -149,7 +167,7 @@ public:
|
||||
b.originalPos.x=b.pos.x;
|
||||
b.originalPos.y=b.pos.y;
|
||||
b.acc.x=-b.vel.x*0.8f;
|
||||
b.acc.y=-b.vel.y*0.8f/*+100.f //Gravity constant*/;
|
||||
b.acc.y=-b.vel.y*0.8f+100.f; //Gravity constant;
|
||||
b.vel.x+=b.acc.x*b.simTimeRemaining;
|
||||
b.vel.y+=b.acc.y*b.simTimeRemaining;
|
||||
b.pos.x+=b.vel.x*b.simTimeRemaining;
|
||||
@ -187,7 +205,7 @@ public:
|
||||
if(dist<=b.radius+l.radius){
|
||||
Ball*fakeBall=new Ball();
|
||||
fakeBall->radius=l.radius;
|
||||
fakeBall->mass=b.mass*0.8f;
|
||||
fakeBall->mass=b.mass*l.bounceFactor;
|
||||
fakeBall->pos={closestPoint.x,closestPoint.y};
|
||||
fakeBall->vel={-b.vel.x,-b.vel.y};
|
||||
fakeBalls.push_back(fakeBall);
|
||||
@ -195,6 +213,11 @@ public:
|
||||
float overlap=1.1f*(dist-b.radius-fakeBall->radius);
|
||||
b.pos.x-=overlap*(b.pos.x-fakeBall->pos.x)/dist;
|
||||
b.pos.y-=overlap*(b.pos.y-fakeBall->pos.y)/dist;
|
||||
if(isLeft(l,b.pos)){
|
||||
l.bumperLeft=1;
|
||||
} else {
|
||||
l.bumperRight=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
for(Ball&b2:balls){
|
||||
@ -253,8 +276,10 @@ public:
|
||||
vf2d normal={-(l.endPos.y-l.startPos.y),l.endPos.x-l.startPos.x};
|
||||
float dist=sqrt(normal.x*normal.x+normal.y*normal.y);
|
||||
normal/=dist;
|
||||
DrawLine(l.startPos.x+normal.x*l.radius,l.startPos.y+normal.y*l.radius,l.endPos.x+normal.x*l.radius,l.endPos.y+normal.y*l.radius);
|
||||
DrawLine(l.startPos.x-normal.x*l.radius,l.startPos.y-normal.y*l.radius,l.endPos.x-normal.x*l.radius,l.endPos.y-normal.y*l.radius);
|
||||
l.bumperLeft=std::max(0.f,l.bumperLeft-fElapsedTime);
|
||||
l.bumperRight=std::max(0.f,l.bumperRight-fElapsedTime);
|
||||
DrawLine(l.startPos.x+normal.x*l.radius,l.startPos.y+normal.y*l.radius,l.endPos.x+normal.x*l.radius,l.endPos.y+normal.y*l.radius,l.bumperLeft?RED:WHITE);
|
||||
DrawLine(l.startPos.x-normal.x*l.radius,l.startPos.y-normal.y*l.radius,l.endPos.x-normal.x*l.radius,l.endPos.y-normal.y*l.radius,l.bumperRight?BLUE:WHITE);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user