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.
SmarterPointerExample/SmartPointerExample/RawPointerExample.cpp

134 lines
3.2 KiB

#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;
}