diff --git a/Block.h b/Block.h index d6d343a..cd4db12 100644 --- a/Block.h +++ b/Block.h @@ -21,6 +21,7 @@ class Block{ vf2d pos; BlockColor col; bool markedForDeletion=false; + bool markedForRemoval=false; Block(vf2d pos,BlockColor col) :pos(pos),col(col){} }; diff --git a/BlockClump.cpp b/BlockClump.cpp index eb1e662..d448142 100644 --- a/BlockClump.cpp +++ b/BlockClump.cpp @@ -16,6 +16,16 @@ void BlockClump::addBlock(vf2d offset,BlockColor color){ blocks.push_back(Block(offset,color)); } +void BlockClump::addBlockOnTopOf(int col,BlockColor color){ + int highestY=999999; + for (Block&b:blocks) { + if (b.pos.x/12==col&&b.pos.y<=highestY) { + highestY=b.pos.y; + } + } + addBlock(col,(highestY==999999)?0:highestY/12-1,color); +} + vf2d BlockClump::getBlockPosition(Block&b){ return {b.pos.x,b.pos.y+y}; } \ No newline at end of file diff --git a/BlockClump.h b/BlockClump.h index 86ff460..96b19f1 100644 --- a/BlockClump.h +++ b/BlockClump.h @@ -16,6 +16,7 @@ class BlockClump{ void addBlock(int col,BlockColor color); void addBlock(int col,int row,BlockColor color); void addBlock(vf2d offset,BlockColor color); + void addBlockOnTopOf(int col,BlockColor color); //Get a block's position relative to this block clump. vf2d getBlockPosition(Block&b); }; diff --git a/Board.cpp b/Board.cpp index f304ef6..0637771 100644 --- a/Board.cpp +++ b/Board.cpp @@ -21,6 +21,10 @@ void Board::spawnBlock(int col){ clumps.push_back(c); } +void Board::addClump(BlockClump&c){ + clumps.push_back(c); +} + std::vector&Board::getBlocks(int col){ return cols[col]; } @@ -77,4 +81,8 @@ BlockColor ColorDistributor::getRandomColor(){ } } return BlockColor::WHITE; +} + +void Board::removeBlock(int col,int ind){ + cols[col].erase(cols[col].begin()+ind); } \ No newline at end of file diff --git a/Board.h b/Board.h index c1f9af6..3a245b8 100644 --- a/Board.h +++ b/Board.h @@ -44,9 +44,11 @@ class Board{ Board(); Board(vi2d boardSize,float gravity,float maxGravity,float launchSpd,float spawnRate,std::array colorRates,Renderable&tileset); void spawnBlock(int col); + void addClump(BlockClump&c); std::vector&getBlocks(int col); std::vector&getBlockClumps(); void convertClump(int ind); void removeClump(int ind); + void removeBlock(int col,int ind); }; #endif \ No newline at end of file diff --git a/C++ProjectTemplate b/C++ProjectTemplate index 5c9ad01..51640d1 100755 Binary files a/C++ProjectTemplate and b/C++ProjectTemplate differ diff --git a/main.cpp b/main.cpp index f763355..e24c935 100644 --- a/main.cpp +++ b/main.cpp @@ -16,7 +16,7 @@ bool Meteos::OnUserCreate() randBlockPos=std::uniform_int_distribution<>(0, 9); coinFlip=std::uniform_int_distribution<>(0, 1); - gameBoard=Board({10,14},20.f,100.f,-20.f,1.0f,{3,3,2,3,2,0,0,0,0,0},SPRITES["blocks_test.png"]); + gameBoard=Board({10,14},20.f,100.f,-20.f,1.0f,{3,0,0,0,0,0,0,0,0,0},SPRITES["blocks_test.png"]); return true; } @@ -185,8 +185,99 @@ bool Meteos::OnUserUpdate(float fElapsedTime) } } for (int i=0;imatchedBlocksX; + std::vectormatchedBlocksY; + matchedBlocksX.push_back(&b); + matchedBlocksY.push_back(&b); + rightCheckGrounded: + float checkX=targetX+12; + float checkY=targetY; + do{ + found=false; + for (Block&b2:gameBoard.getBlocks(i)){ + if (b.pos.x==b2.pos.x&&b.pos.y==b2.pos.y)continue; + if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) { + found=true; + checkX+=12; + matchedBlocksX.push_back(&b2); + } + } + }while(found); + leftCheckGrounded: + checkX=targetX-12; + checkY=targetY; + do{ + found=false; + for (Block&b2:gameBoard.getBlocks(i)){ + if (b.pos.x==b2.pos.x&&b.pos.y==b2.pos.y)continue; + if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) { + found=true; + checkX-=12; + matchedBlocksX.push_back(&b2); + } + } + }while(found); + upCheckGrounded: + checkX=targetX; + checkY=targetY-12; + do{ + found=false; + for (Block&b2:gameBoard.getBlocks(i)){ + if (b.pos.x==b2.pos.x&&b.pos.y==b2.pos.y)continue; + if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) { + found=true; + checkY-=12; + matchedBlocksY.push_back(&b2); + } + } + }while(found); + downCheckGrounded: + checkX=targetX; + checkY=targetY+12; + do{ + found=false; + for (Block&b2:gameBoard.getBlocks(i)){ + if (b.pos.x==b2.pos.x&&b.pos.y==b2.pos.y)continue; + if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) { + found=true; + checkY+=12; + matchedBlocksY.push_back(&b2); + } + } + }while(found); + if (matchedBlocksX.size()>2||matchedBlocksY.size()>2) { + BlockClump c; + c.y=b.pos.y-1; + if (matchedBlocksX.size()>2) { + for (Block*b2:matchedBlocksX) { + b2->col=BlockColor::LAUNCHED; + c.addBlockOnTopOf(b2->pos.x/12,b2->col); + b2->markedForRemoval=true; + } + c.vspeed=gameBoard.launchSpd; + } + if (matchedBlocksY.size()>2) { + for (int i=0;icol=BlockColor::LAUNCHED; + c.addBlockOnTopOf(b2->pos.x/12,b2->col); + b2->markedForRemoval=true; + } + c.vspeed=gameBoard.launchSpd; + } + gameBoard.addClump(c); + } + } for (int y=0;y