#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 neggPos[2] = {}; float*badNeggs=NULL; int badNeggCount=0; TailData*tail=NULL; int tailSize=0; 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 (tail!=NULL) { for (int i=0;i=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 (tailSize>0) { tail[0].future_direction[tail[0].futureIndex]=UP; tail[0].frameCount[tail[0].futureIndex]=TAIL_DISTANCE; tail[0].futureIndex=(tail[0].futureIndex+1)%TAIL_DISTANCE; } } if (GetKey(olc::A).bPressed&&(meercaSpd[0]+meercaSpd[1]==0||meercaSpd[1]!=0)) { meercaSpd[0]=-moveSpd; meercaSpd[1]=0; if (tailSize>0) { tail[0].future_direction[tail[0].futureIndex]=LEFT; tail[0].frameCount[tail[0].futureIndex]=TAIL_DISTANCE; tail[0].futureIndex=(tail[0].futureIndex+1)%TAIL_DISTANCE; } } if (GetKey(olc::D).bPressed&&(meercaSpd[0]+meercaSpd[1]==0||meercaSpd[1]!=0)) { meercaSpd[0]=moveSpd; meercaSpd[1]=0; if (tailSize>0) { tail[0].future_direction[tail[0].futureIndex]=RIGHT; tail[0].frameCount[tail[0].futureIndex]=TAIL_DISTANCE; tail[0].futureIndex=(tail[0].futureIndex+1)%TAIL_DISTANCE; } } if (GetKey(olc::S).bPressed&&(meercaSpd[0]+meercaSpd[1]==0||meercaSpd[0]!=0)) { meercaSpd[0]=0; meercaSpd[1]=moveSpd; if (tailSize>0) { tail[0].future_direction[tail[0].futureIndex]=DOWN; tail[0].frameCount[tail[0].futureIndex]=TAIL_DISTANCE; tail[0].futureIndex=(tail[0].futureIndex+1)%TAIL_DISTANCE; } } // 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;i0) { tail[i].waitTime--; } else { for (int j=0;j=0) { tail[i].frameCount[j]--; if (tail[i].frameCount[j]==-1) { tail[i].direction=tail[i].future_direction[j]; if (i+1