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.
134 lines
3.2 KiB
134 lines
3.2 KiB
1 year ago
|
#define OLC_PGE_APPLICATION
|
||
|
#include "olcPixelGameEngine.h"
|
||
|
|
||
|
using namespace olc;
|
||
|
|
||
|
#define PI 3.14159
|
||
|
|
||
|
// Override base class with your custom functionality
|
||
|
class SmartPointerExample : public olc::PixelGameEngine
|
||
|
{
|
||
|
struct Object{
|
||
|
vf2d pos;
|
||
|
Renderable&r;
|
||
|
Pixel col;
|
||
|
float radius;
|
||
|
float dir;
|
||
|
vf2d spd;
|
||
|
bool friendly=false;
|
||
|
bool dead=false;
|
||
|
const float friction=100;
|
||
|
Object(vf2d pos,Renderable&r,Pixel col,float radius,float dir)
|
||
|
:pos(pos),r(r),col(col),radius(radius),dir(dir){};
|
||
|
virtual void Collision(Object&collisionObj){};
|
||
|
void InternalUpdate(SmartPointerExample*pge,float fElapsedTime){
|
||
|
pos+=spd*fElapsedTime;
|
||
|
if(spd.x>0){
|
||
|
spd.x=std::max(0.f,spd.x-friction*fElapsedTime);
|
||
|
} else {
|
||
|
spd.x=std::min(0.f,spd.x+friction*fElapsedTime);
|
||
|
}
|
||
|
if(spd.y>0){
|
||
|
spd.y=std::max(0.f,spd.y-friction*fElapsedTime);
|
||
|
} else {
|
||
|
spd.y=std::min(0.f,spd.y+friction*fElapsedTime);
|
||
|
}
|
||
|
if(spd.x!=0||spd.y!=0){
|
||
|
vf2d normSpd = spd.norm();
|
||
|
dir=atan2(normSpd.y,normSpd.x);
|
||
|
}
|
||
|
}
|
||
|
virtual void Update(SmartPointerExample * pge, float fElapsedTime){}
|
||
|
virtual void Draw(SmartPointerExample*pge){
|
||
|
pge->DrawRotatedDecal(pos,r.Decal(),dir,r.Sprite()->Size()/2,{1,1},col);
|
||
|
};
|
||
|
};
|
||
|
struct Player:Object{
|
||
|
Player(vf2d pos,Renderable&r,Pixel col,float radius,float dir)
|
||
|
:Object(pos,r,col,radius,dir){
|
||
|
friendly=true;
|
||
|
}
|
||
|
void Collision(Object&collisionObj)override{
|
||
|
if(!collisionObj.friendly){
|
||
|
collisionObj.dead=true;
|
||
|
}
|
||
|
}
|
||
|
void Update(SmartPointerExample*pge,float fElapsedTime)override{
|
||
|
if(pge->GetKey(UP).bHeld){
|
||
|
spd.y=-32;
|
||
|
}
|
||
|
if(pge->GetKey(DOWN).bHeld){
|
||
|
spd.y=32;
|
||
|
}
|
||
|
if(pge->GetKey(RIGHT).bHeld){
|
||
|
spd.x=32;
|
||
|
}
|
||
|
if(pge->GetKey(LEFT).bHeld){
|
||
|
spd.x=-32;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
struct Enemy:Object{
|
||
|
Enemy(vf2d pos,Renderable&r,Pixel col,float radius,float dir)
|
||
|
:Object(pos,r,col,radius,dir){
|
||
|
friendly=false;
|
||
|
}
|
||
|
void Update(SmartPointerExample*pge,float fElapsedTime)override{
|
||
|
|
||
|
}
|
||
|
};
|
||
|
|
||
|
std::vector<Object*>objects;
|
||
|
|
||
|
public:
|
||
|
SmartPointerExample()
|
||
|
{
|
||
|
// Name your application
|
||
|
sAppName = "Smart Pointer Example";
|
||
|
}
|
||
|
|
||
|
Renderable player_img;
|
||
|
Renderable enemy_img;
|
||
|
|
||
|
public:
|
||
|
bool OnUserCreate() override
|
||
|
{
|
||
|
player_img.Load("assets/player.png");
|
||
|
// Called once at the start, so create things here
|
||
|
objects.push_back(new Player({32,32},player_img,GREEN,8,0));
|
||
|
objects.push_back(new Enemy({64,128},player_img,DARK_RED,8,PI/2));
|
||
|
objects.push_back(new Enemy({96,164},player_img,DARK_RED,8,1.75*PI));
|
||
|
objects.push_back(new Enemy({32,196},player_img,DARK_RED,8,1.25*PI));
|
||
|
objects.push_back(new Enemy({72,220},player_img,DARK_RED,8,PI/8));
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool OnUserUpdate(float fElapsedTime) override
|
||
|
{
|
||
|
for(Object*o:objects){
|
||
|
for(Object*o2:objects){
|
||
|
if(o!=o2){
|
||
|
auto dist = [&](vf2d pos1,vf2d pos2){return sqrt(pow(pos1.x-pos2.x,2)+pow(pos1.y-pos2.y,2));};
|
||
|
if(dist(o->pos,o2->pos)<o->radius+o2->radius){
|
||
|
o->Collision(*o2);
|
||
|
o2->Collision(*o);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
o->Update(this,fElapsedTime);
|
||
|
o->InternalUpdate(this,fElapsedTime);
|
||
|
o->Draw(this);
|
||
|
}
|
||
|
|
||
|
std::erase_if(objects,[&](Object*o){return o->dead;});
|
||
|
return true;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
int main()
|
||
|
{
|
||
|
SmartPointerExample demo;
|
||
|
if (demo.Construct(256, 240, 4, 4))
|
||
|
demo.Start();
|
||
|
return 0;
|
||
|
}
|