Fixed a major bug with sliding around blocks and causing invalid flicks

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
master
sigonasr2 2 years ago
parent 36b189dc50
commit 67485b006d
  1. 14
      Board.cpp
  2. BIN
      C++ProjectTemplate
  3. 39
      main.cpp

@ -21,15 +21,15 @@ maxWarningLevel(maxWarningLevel){
BlockClump newClump; BlockClump newClump;
BlockClump newClump2; BlockClump newClump2;
newClump.addBlock(2,0,BlockColor::WHITE); newClump.addBlock(2,0,BlockColor::WHITE);
newClump.addBlock(1,0,BlockColor::WHITE); newClump.addBlock(1,0,BlockColor::BLUE);
newClump.addBlock(0,0,BlockColor::WHITE); newClump.addBlock(0,0,BlockColor::GREEN);
newClump.addBlock(2,-1,BlockColor::RED); newClump.addBlock(2,-1,BlockColor::RED);
newClump.addBlock(3,-1,BlockColor::RED); newClump.addBlock(3,-1,BlockColor::LIGHT);
newClump2.addBlock(4,0,BlockColor::WHITE); newClump2.addBlock(4,0,BlockColor::DARK);
newClump2.addBlock(5,0,BlockColor::WHITE); newClump2.addBlock(5,0,BlockColor::SOUL);
newClump2.addBlock(6,0,BlockColor::WHITE); newClump2.addBlock(6,0,BlockColor::TIME);
newClump2.addBlock(7,0,BlockColor::BLUE); newClump2.addBlock(7,0,BlockColor::BLUE);
newClump2.addBlock(4,-1,BlockColor::RED); newClump2.addBlock(4,-1,BlockColor::GREEN);
newClump2.addBlock(5,-1,BlockColor::RED); newClump2.addBlock(5,-1,BlockColor::RED);
newClump.y=100; newClump.y=100;
newClump2.y=100; newClump2.y=100;

Binary file not shown.

@ -57,13 +57,13 @@ void Meteos::handleInput(){
Block&b=gameBoard.getBlocks(mouseCol)[y]; Block&b=gameBoard.getBlocks(mouseCol)[y];
if (b.pos.y/12==mouseRow){ if (b.pos.y/12==mouseRow){
SelectedBlockData newData={mouseCol,y,-1}; SelectedBlockData newData={mouseCol,y,-1};
if (gameBoard.selectedBlock.col!=-1&&mouseCol==gameBoard.selectedBlock.col){ if (gameBoard.selectedBlock.col!=-1&&mouseCol==gameBoard.selectedBlock.col&&newData.col==mouseCol){
//See if these two can be swapped. //See if these two can be swapped.
Block&b1=gameBoard.getBlock(gameBoard.selectedBlock); Block&b1=gameBoard.getBlock(gameBoard.selectedBlock);
Block&b2=gameBoard.getBlock(newData); Block&b2=gameBoard.getBlock(newData);
int y1=(gameBoard.selectedBlock.c!=-1)?gameBoard.getBlockClumps()[gameBoard.selectedBlock.c].getBlockPosition(gameBoard.getBlockClumps()[gameBoard.selectedBlock.c].getBlocks()[gameBoard.selectedBlock.ind]).y:gameBoard.getBlocks(gameBoard.selectedBlock.col)[gameBoard.selectedBlock.ind].pos.y; int y1=(gameBoard.selectedBlock.c!=-1)?gameBoard.getBlockClumps()[gameBoard.selectedBlock.c].getBlockPosition(gameBoard.getBlockClumps()[gameBoard.selectedBlock.c].getBlocks()[gameBoard.selectedBlock.ind]).y:gameBoard.getBlocks(gameBoard.selectedBlock.col)[gameBoard.selectedBlock.ind].pos.y;
int y2=(newData.c!=-1)?gameBoard.getBlockClumps()[newData.c].getBlockPosition(gameBoard.getBlockClumps()[newData.c].getBlocks()[newData.ind]).y:gameBoard.getBlocks(newData.col)[newData.ind].pos.y; int y2=(newData.c!=-1)?gameBoard.getBlockClumps()[newData.c].getBlockPosition(gameBoard.getBlockClumps()[newData.c].getBlocks()[newData.ind]).y:gameBoard.getBlocks(newData.col)[newData.ind].pos.y;
if (b1.pos.x==b2.pos.x&&std::abs(y1-y2)<=12){ if (b1.pos.x==b2.pos.x&&std::abs(y1-y2)<=12&&&b1!=&b2){
//Swap the two! //Swap the two!
BlockColor tempCol=b1.col; BlockColor tempCol=b1.col;
b1.col=b2.col; b1.col=b2.col;
@ -78,7 +78,7 @@ void Meteos::handleInput(){
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];
if (b.pos.x/12==mouseCol&&c.getBlockPosition(b).y<=mouseY&&c.getBlockPosition(b).y+12>=mouseY){ if (b.pos.x/12==mouseCol&&c.getBlockPosition(b).y<=mouseY&&c.getBlockPosition(b).y+12>mouseY){
SelectedBlockData newData={mouseCol,j,i}; SelectedBlockData newData={mouseCol,j,i};
if (gameBoard.selectedBlock.col!=-1&&mouseCol==gameBoard.selectedBlock.col){ if (gameBoard.selectedBlock.col!=-1&&mouseCol==gameBoard.selectedBlock.col){
//See if these two can be swapped. //See if these two can be swapped.
@ -86,7 +86,7 @@ void Meteos::handleInput(){
Block&b2=gameBoard.getBlock(newData); Block&b2=gameBoard.getBlock(newData);
int y1=(gameBoard.selectedBlock.c!=-1)?gameBoard.getBlockClumps()[gameBoard.selectedBlock.c].getBlockPosition(gameBoard.getBlockClumps()[gameBoard.selectedBlock.c].getBlocks()[gameBoard.selectedBlock.ind]).y:gameBoard.getBlocks(gameBoard.selectedBlock.col)[gameBoard.selectedBlock.ind].pos.y; int y1=(gameBoard.selectedBlock.c!=-1)?gameBoard.getBlockClumps()[gameBoard.selectedBlock.c].getBlockPosition(gameBoard.getBlockClumps()[gameBoard.selectedBlock.c].getBlocks()[gameBoard.selectedBlock.ind]).y:gameBoard.getBlocks(gameBoard.selectedBlock.col)[gameBoard.selectedBlock.ind].pos.y;
int y2=(newData.c!=-1)?gameBoard.getBlockClumps()[newData.c].getBlockPosition(gameBoard.getBlockClumps()[newData.c].getBlocks()[newData.ind]).y:gameBoard.getBlocks(newData.col)[newData.ind].pos.y; int y2=(newData.c!=-1)?gameBoard.getBlockClumps()[newData.c].getBlockPosition(gameBoard.getBlockClumps()[newData.c].getBlocks()[newData.ind]).y:gameBoard.getBlocks(newData.col)[newData.ind].pos.y;
if (b1.pos.x==b2.pos.x&&std::abs(y1-y2)<=12){ if (b1.pos.x==b2.pos.x&&std::abs(y1-y2)<=12&&&b1!=&b2){
//Swap the two! //Swap the two!
BlockColor tempCol=b1.col; BlockColor tempCol=b1.col;
b1.col=b2.col; b1.col=b2.col;
@ -98,9 +98,18 @@ void Meteos::handleInput(){
} }
} }
} }
found:;
} }
if (gameBoard.selectedBlock.c==-1&&gameBoard.selectedBlock.col!=-1&&gameBoard.boardSize.y-mouseRow>gameBoard.getBlocks(gameBoard.selectedBlock.col).size()&&gameBoard.getBlocks(gameBoard.selectedBlock.col)[gameBoard.selectedBlock.ind].pos.y>12){ found:
if (gameBoard.selectedBlock.c==-1&&gameBoard.selectedBlock.col!=-1&&mouseRow<gameBoard.boardSize.y&&gameBoard.selectedBlock.ind==gameBoard.getBlocks(gameBoard.selectedBlock.col).size()-1&&gameBoard.boardSize.y-mouseRow>gameBoard.getBlocks(gameBoard.selectedBlock.col).size()&&gameBoard.getBlocks(gameBoard.selectedBlock.col)[gameBoard.selectedBlock.ind].pos.y>12){
for (int i=0;i<gameBoard.getBlockClumps().size();i++){
BlockClump&c=gameBoard.getBlockClumps()[i];
for (int j=0;j<c.getBlocks().size();j++){
Block&b=c.getBlocks()[j];
if (b.pos.x/12==gameBoard.selectedBlock.col&&gameBoard.getBlocks(gameBoard.selectedBlock.col)[gameBoard.selectedBlock.ind].pos.y-b.pos.y<=12){
goto notAllowed;
}
}
}
//Fling the block upwards. //Fling the block upwards.
BlockClump newClump; BlockClump newClump;
Block&targetBlock=gameBoard.getBlocks(gameBoard.selectedBlock.col)[gameBoard.selectedBlock.ind]; Block&targetBlock=gameBoard.getBlocks(gameBoard.selectedBlock.col)[gameBoard.selectedBlock.ind];
@ -113,6 +122,7 @@ void Meteos::handleInput(){
gameBoard.removeBlock(gameBoard.selectedBlock.col,gameBoard.selectedBlock.ind); gameBoard.removeBlock(gameBoard.selectedBlock.col,gameBoard.selectedBlock.ind);
gameBoard.selectedBlock={-1,-1,-1}; gameBoard.selectedBlock={-1,-1,-1};
} }
notAllowed:;
} }
if (GetMouse(0).bReleased){ if (GetMouse(0).bReleased){
gameBoard.selectedBlock={-1,-1,-1}; gameBoard.selectedBlock={-1,-1,-1};
@ -123,7 +133,7 @@ void Meteos::spawnBlocks(float fElapsedTime){
lastBlockSpawn+=fElapsedTime; lastBlockSpawn+=fElapsedTime;
if (lastBlockSpawn>=gameBoard.spawnRate){ if (lastBlockSpawn>=gameBoard.spawnRate){
lastBlockSpawn-=gameBoard.spawnRate; lastBlockSpawn-=gameBoard.spawnRate;
gameBoard.spawnBlock(randBlockPos(gen)); //gameBoard.spawnBlock(randBlockPos(gen));
} }
} }
@ -745,11 +755,9 @@ void Meteos::matchGroundedBlocks(){
assert(false); assert(false);
} }
c.addBlock(b2.pos.x/12,((int)gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y-(int)baseBlockPos.y)/12,b2.col); c.addBlock(b2.pos.x/12,((int)gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y-(int)baseBlockPos.y)/12,b2.col);
std::cout<<"Added block @"<<b2.pos.x/12<<((int)gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y-(int)baseBlockPos.y)/12<<std::endl; //std::cout<<"Added block @"<<b2.pos.x/12<<((int)gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y-(int)baseBlockPos.y)/12<<std::endl;
gameBoard.getBlockClumps()[info.c].removeBlock(i); gameBoard.getBlockClumps()[info.c].removeBlock(i);
} }
} else {
std::cout<<"Blocks already added elsewhere"<<std::endl;
} }
} else { } else {
Block&b=gameBoard.getBlocks(info.col)[info.ind]; Block&b=gameBoard.getBlocks(info.col)[info.ind];
@ -762,7 +770,7 @@ void Meteos::matchGroundedBlocks(){
assert(false); assert(false);
} }
c.addBlock(info.col,((int)b2.pos.y-(int)baseBlockPos.y)/12,b2.col); c.addBlock(info.col,((int)b2.pos.y-(int)baseBlockPos.y)/12,b2.col);
std::cout<<"Added block @"<<info.col<<((int)b2.pos.y-(int)baseBlockPos.y)/12<<std::endl; //std::cout<<"Added block @"<<info.col<<((int)b2.pos.y-(int)baseBlockPos.y)/12<<std::endl;
//b2.markedForRemoval=true; //b2.markedForRemoval=true;
gameBoard.removeBlock(info.col,i); gameBoard.removeBlock(info.col,i);
} }
@ -804,13 +812,13 @@ void Meteos::cleanupBlocks(){
score+=BONUS_ATTACK_SCORE; score+=BONUS_ATTACK_SCORE;
} }
} }
std::cout<<"Removed block @"<<b.pos<<" from clump "<<i<<std::endl; //std::cout<<"Removed block @"<<b.pos<<" from clump "<<i<<std::endl;
c.removeBlock(j); c.removeBlock(j);
} }
} }
c.y+=c.vspeed; c.y+=c.vspeed;
if (c.getBlocks().size()<=0) { if (c.getBlocks().size()<=0) {
std::cout<<"Block Clump "<<i<<" is empty. Removing."<<std::endl; //std::cout<<"Block Clump "<<i<<" is empty. Removing."<<std::endl;
gameBoard.removeClump(i); gameBoard.removeClump(i);
continue; continue;
} }
@ -914,7 +922,7 @@ void Meteos::updateGame(float fElapsedTime){
tempDisplayScore/=10; tempDisplayScore/=10;
displayScoreDigits.insert(displayScoreDigits.begin(),digit); displayScoreDigits.insert(displayScoreDigits.begin(),digit);
} }
std::cout<<std::endl; //std::cout<<std::endl;
int marker=0; int marker=0;
while (marker<targetScoreDigits.size()||marker<displayScoreDigits.size()){ while (marker<targetScoreDigits.size()||marker<displayScoreDigits.size()){
int targetScoreDigit=marker<targetScoreDigits.size()?targetScoreDigits[targetScoreDigits.size()-1-marker]:0; int targetScoreDigit=marker<targetScoreDigits.size()?targetScoreDigits[targetScoreDigits.size()-1-marker]:0;
@ -974,6 +982,9 @@ void Meteos::drawGame(float fElapsedTime,bool debugView){
if (accumulatedScore>0){ if (accumulatedScore>0){
DrawStringDecal(gameBoard.drawOffset+vi2d{0,-8}+vi2d{1,1},"+"+std::to_string(accumulatedScore),BLACK,{0.75,0.75}); DrawStringDecal(gameBoard.drawOffset+vi2d{0,-8}+vi2d{1,1},"+"+std::to_string(accumulatedScore),BLACK,{0.75,0.75});
DrawStringDecal(gameBoard.drawOffset+vi2d{0,-8},"+"+std::to_string(accumulatedScore),frameTime%5>2?Pixel{224, 184, 148}:WHITE,{0.75,0.75}); DrawStringDecal(gameBoard.drawOffset+vi2d{0,-8},"+"+std::to_string(accumulatedScore),frameTime%5>2?Pixel{224, 184, 148}:WHITE,{0.75,0.75});
GradientFillRectDecal(gameBoard.drawOffset+vi2d{gameBoard.boardSize.x*12+16,0}, {32,32}, BLACK, VERY_DARK_GREEN, VERY_DARK_GREEN, BLACK);
DrawRectDecal(gameBoard.drawOffset+vi2d{gameBoard.boardSize.x*12+16,0}, {32,32}, DARK_YELLOW);
DrawStringDecal(gameBoard.drawOffset+vi2d{gameBoard.boardSize.x*12+16,8},std::to_string(blocksInAttackQueue),{66, 125, 92});
} }
} }

Loading…
Cancel
Save