|
|
|
@ -8,6 +8,22 @@ |
|
|
|
|
|
|
|
|
|
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: |
|
|
|
@ -22,6 +38,8 @@ public: |
|
|
|
|
float neggPos[2] = {}; |
|
|
|
|
float*badNeggs=NULL; |
|
|
|
|
int badNeggCount=0; |
|
|
|
|
TailData*tail=NULL; |
|
|
|
|
int tailSize=0; |
|
|
|
|
|
|
|
|
|
void assignNeggRandomPos() { |
|
|
|
|
do { |
|
|
|
@ -61,11 +79,18 @@ public: |
|
|
|
|
void init() { |
|
|
|
|
srand(432189); |
|
|
|
|
assignNeggRandomPos(); |
|
|
|
|
if (badNeggs!=NULL) { |
|
|
|
|
free(badNeggs); |
|
|
|
|
} |
|
|
|
|
if (badNeggs!=NULL) {free(badNeggs);} |
|
|
|
|
if (tail!=NULL) { |
|
|
|
|
for (int i=0;i<tailSize;i++) { |
|
|
|
|
free(tail[i].future_direction); |
|
|
|
|
free(tail[i].pos); |
|
|
|
|
free(tail[i].frameCount); |
|
|
|
|
} |
|
|
|
|
free(tail);} |
|
|
|
|
badNeggs=(float*)malloc(sizeof(float)*0); |
|
|
|
|
tail=(TailData*)malloc(sizeof(TailData)*0); |
|
|
|
|
badNeggCount=0; |
|
|
|
|
tailSize=0; |
|
|
|
|
meercaPos[0]=240; |
|
|
|
|
meercaPos[1]=240; |
|
|
|
|
meercaSpd[0]=0; |
|
|
|
@ -79,10 +104,6 @@ public: |
|
|
|
|
SetPixelMode(olc::Pixel::ALPHA); |
|
|
|
|
ConsoleCaptureStdOut(true); |
|
|
|
|
Clear(olc::DARK_CYAN); |
|
|
|
|
|
|
|
|
|
for (int i=0;i<5000;i++) { |
|
|
|
|
spawnBadNegg(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Called once at the start, so create things here
|
|
|
|
|
return true; |
|
|
|
@ -90,6 +111,7 @@ public: |
|
|
|
|
|
|
|
|
|
bool OnUserUpdate(float fElapsedTime) override |
|
|
|
|
{ |
|
|
|
|
Clear(olc::DARK_CYAN); |
|
|
|
|
accumulatedTime+=fElapsedTime; |
|
|
|
|
while (accumulatedTime>=UPDATE_RATE) { |
|
|
|
|
accumulatedTime-=UPDATE_RATE; |
|
|
|
@ -98,21 +120,41 @@ public: |
|
|
|
|
if (GetKey(olc::F1).bPressed) { |
|
|
|
|
ConsoleShow(olc::F1,false); |
|
|
|
|
} |
|
|
|
|
if (GetKey(olc::W).bPressed) { |
|
|
|
|
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) { |
|
|
|
|
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) { |
|
|
|
|
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) { |
|
|
|
|
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) { |
|
|
|
@ -130,6 +172,10 @@ public: |
|
|
|
|
for (int i=0;i<badNeggCount;i++) { |
|
|
|
|
DrawRotatedDecal({badNeggs[i*2],badNeggs[i*2+1]},badnegg,0,{16,16},{1,1}); |
|
|
|
|
} |
|
|
|
|
for (int i=0;i<tailSize;i++) { |
|
|
|
|
TailData t = tail[i]; |
|
|
|
|
DrawCircle({t.pos[0],t.pos[1]},8); |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -139,6 +185,30 @@ public: |
|
|
|
|
|
|
|
|
|
if (abs(meercaPos[0]-neggPos[0])<8&&abs(meercaPos[1]-neggPos[1])<8) { |
|
|
|
|
assignNeggRandomPos(); |
|
|
|
|
tail=(TailData*)realloc(tail,sizeof(TailData)*++tailSize); |
|
|
|
|
tail[tailSize-1].future_direction = (char*)malloc(sizeof(char)*TAIL_DISTANCE); |
|
|
|
|
tail[tailSize-1].pos = (int*)malloc(sizeof(int)*2); |
|
|
|
|
tail[tailSize-1].frameCount = (int*)malloc(sizeof(int)*TAIL_DISTANCE); |
|
|
|
|
if (meercaSpd[0]==moveSpd) { |
|
|
|
|
tail[tailSize-1].direction=RIGHT; |
|
|
|
|
} else
|
|
|
|
|
if (meercaSpd[0]==-moveSpd) { |
|
|
|
|
tail[tailSize-1].direction=LEFT; |
|
|
|
|
} else
|
|
|
|
|
if (meercaSpd[1]==moveSpd) { |
|
|
|
|
tail[tailSize-1].direction=DOWN; |
|
|
|
|
} else
|
|
|
|
|
if (meercaSpd[1]==-moveSpd) { |
|
|
|
|
tail[tailSize-1].direction=UP; |
|
|
|
|
} |
|
|
|
|
tail[tailSize-1].pos[0]=meercaPos[0]; |
|
|
|
|
tail[tailSize-1].pos[1]=meercaPos[1]; |
|
|
|
|
for (int i=0;i<TAIL_DISTANCE;i++) { |
|
|
|
|
tail[tailSize-1].frameCount[i]=-1; |
|
|
|
|
tail[tailSize-1].future_direction[i]=-1; |
|
|
|
|
} |
|
|
|
|
tail[tailSize-1].waitTime=TAIL_DISTANCE*tailSize; |
|
|
|
|
tail[tailSize-1].futureIndex=0; |
|
|
|
|
if ((float)rand()/(float)RAND_MAX<0.6) { |
|
|
|
|
spawnBadNegg(); |
|
|
|
|
} |
|
|
|
@ -148,6 +218,39 @@ public: |
|
|
|
|
init(); |
|
|
|
|
}
|
|
|
|
|
} |
|
|
|
|
for (int i=0;i<tailSize;i++) { |
|
|
|
|
if (tail[i].waitTime>0) { |
|
|
|
|
tail[i].waitTime--; |
|
|
|
|
} else { |
|
|
|
|
for (int j=0;j<TAIL_DISTANCE;j++) { |
|
|
|
|
if (tail[i].frameCount[j]>=0) { |
|
|
|
|
tail[i].frameCount[j]--; |
|
|
|
|
if (tail[i].frameCount[j]==-1) { |
|
|
|
|
tail[i].direction=tail[i].future_direction[j]; |
|
|
|
|
if (i+1<tailSize) { |
|
|
|
|
tail[i+1].future_direction[tail[i+1].futureIndex]=tail[i].future_direction[j]; |
|
|
|
|
tail[i+1].frameCount[tail[i+1].futureIndex]=TAIL_DISTANCE; |
|
|
|
|
tail[i+1].futureIndex=(tail[i+1].futureIndex+1)%TAIL_DISTANCE; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
switch (tail[i].direction) { |
|
|
|
|
case UP:{ |
|
|
|
|
tail[i].pos[1]-=moveSpd; |
|
|
|
|
}break; |
|
|
|
|
case RIGHT:{ |
|
|
|
|
tail[i].pos[0]+=moveSpd; |
|
|
|
|
}break; |
|
|
|
|
case LEFT:{ |
|
|
|
|
tail[i].pos[0]-=moveSpd; |
|
|
|
|
}break; |
|
|
|
|
case DOWN:{ |
|
|
|
|
tail[i].pos[1]+=moveSpd; |
|
|
|
|
}break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|