Tail follows, but a little buggy on double collection

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
master
sigonasr2 2 years ago
parent 27a88c38bb
commit 13fd3be0f7
  1. BIN
      MeercaChase
  2. 125
      MeercaChase.cpp

Binary file not shown.

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

Loading…
Cancel
Save