#define OLC_PGE_APPLICATION #include "pixelGameEngine.h" #include #define boolean char #define true 1 #define false 0 using namespace std; #define UP 0 #define RIGHT 1 #define DOWN 2 #define LEFT 3 #define TAIL_DISTANCE 4 struct TailData{ char direction = 0; char*future_direction; int*pos; int*frameCount; int waitTime = 0; char futureIndex=0; }; class MeercaChase : public olc::PixelGameEngine { public: olc::Decal*meerca,*negg,*badnegg; const float UPDATE_RATE = 0.016666667f; const int NEGG_BOUNDARY=6; float accumulatedTime = 0.0f; int frameCount=0; int moveSpd=4; float meercaSpd[2] = {0,0}; float meercaPos[2] = {240,240}; float*meercaPreviousPos=NULL; float neggPos[2] = {}; float*badNeggs=NULL; int badNeggCount=0; int tailSize=0; int score=0; boolean justTouched=false; void assignNeggRandomPos() { do { neggPos[0]=(float)rand()/(float)RAND_MAX*(480-NEGG_BOUNDARY*2)+NEGG_BOUNDARY; neggPos[1]=(float)rand()/(float)RAND_MAX*(480-NEGG_BOUNDARY*2)+NEGG_BOUNDARY; } while(!positionFree(neggPos)); } void spawnBadNegg() { badNeggs=(float*)realloc(badNeggs,sizeof(float)*(++badNeggCount*2)); do { badNeggs[badNeggCount*2-2] = (float)rand()/(float)RAND_MAX*(480-NEGG_BOUNDARY*2)+NEGG_BOUNDARY; badNeggs[badNeggCount*2-1] = (float)rand()/(float)RAND_MAX*(480-NEGG_BOUNDARY*2)+NEGG_BOUNDARY; } while(!positionFree(badNeggs+(badNeggCount*2-2),true)); } boolean positionFree(float*pos) { return positionFree(pos,false); } boolean positionFree(float*pos,boolean badNegg) { if (badNegg&&abs(pos[0]-neggPos[0])<4&&abs(pos[1]-neggPos[1])<4) { return false; } if (abs(pos[0]-meercaPos[0])<64&&abs(pos[1]-meercaPos[1])<64) { return false; } for (int i=0;i<((badNegg)?badNeggCount-1:badNeggCount);i++) { if (abs(pos[0]-badNeggs[i*2])<4&&abs(pos[1]-badNeggs[i*2+1])<4) { return false; } } return true; } MeercaChase() { sAppName = "Meerca Chase"; init(); } void init() { srand(432189); assignNeggRandomPos(); if (badNeggs!=NULL) {free(badNeggs);} if (meercaPreviousPos!=NULL) { free(meercaPreviousPos); } badNeggs=(float*)malloc(sizeof(float)*0); meercaPreviousPos=(float*)malloc(sizeof(float)*0); badNeggCount=0; tailSize=0; score=0; meercaPos[0]=240; meercaPos[1]=240; meercaSpd[0]=0; meercaSpd[1]=0; } bool OnUserCreate() override { meerca = new olc::Decal(new olc::Sprite("assets/meerca.png")); negg = new olc::Decal(new olc::Sprite("assets/negg.png")); badnegg = new olc::Decal(new olc::Sprite("assets/badnegg.png")); SetPixelMode(olc::Pixel::ALPHA); ConsoleCaptureStdOut(true); Clear(olc::DARK_CYAN); // Called once at the start, so create things here return true; } bool OnUserUpdate(float fElapsedTime) override { Clear(olc::DARK_CYAN); accumulatedTime+=fElapsedTime; while (accumulatedTime>=UPDATE_RATE) { accumulatedTime-=UPDATE_RATE; updateGame(); //DO NOT ADD THINGS HERE. USE updateGame()! } if (GetKey(olc::F1).bPressed) { ConsoleShow(olc::F1,false); } if (GetKey(olc::W).bPressed&&(meercaSpd[0]+meercaSpd[1]==0||meercaSpd[0]!=0)) { meercaSpd[0]=0; meercaSpd[1]=-moveSpd; } if (GetKey(olc::A).bPressed&&(meercaSpd[0]+meercaSpd[1]==0||meercaSpd[1]!=0)) { meercaSpd[0]=-moveSpd; meercaSpd[1]=0; } if (GetKey(olc::D).bPressed&&(meercaSpd[0]+meercaSpd[1]==0||meercaSpd[1]!=0)) { meercaSpd[0]=moveSpd; meercaSpd[1]=0; } if (GetKey(olc::S).bPressed&&(meercaSpd[0]+meercaSpd[1]==0||meercaSpd[0]!=0)) { meercaSpd[0]=0; meercaSpd[1]=moveSpd; } // called once per frame if (meercaSpd[0]==moveSpd) { DrawRotatedDecal({meercaPos[0],meercaPos[1]},meerca,M_PI_2,{16,16}); } else if (meercaSpd[0]==-moveSpd) { DrawRotatedDecal({meercaPos[0],meercaPos[1]},meerca,M_PI_2*3,{16,16}); } else if (meercaSpd[1]==moveSpd) { DrawRotatedDecal({meercaPos[0],meercaPos[1]},meerca,M_PI,{16,16}); } else { DrawRotatedDecal({meercaPos[0],meercaPos[1]},meerca,0,{16,16}); } DrawRotatedDecal({neggPos[0],neggPos[1]},negg,0,{16,16},{1.5,1.5},olc::YELLOW); for (int i=0;i=0;i-=2) { if (i==0) { meercaPreviousPos[i]=meercaPos[0]; meercaPreviousPos[i+1]=meercaPos[1]; } else { meercaPreviousPos[i]=meercaPreviousPos[i-2]; meercaPreviousPos[i+1]=meercaPreviousPos[i-1]; } } meercaPos[0]+=meercaSpd[0]; meercaPos[1]+=meercaSpd[1]; if (abs(meercaPos[0]-neggPos[0])<8&&abs(meercaPos[1]-neggPos[1])<8) { assignNeggRandomPos(); tailSize++; score++; justTouched=true; meercaPreviousPos=(float*)realloc(meercaPreviousPos,sizeof(float)*tailSize*8); for (int i=0;i<8;i+=2) { meercaPreviousPos[(tailSize-1)*8+i]=meercaPos[0]; meercaPreviousPos[(tailSize-1)*8+i+1]=meercaPos[1]; } if ((float)rand()/(float)RAND_MAX<0.6) { spawnBadNegg(); } } for (int i=0;i