Fixed the block column block overlapping issues!

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
master
sigonasr2 2 years ago
parent 2bb304ccec
commit c3dc478839
  1. 6
      BlockClump.cpp
  2. 2
      BlockClump.h
  3. 2
      Board.cpp
  4. BIN
      C++ProjectTemplate
  5. 3
      Meteos.h
  6. 107
      main.cpp

@ -1,5 +1,11 @@
#include "gameDefines.h" #include "gameDefines.h"
extern Meteos*game;
BlockClump::BlockClump(){
blocks.reserve(game->gameBoard.boardSize.x*game->gameBoard.boardSize.y);
}
std::vector<Block>&BlockClump::getBlocks(){ std::vector<Block>&BlockClump::getBlocks(){
return blocks; return blocks;
} }

@ -12,7 +12,7 @@ class BlockClump{
float landTime=0.f; float landTime=0.f;
float launchTime=0.f; float launchTime=0.f;
float y=0; float y=0;
BlockClump(){} BlockClump();
std::vector<Block>&getBlocks(); std::vector<Block>&getBlocks();
void addBlock(int col,BlockColor color); void addBlock(int col,BlockColor color);
void addBlock(int col,int row,BlockColor color); void addBlock(int col,int row,BlockColor color);

@ -11,7 +11,9 @@ Board::Board(vi2d boardSize,float gravity,float maxGravity,float launchSpd,float
yBottom=(boardSize.y-1)*12; yBottom=(boardSize.y-1)*12;
for (int i=0;i<boardSize.x;i++) { for (int i=0;i<boardSize.x;i++) {
cols.push_back(std::vector<Block>()); cols.push_back(std::vector<Block>());
cols[i].reserve(boardSize.y+10);
} }
clumps.reserve(100);
} }
void Board::spawnBlock(int col){ void Board::spawnBlock(int col){

Binary file not shown.

@ -14,11 +14,12 @@ class Meteos : public olc::PixelGameEngine{
std::uniform_int_distribution<> randBlockPos,coinFlip; std::uniform_int_distribution<> randBlockPos,coinFlip;
std::mt19937 gen; std::mt19937 gen;
Board gameBoard; Board gameBoard;
bool gameCanRun=true;
std::map<std::string,Renderable> SPRITES; std::map<std::string,Renderable> SPRITES;
bool OnUserCreate()override; bool OnUserCreate()override;
void updateGame(float fElapsedTime); void updateGame(float fElapsedTime);
void handleInput(); void handleInput();
void drawGame(float fElapsedTime); void drawGame(float fElapsedTime,bool debugView);
bool OnUserUpdate(float fElapsedTime)override; bool OnUserUpdate(float fElapsedTime)override;
}; };
#endif #endif

@ -19,7 +19,7 @@ bool Meteos::OnUserCreate()
SPRITES["blocks_test.png"].Load("assets/blocks_test.png"); SPRITES["blocks_test.png"].Load("assets/blocks_test.png");
std::random_device rd; //Will be used to obtain a seed for the random number engine std::random_device rd; //Will be used to obtain a seed for the random number engine
gen=std::mt19937(rd()); //Standard mersenne_twister_engine seeded with rd() gen=std::mt19937(0); //Standard mersenne_twister_engine seeded with rd()
randBlockPos=std::uniform_int_distribution<>(0, 9); randBlockPos=std::uniform_int_distribution<>(0, 9);
coinFlip=std::uniform_int_distribution<>(0, 1); coinFlip=std::uniform_int_distribution<>(0, 1);
@ -30,13 +30,15 @@ bool Meteos::OnUserCreate()
bool Meteos::OnUserUpdate(float fElapsedTime) bool Meteos::OnUserUpdate(float fElapsedTime)
{ {
accumulatedTime+=fElapsedTime; if (gameCanRun){
if (accumulatedTime>=1/60.0f) { accumulatedTime+=fElapsedTime;
updateGame(1/60.0f); if (accumulatedTime>=1/60.0f) {
accumulatedTime=0; updateGame(1/60.0f);
accumulatedTime=0;
}
handleInput();
} }
handleInput(); drawGame(fElapsedTime,!gameCanRun);
drawGame(fElapsedTime);
return true; return true;
} }
@ -52,7 +54,7 @@ void Meteos::updateGame(float fElapsedTime){
lastBlockSpawn-=gameBoard.spawnRate; lastBlockSpawn-=gameBoard.spawnRate;
gameBoard.spawnBlock(randBlockPos(gen)); gameBoard.spawnBlock(randBlockPos(gen));
} }
for (int i=0;i<gameBoard.getBlockClumps().size();i++){ for (int i=gameBoard.getBlockClumps().size()-1;i>=0;i--){
BlockClump&c=gameBoard.getBlockClumps()[i]; BlockClump&c=gameBoard.getBlockClumps()[i];
if (c.launchTime>0) { if (c.launchTime>0) {
c.launchTime-=fElapsedTime; c.launchTime-=fElapsedTime;
@ -62,12 +64,12 @@ void Meteos::updateGame(float fElapsedTime){
if (c.vspeed>gameBoard.maxGravity){ if (c.vspeed>gameBoard.maxGravity){
c.vspeed=gameBoard.maxGravity; c.vspeed=gameBoard.maxGravity;
} }
for (int j=0;j<gameBoard.getBlockClumps().size();j++) { for (int j=gameBoard.getBlockClumps().size()-1;j>=0;j--) {
if (i==j) continue; if (i==j) continue;
BlockClump&c2=gameBoard.getBlockClumps()[j]; BlockClump&c2=gameBoard.getBlockClumps()[j];
for (int k=0;k<c2.getBlocks().size();k++) { for (int k=c2.getBlocks().size()-1;k>=0;k--) {
Block&b2=c2.getBlocks()[k]; Block&b2=c2.getBlocks()[k];
for (int l=0;l<c.getBlocks().size();l++) { for (int l=c.getBlocks().size()-1;l>=0;l--) {
Block&b3=c.getBlocks()[l]; Block&b3=c.getBlocks()[l];
if (c2.getBlockPosition(b2).x==c.getBlockPosition(b3).x&& if (c2.getBlockPosition(b2).x==c.getBlockPosition(b3).x&&
c2.getBlockPosition(b2).y+12>=c.getBlockPosition(b3).y&& c2.getBlockPosition(b2).y+12>=c.getBlockPosition(b3).y&&
@ -96,6 +98,14 @@ void Meteos::updateGame(float fElapsedTime){
for (int m=0;m<c2.getBlocks().size();m++) { for (int m=0;m<c2.getBlocks().size();m++) {
Block&b4=c2.getBlocks()[m]; Block&b4=c2.getBlocks()[m];
bool exists=false; bool exists=false;
for (int n=0;n<c.getBlocks().size();n++){
if ((c.getBlocks()[n].pos.x)/12==(b4.pos.x)/12&&(c.getBlocks()[n].pos.y)/12==(c2.getBlockPosition(b4).y-c.y)/12){
std::cout<<"WARNING! Block overlapping detected at "<<c.getBlocks()[n].pos<<"!"<<std::endl;
exists=true;
blockCount--;
break;
}
}
if (!exists){ if (!exists){
c.addBlock(b4.pos.x/12,(c2.getBlockPosition(b4).y-c.y)/12,b4.col); c.addBlock(b4.pos.x/12,(c2.getBlockPosition(b4).y-c.y)/12,b4.col);
} }
@ -114,7 +124,10 @@ void Meteos::updateGame(float fElapsedTime){
} }
} }
} }
assert(!overlappingBlocks); if (overlappingBlocks){
gameCanRun=false;
return;
}
if (overlappingBlocks){ if (overlappingBlocks){
std::cout<<"Block b3 "<<b3.pos<<"!"<<std::endl; std::cout<<"Block b3 "<<b3.pos<<"!"<<std::endl;
} }
@ -129,7 +142,7 @@ void Meteos::updateGame(float fElapsedTime){
if (i>=j){ if (i>=j){
i--; i--;
} }
gameBoard.removeClump(j--); gameBoard.removeClump(j);
goto nextClumpCollisionCheck; goto nextClumpCollisionCheck;
} }
} }
@ -145,7 +158,7 @@ void Meteos::updateGame(float fElapsedTime){
c.y-=c.getBlockPosition(b).y+12-b2.pos.y; c.y-=c.getBlockPosition(b).y+12-b2.pos.y;
c.vspeed=0; c.vspeed=0;
if (c.landTime>=gameBoard.landTime) { if (c.landTime>=gameBoard.landTime) {
gameBoard.convertClump(i--); gameBoard.convertClump(i);
} else { } else {
c.landTime+=fElapsedTime; c.landTime+=fElapsedTime;
} }
@ -156,7 +169,7 @@ void Meteos::updateGame(float fElapsedTime){
c.y-=c.getBlockPosition(b).y-gameBoard.yBottom; c.y-=c.getBlockPosition(b).y-gameBoard.yBottom;
c.vspeed=0; c.vspeed=0;
if (c.landTime>=gameBoard.landTime) { if (c.landTime>=gameBoard.landTime) {
gameBoard.convertClump(i--); gameBoard.convertClump(i);
} else { } else {
c.landTime+=fElapsedTime; c.landTime+=fElapsedTime;
} }
@ -308,7 +321,7 @@ void Meteos::updateGame(float fElapsedTime){
Block&b2=c.getBlocks()[l]; Block&b2=c.getBlocks()[l];
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==b.pos.x+checkX*12&&c.getBlockPosition(b2).y==checkY){ if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==b.pos.x+checkX*12&&c.getBlockPosition(b2).y==checkY){
found=true; found=true;
tempMatchIDsX.push_back({-1,l,k}); tempMatchIDsX.push_back({(int)(b2.pos.x/12),l,k});
checkX++; checkX++;
goto outercheck2; goto outercheck2;
} }
@ -340,7 +353,7 @@ void Meteos::updateGame(float fElapsedTime){
Block&b2=c.getBlocks()[l]; Block&b2=c.getBlocks()[l];
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==b.pos.x+checkX*12&&c.getBlockPosition(b2).y==checkY){ if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==b.pos.x+checkX*12&&c.getBlockPosition(b2).y==checkY){
found=true; found=true;
tempMatchIDsX.push_back({-1,l,k}); tempMatchIDsX.push_back({(int)(b2.pos.x/12),l,k});
checkX--; checkX--;
goto outercheck3; goto outercheck3;
} }
@ -373,7 +386,7 @@ void Meteos::updateGame(float fElapsedTime){
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&c.getBlockPosition(b2).x==checkX&&c.getBlockPosition(b2).y==checkY){ if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&c.getBlockPosition(b2).x==checkX&&c.getBlockPosition(b2).y==checkY){
found=true; found=true;
checkY-=12; checkY-=12;
tempMatchIDsY.push_back({-1,l,k}); tempMatchIDsY.push_back({(int)(b2.pos.x/12),l,k});
goto outercheck4; goto outercheck4;
} }
} }
@ -404,7 +417,7 @@ void Meteos::updateGame(float fElapsedTime){
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&c.getBlockPosition(b2).x==checkX&&c.getBlockPosition(b2).y==checkY){ if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&c.getBlockPosition(b2).x==checkX&&c.getBlockPosition(b2).y==checkY){
found=true; found=true;
checkY+=12; checkY+=12;
tempMatchIDsY.push_back({-1,l,k}); tempMatchIDsY.push_back({(int)(b2.pos.x/12),l,k});
goto outercheck1; goto outercheck1;
} }
} }
@ -477,51 +490,66 @@ void Meteos::updateGame(float fElapsedTime){
} }
for (BlockMatchingInfo&info:matchedBlockIDs) { for (BlockMatchingInfo&info:matchedBlockIDs) {
if (info.c!=-1){ if (info.c!=-1){
Block&b=gameBoard.getBlockClumps()[info.c].getBlocks()[info.ind]; if (gameBoard.getBlockClumps()[info.c].getBlocks().size()>0){
for (Block&b2:gameBoard.getBlockClumps()[info.c].getBlocks()){ for (int i=gameBoard.getBlockClumps()[info.c].getBlocks().size()-1;i>=0;i--) {
if (!b2.markedForRemoval&&b.pos.x==b2.pos.x&&gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y<=gameBoard.getBlockClumps()[info.c].getBlockPosition(b).y){ Block&b2=gameBoard.getBlockClumps()[info.c].getBlocks()[i];
c.addBlock(b.pos.x/12,(gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y-baseBlockPos)/12,b2.col); if ((int)fmod(std::abs((int)gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y-(int)baseBlockPos),12)!=0){
b2.markedForRemoval=true; std::cout<<"Difference is not equal to 0! Value:"<<(int)fmod(std::abs((int)gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y-(int)baseBlockPos),12)<<" "<<gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y<<"//"<<baseBlockPos<<std::endl;
assert(false);
}
c.addBlock(b2.pos.x/12,((int)gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y-(int)baseBlockPos)/12,b2.col);
std::cout<<"Added block @"<<b2.pos.x/12<<((int)gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y-(int)baseBlockPos)/12<<std::endl;
gameBoard.getBlockClumps()[info.c].removeBlock(i);
} }
} else {
std::cout<<"Blocks already added elsewhere"<<std::endl;
} }
b.markedForRemoval=true;
} else { } else {
Block&b=gameBoard.getBlocks(info.col)[info.ind]; Block&b=gameBoard.getBlocks(info.col)[info.ind];
for (Block&b2:gameBoard.getBlocks(b.pos.x/12)) { int yPos=b.pos.y;
if (!b2.markedForRemoval&&b2.pos.y<=b.pos.y) { for (int i=gameBoard.getBlocks(info.col).size()-1;i>=0;i--){
c.addBlock(b.pos.x/12,(b2.pos.y-baseBlockPos)/12,b2.col); Block&b2=gameBoard.getBlocks(info.col)[i];
b2.markedForRemoval=true; if (b2.pos.y<=yPos){
if ((int)fmod((int)b2.pos.y-(int)baseBlockPos,12)!=0){
std::cout<<"Difference is not equal to 0! Value:"<<(int)fmod((int)b2.pos.y-(int)baseBlockPos,12)<<" "<<b2.pos.y<<"//"<<baseBlockPos<<std::endl;
assert(false);
}
c.addBlock(info.col,((int)b2.pos.y-(int)baseBlockPos)/12,b2.col);
std::cout<<"Added block @"<<info.col<<((int)b2.pos.y-(int)baseBlockPos)/12<<std::endl;
//b2.markedForRemoval=true;
gameBoard.removeBlock(info.col,i);
} }
} }
b.markedForRemoval=true;
} }
} }
gameBoard.addClump(c); gameBoard.addClump(c);
gameBoard.getBlockClumps()[gameBoard.getBlockClumps().size()-1].vspeed=gameBoard.launchSpd; gameBoard.getBlockClumps()[gameBoard.getBlockClumps().size()-1].vspeed=gameBoard.launchSpd;
gameBoard.getBlockClumps()[gameBoard.getBlockClumps().size()-1].launchTime=gameBoard.launchTime; gameBoard.getBlockClumps()[gameBoard.getBlockClumps().size()-1].launchTime=gameBoard.launchTime;
} }
for (int i=0;i<gameBoard.getBlockClumps().size();i++){ //Resolve BlockClump movements. for (int i=gameBoard.getBlockClumps().size()-1;i>=0;i--){ //Resolve BlockClump movements.
BlockClump&c=gameBoard.getBlockClumps()[i]; BlockClump&c=gameBoard.getBlockClumps()[i];
for (int j=0;j<c.getBlocks().size();j++){ for (int j=c.getBlocks().size()-1;j>=0;j--){
Block&b=c.getBlocks()[j]; Block&b=c.getBlocks()[j];
b.addedToLaunchList=false; b.addedToLaunchList=false;
if (c.vspeed<0&&c.getBlockPosition(b).y<0||b.markedForRemoval){ if (c.vspeed<0&&c.getBlockPosition(b).y<0||b.markedForRemoval){
c.removeBlock(j--); std::cout<<"Removed block @"<<b.pos<<" from clump "<<i<<std::endl;
c.removeBlock(j);
break; break;
} }
} }
c.y+=c.vspeed; c.y+=c.vspeed;
if (c.getBlocks().size()<=0) { if (c.getBlocks().size()<=0) {
gameBoard.removeClump(i--); std::cout<<"Block Clump "<<i<<" is empty. Removing."<<std::endl;
gameBoard.removeClump(i);
continue; continue;
} }
} }
for (int i=0;i<gameBoard.boardSize.x;i++){ for (int i=0;i<gameBoard.boardSize.x;i++){
for (int y=0;y<gameBoard.getBlocks(i).size();y++){ for (int y=gameBoard.getBlocks(i).size()-1;y>=0;y--){
Block&b=gameBoard.getBlocks(i)[y]; Block&b=gameBoard.getBlocks(i)[y];
b.addedToLaunchList=false; b.addedToLaunchList=false;
if (b.markedForRemoval){ if (b.markedForRemoval){
gameBoard.removeBlock(i,y--); gameBoard.removeBlock(i,y);
continue; continue;
} }
} }
@ -597,7 +625,7 @@ void Meteos::updateGame(float fElapsedTime){
} }
} }
void Meteos::drawGame(float fElapsedTime){ void Meteos::drawGame(float fElapsedTime,bool debugView){
Clear(Pixel(32,32,255)); Clear(Pixel(32,32,255));
for (int x=-1;x<=gameBoard.boardSize.x;x++){ for (int x=-1;x<=gameBoard.boardSize.x;x++){
for (int y=0;y<=gameBoard.boardSize.y;y++){ for (int y=0;y<=gameBoard.boardSize.y;y++){
@ -608,17 +636,18 @@ void Meteos::drawGame(float fElapsedTime){
} }
} }
} }
int alpha=(debugView)?32:255;
for (int i=0;i<gameBoard.getBlockClumps().size();i++){ for (int i=0;i<gameBoard.getBlockClumps().size();i++){
BlockClump&c=gameBoard.getBlockClumps()[i]; BlockClump&c=gameBoard.getBlockClumps()[i];
for (int j=0;j<c.getBlocks().size();j++){ for (int j=0;j<c.getBlocks().size();j++){
Block&b=c.getBlocks()[j]; Block&b=c.getBlocks()[j];
DrawPartialDecal(c.getBlockPosition(b)+gameBoard.drawOffset,gameBoard.tileset,{(float)(int)b.col*12,0},{12,12},{1,1},gameBoard.selectedBlock.col!=-1&&gameBoard.selectedBlock.ind==j&&gameBoard.selectedBlock.c==i?GREY:WHITE); DrawPartialDecal(c.getBlockPosition(b)+gameBoard.drawOffset,gameBoard.tileset,{(float)(int)b.col*12,0},{12,12},{1,1},gameBoard.selectedBlock.col!=-1&&gameBoard.selectedBlock.ind==j&&gameBoard.selectedBlock.c==i?Pixel(GREY.r,GREY.g,GREY.b,alpha):Pixel(WHITE.r,WHITE.g,WHITE.b,alpha));
} }
} }
for (int i=0;i<gameBoard.boardSize.x;i++){ for (int i=0;i<gameBoard.boardSize.x;i++){
for (int y=0;y<gameBoard.getBlocks(i).size();y++){ for (int y=0;y<gameBoard.getBlocks(i).size();y++){
Block&b=gameBoard.getBlocks(i)[y]; Block&b=gameBoard.getBlocks(i)[y];
DrawPartialDecal(b.pos+gameBoard.drawOffset,gameBoard.tileset,{(float)(int)b.col*12,0},{12,12},{1,1},gameBoard.selectedBlock.col!=-1&&gameBoard.selectedBlock.c==-1&&gameBoard.selectedBlock.col==i&&gameBoard.selectedBlock.ind==y?GREY:WHITE); DrawPartialDecal(b.pos+gameBoard.drawOffset,gameBoard.tileset,{(float)(int)b.col*12,0},{12,12},{1,1},gameBoard.selectedBlock.col!=-1&&gameBoard.selectedBlock.c==-1&&gameBoard.selectedBlock.col==i&&gameBoard.selectedBlock.ind==y?Pixel(GREY.r,GREY.g,GREY.b,alpha):Pixel(WHITE.r,WHITE.g,WHITE.b,alpha));
} }
} }
} }

Loading…
Cancel
Save