generated from sigonasr2/CPlusPlusProjectTemplate
Block sorting and bugfixing matching algorithm
Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
parent
d090c24aeb
commit
4745003c88
@ -16,16 +16,22 @@ void BlockClump::addBlock(vf2d offset,BlockColor color){
|
|||||||
blocks.push_back(Block(offset,color));
|
blocks.push_back(Block(offset,color));
|
||||||
}
|
}
|
||||||
|
|
||||||
void BlockClump::addBlockOnTopOf(int col,BlockColor color){
|
void BlockClump::addBlockOnTopOf(int col,BlockColor color,int defaultY){
|
||||||
int highestY=999999;
|
int highestY=999999;
|
||||||
for (Block&b:blocks) {
|
for (Block&b:blocks) {
|
||||||
if (b.pos.x/12==col&&b.pos.y<=highestY) {
|
if (b.pos.x/12==col&&b.pos.y<=highestY) {
|
||||||
highestY=b.pos.y;
|
highestY=b.pos.y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
addBlock(col,(highestY==999999)?0:highestY/12-1,color);
|
addBlock(col,(highestY==999999)?defaultY/12:highestY/12-1,color);
|
||||||
}
|
}
|
||||||
|
|
||||||
vf2d BlockClump::getBlockPosition(Block&b){
|
vf2d BlockClump::getBlockPosition(Block&b){
|
||||||
return {b.pos.x,b.pos.y+y};
|
return {b.pos.x,b.pos.y+y};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BlockClump::sortBlocks(){
|
||||||
|
std::sort(blocks.begin(),blocks.end(),[](Block&b1,Block&b2){
|
||||||
|
return b1.pos.y>b2.pos.y;
|
||||||
|
});
|
||||||
|
}
|
@ -16,8 +16,9 @@ class BlockClump{
|
|||||||
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);
|
||||||
void addBlock(vf2d offset,BlockColor color);
|
void addBlock(vf2d offset,BlockColor color);
|
||||||
void addBlockOnTopOf(int col,BlockColor color);
|
void addBlockOnTopOf(int col,BlockColor color,int defaultY);
|
||||||
//Get a block's position relative to this block clump.
|
//Get a block's position relative to this block clump.
|
||||||
vf2d getBlockPosition(Block&b);
|
vf2d getBlockPosition(Block&b);
|
||||||
|
void sortBlocks();
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
@ -12,6 +12,11 @@ Board::Board(vi2d boardSize,float gravity,float maxGravity,float launchSpd,float
|
|||||||
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[3].push_back({{3*12,6*12},BlockColor::RED});
|
||||||
|
cols[4].push_back({{4*12,8*12},BlockColor::RED});
|
||||||
|
cols[4].push_back({{4*12,7*12},BlockColor::RED});
|
||||||
|
cols[4].push_back({{4*12,6*12},BlockColor::RED});
|
||||||
|
cols[5].push_back({{5*12,6*12},BlockColor::RED});
|
||||||
}
|
}
|
||||||
|
|
||||||
void Board::spawnBlock(int col){
|
void Board::spawnBlock(int col){
|
||||||
@ -73,7 +78,9 @@ void Board::convertClump(int ind){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (BlockClump&bc:clumpsToAdd) {
|
for (BlockClump&bc:clumpsToAdd) {
|
||||||
|
bc.sortBlocks();
|
||||||
clumps.push_back(bc);
|
clumps.push_back(bc);
|
||||||
|
|
||||||
}
|
}
|
||||||
removeClump(ind);
|
removeClump(ind);
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
29
main.cpp
29
main.cpp
@ -17,6 +17,7 @@ bool Meteos::OnUserCreate()
|
|||||||
coinFlip=std::uniform_int_distribution<>(0, 1);
|
coinFlip=std::uniform_int_distribution<>(0, 1);
|
||||||
|
|
||||||
gameBoard=Board({10,14},20.f,100.f,-60.f,1.0f,{3,0,0,0,0,0,0,0,0,0},SPRITES["blocks_test.png"]);
|
gameBoard=Board({10,14},20.f,100.f,-60.f,1.0f,{3,0,0,0,0,0,0,0,0,0},SPRITES["blocks_test.png"]);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,9 +129,9 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
|
|||||||
if (i==j)continue;
|
if (i==j)continue;
|
||||||
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
|
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
|
||||||
found=true;
|
found=true;
|
||||||
std::cout<<"Found match @ ("<<checkX<<","<<checkY<<") Block ("<<b2.pos<<")"<<b2.addedToLaunchList<<std::endl;
|
|
||||||
checkX+=12;
|
checkX+=12;
|
||||||
tempMatchIDsX.push_back(j);
|
tempMatchIDsX.push_back(j);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}while(found);
|
}while(found);
|
||||||
@ -144,9 +145,9 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
|
|||||||
if (i==j)continue;
|
if (i==j)continue;
|
||||||
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
|
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
|
||||||
found=true;
|
found=true;
|
||||||
std::cout<<"Found match @ ("<<checkX<<","<<checkY<<") Block ("<<b2.pos<<")"<<b2.addedToLaunchList<<std::endl;
|
|
||||||
checkX-=12;
|
checkX-=12;
|
||||||
tempMatchIDsX.push_back(j);
|
tempMatchIDsX.push_back(j);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}while(found);
|
}while(found);
|
||||||
@ -160,9 +161,9 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
|
|||||||
if (i==j)continue;
|
if (i==j)continue;
|
||||||
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
|
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
|
||||||
found=true;
|
found=true;
|
||||||
std::cout<<"Found match @ ("<<checkX<<","<<checkY<<") Block ("<<b2.pos<<")"<<b2.addedToLaunchList<<std::endl;
|
|
||||||
checkY-=12;
|
checkY-=12;
|
||||||
tempMatchIDsY.push_back(j);
|
tempMatchIDsY.push_back(j);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}while(found);
|
}while(found);
|
||||||
@ -176,9 +177,9 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
|
|||||||
if (i==j)continue;
|
if (i==j)continue;
|
||||||
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
|
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
|
||||||
found=true;
|
found=true;
|
||||||
std::cout<<"Found match @ ("<<checkX<<","<<checkY<<") Block ("<<b2.pos<<")"<<b2.addedToLaunchList<<std::endl;
|
|
||||||
checkY+=12;
|
checkY+=12;
|
||||||
tempMatchIDsY.push_back(j);
|
tempMatchIDsY.push_back(j);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}while(found);
|
}while(found);
|
||||||
@ -205,7 +206,6 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
|
|||||||
}
|
}
|
||||||
for (int i:matchedBlockIDs) {
|
for (int i:matchedBlockIDs) {
|
||||||
Block&b=c.getBlocks()[i];
|
Block&b=c.getBlocks()[i];
|
||||||
std::cout<<"Launch Block ("<<b.pos<<")"<<b.addedToLaunchList<<std::endl;
|
|
||||||
b.col=BlockColor::LAUNCHED;
|
b.col=BlockColor::LAUNCHED;
|
||||||
c.vspeed=gameBoard.launchSpd;
|
c.vspeed=gameBoard.launchSpd;
|
||||||
}
|
}
|
||||||
@ -234,9 +234,9 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
|
|||||||
Block&b2=gameBoard.getBlocks(i+checkX)[k];
|
Block&b2=gameBoard.getBlocks(i+checkX)[k];
|
||||||
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==b.pos.x+checkX*12&&b2.pos.y==checkY) {
|
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==b.pos.x+checkX*12&&b2.pos.y==checkY) {
|
||||||
found=true;
|
found=true;
|
||||||
std::cout<<"Found match @ ("<<checkX*12<<","<<checkY<<") Block ("<<b2.pos<<")"<<b2.addedToLaunchList<<std::endl;
|
|
||||||
tempMatchIDsX.push_back({i+checkX,k});
|
tempMatchIDsX.push_back({i+checkX,k});
|
||||||
checkX++;
|
checkX++;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -251,9 +251,9 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
|
|||||||
Block&b2=gameBoard.getBlocks(i+checkX)[k];
|
Block&b2=gameBoard.getBlocks(i+checkX)[k];
|
||||||
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==b.pos.x+checkX*12&&b2.pos.y==checkY) {
|
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==b.pos.x+checkX*12&&b2.pos.y==checkY) {
|
||||||
found=true;
|
found=true;
|
||||||
std::cout<<"Found match @ ("<<checkX*12<<","<<checkY<<") Block ("<<b2.pos<<")"<<b2.addedToLaunchList<<std::endl;
|
|
||||||
tempMatchIDsX.push_back({i+checkX,k});
|
tempMatchIDsX.push_back({i+checkX,k});
|
||||||
checkX--;
|
checkX--;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -268,9 +268,9 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
|
|||||||
if (j==k)continue;
|
if (j==k)continue;
|
||||||
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
|
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
|
||||||
found=true;
|
found=true;
|
||||||
std::cout<<"Found match @ ("<<checkX<<","<<checkY<<") Block ("<<b2.pos<<")"<<b2.addedToLaunchList<<std::endl;
|
|
||||||
checkY-=12;
|
checkY-=12;
|
||||||
tempMatchIDsY.push_back({i,k});
|
tempMatchIDsY.push_back({i,k});
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}while(found);
|
}while(found);
|
||||||
@ -284,9 +284,9 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
|
|||||||
if (j==k)continue;
|
if (j==k)continue;
|
||||||
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
|
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
|
||||||
found=true;
|
found=true;
|
||||||
std::cout<<"Found match @ ("<<checkX<<","<<checkY<<") Block ("<<b2.pos<<")"<<b2.addedToLaunchList<<std::endl;
|
|
||||||
checkY+=12;
|
checkY+=12;
|
||||||
tempMatchIDsY.push_back({i,k});
|
tempMatchIDsY.push_back({i,k});
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}while(found);
|
}while(found);
|
||||||
@ -314,13 +314,14 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
|
|||||||
if (matchedBlockIDs.size()>0) {
|
if (matchedBlockIDs.size()>0) {
|
||||||
BlockClump c;
|
BlockClump c;
|
||||||
bool firstBlock=true;
|
bool firstBlock=true;
|
||||||
|
int baseBlockPos;
|
||||||
for (std::pair<int,int>&info:matchedBlockIDs) {
|
for (std::pair<int,int>&info:matchedBlockIDs) {
|
||||||
Block&b=gameBoard.getBlocks(info.first)[info.second];
|
Block&b=gameBoard.getBlocks(info.first)[info.second];
|
||||||
if (firstBlock) {
|
if (firstBlock) {
|
||||||
c.y=b.pos.y-1;
|
baseBlockPos=b.pos.y;
|
||||||
|
c.y=baseBlockPos-1;
|
||||||
firstBlock=false;
|
firstBlock=false;
|
||||||
}
|
}
|
||||||
std::cout<<"Launch Block ("<<b.pos<<")"<<b.addedToLaunchList<<std::endl;
|
|
||||||
b.col=BlockColor::LAUNCHED;
|
b.col=BlockColor::LAUNCHED;
|
||||||
c.vspeed=gameBoard.launchSpd;
|
c.vspeed=gameBoard.launchSpd;
|
||||||
}
|
}
|
||||||
@ -328,7 +329,11 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
|
|||||||
Block&b=gameBoard.getBlocks(info.first)[info.second];
|
Block&b=gameBoard.getBlocks(info.first)[info.second];
|
||||||
for (Block&b2:gameBoard.getBlocks(b.pos.x/12)) {
|
for (Block&b2:gameBoard.getBlocks(b.pos.x/12)) {
|
||||||
if (!b2.markedForRemoval&&b2.pos.y<=b.pos.y) {
|
if (!b2.markedForRemoval&&b2.pos.y<=b.pos.y) {
|
||||||
c.addBlockOnTopOf(b.pos.x/12,b2.col);
|
if (b.pos.x==b2.pos.x&&b.pos.y==b2.pos.y){
|
||||||
|
c.addBlockOnTopOf(b.pos.x/12,b2.col,b2.pos.y-baseBlockPos);
|
||||||
|
} else {
|
||||||
|
c.addBlockOnTopOf(b.pos.x/12,b2.col,0);
|
||||||
|
}
|
||||||
b2.markedForRemoval=true;
|
b2.markedForRemoval=true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user