generated from sigonasr2/CPlusPlusProjectTemplate
Block matching between clumps and ground blocks
Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
parent
12837487c6
commit
1daf3810c7
Binary file not shown.
154
main.cpp
154
main.cpp
@ -6,6 +6,12 @@
|
|||||||
|
|
||||||
Meteos*game;
|
Meteos*game;
|
||||||
|
|
||||||
|
struct BlockMatchingInfo{
|
||||||
|
int col;
|
||||||
|
int ind;
|
||||||
|
int c=-1;
|
||||||
|
};
|
||||||
|
|
||||||
bool Meteos::OnUserCreate()
|
bool Meteos::OnUserCreate()
|
||||||
{
|
{
|
||||||
game=this;
|
game=this;
|
||||||
@ -227,15 +233,15 @@ void Meteos::updateGame(float fElapsedTime){
|
|||||||
c.launchTime=gameBoard.launchTime;
|
c.launchTime=gameBoard.launchTime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::vector<std::pair<int,int>>matchedBlockIDs; //Col followed by index
|
std::vector<BlockMatchingInfo>matchedBlockIDs; //Col followed by index
|
||||||
for (int i=0;i<gameBoard.boardSize.x;i++){
|
for (int i=0;i<gameBoard.boardSize.x;i++){
|
||||||
for (Block&b:gameBoard.getBlocks(i)) {
|
for (Block&b:gameBoard.getBlocks(i)) {
|
||||||
b.addedToLaunchList=false;
|
b.addedToLaunchList=false;
|
||||||
}
|
}
|
||||||
for (int j=0;j<gameBoard.getBlocks(i).size();j++) {
|
for (int j=0;j<gameBoard.getBlocks(i).size();j++) {
|
||||||
Block&b=gameBoard.getBlocks(i)[j];
|
Block&b=gameBoard.getBlocks(i)[j];
|
||||||
std::vector<std::pair<int,int>>tempMatchIDsX; //Col followed by index
|
std::vector<BlockMatchingInfo>tempMatchIDsX; //Col followed by index
|
||||||
std::vector<std::pair<int,int>>tempMatchIDsY; //Col followed by index
|
std::vector<BlockMatchingInfo>tempMatchIDsY; //Col followed by index
|
||||||
float targetX=b.pos.x;
|
float targetX=b.pos.x;
|
||||||
float targetY=b.pos.y;
|
float targetY=b.pos.y;
|
||||||
bool found=false;
|
bool found=false;
|
||||||
@ -251,11 +257,26 @@ void Meteos::updateGame(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;
|
||||||
tempMatchIDsX.push_back({i+checkX,k});
|
tempMatchIDsX.push_back({(int)(i+checkX),k});
|
||||||
checkX++;
|
checkX++;
|
||||||
break;
|
goto outercheck2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (int k=0;k<gameBoard.getBlockClumps().size();k++){
|
||||||
|
BlockClump&c=gameBoard.getBlockClumps()[k];
|
||||||
|
if (c.landTime>0) {
|
||||||
|
for (int l=0;l<c.getBlocks().size();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){
|
||||||
|
found=true;
|
||||||
|
tempMatchIDsX.push_back({-1,l,k});
|
||||||
|
checkX++;
|
||||||
|
goto outercheck2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
outercheck2:;
|
||||||
}
|
}
|
||||||
}while(found);
|
}while(found);
|
||||||
leftBoardCheck:
|
leftBoardCheck:
|
||||||
@ -268,11 +289,26 @@ void Meteos::updateGame(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;
|
||||||
tempMatchIDsX.push_back({i+checkX,k});
|
tempMatchIDsX.push_back({(int)(i+checkX),k});
|
||||||
checkX--;
|
checkX--;
|
||||||
break;
|
goto outercheck3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (int k=0;k<gameBoard.getBlockClumps().size();k++){
|
||||||
|
BlockClump&c=gameBoard.getBlockClumps()[k];
|
||||||
|
if (c.landTime>0) {
|
||||||
|
for (int l=0;l<c.getBlocks().size();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){
|
||||||
|
found=true;
|
||||||
|
tempMatchIDsX.push_back({-1,l,k});
|
||||||
|
checkX--;
|
||||||
|
goto outercheck3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
outercheck3:;
|
||||||
}
|
}
|
||||||
}while(found);
|
}while(found);
|
||||||
upBoardCheck:
|
upBoardCheck:
|
||||||
@ -287,9 +323,24 @@ void Meteos::updateGame(float fElapsedTime){
|
|||||||
found=true;
|
found=true;
|
||||||
checkY-=12;
|
checkY-=12;
|
||||||
tempMatchIDsY.push_back({i,k});
|
tempMatchIDsY.push_back({i,k});
|
||||||
break;
|
goto outercheck4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (int k=0;k<gameBoard.getBlockClumps().size();k++){
|
||||||
|
BlockClump&c=gameBoard.getBlockClumps()[k];
|
||||||
|
if (c.landTime>0) {
|
||||||
|
for (int l=0;l<c.getBlocks().size();l++){
|
||||||
|
Block&b2=c.getBlocks()[l];
|
||||||
|
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&c.getBlockPosition(b2).x==checkX&&c.getBlockPosition(b2).y==checkY){
|
||||||
|
found=true;
|
||||||
|
checkY-=12;
|
||||||
|
tempMatchIDsY.push_back({-1,l,k});
|
||||||
|
goto outercheck4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
outercheck4:;
|
||||||
}while(found);
|
}while(found);
|
||||||
downBoardCheck:
|
downBoardCheck:
|
||||||
checkX=targetX;
|
checkX=targetX;
|
||||||
@ -303,27 +354,60 @@ void Meteos::updateGame(float fElapsedTime){
|
|||||||
found=true;
|
found=true;
|
||||||
checkY+=12;
|
checkY+=12;
|
||||||
tempMatchIDsY.push_back({i,k});
|
tempMatchIDsY.push_back({i,k});
|
||||||
break;
|
goto outercheck1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (int k=0;k<gameBoard.getBlockClumps().size();k++){
|
||||||
|
BlockClump&c=gameBoard.getBlockClumps()[k];
|
||||||
|
if (c.landTime>0) {
|
||||||
|
for (int l=0;l<c.getBlocks().size();l++){
|
||||||
|
Block&b2=c.getBlocks()[l];
|
||||||
|
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&c.getBlockPosition(b2).x==checkX&&c.getBlockPosition(b2).y==checkY){
|
||||||
|
found=true;
|
||||||
|
checkY+=12;
|
||||||
|
tempMatchIDsY.push_back({-1,l,k});
|
||||||
|
goto outercheck1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
outercheck1:;
|
||||||
}while(found);
|
}while(found);
|
||||||
if (tempMatchIDsX.size()>2||tempMatchIDsY.size()>2) {
|
if (tempMatchIDsX.size()>2||tempMatchIDsY.size()>2) {
|
||||||
if (tempMatchIDsX.size()>2) {
|
if (tempMatchIDsX.size()>2) {
|
||||||
for (std::pair<int,int>&info:tempMatchIDsX) {
|
for (BlockMatchingInfo&info:tempMatchIDsX) {
|
||||||
Block&bb=gameBoard.getBlocks(info.first)[info.second];
|
if (info.c!=-1) {
|
||||||
if (!bb.addedToLaunchList) {
|
BlockClump&c=gameBoard.getBlockClumps()[info.c];
|
||||||
|
Block&bb=c.getBlocks()[info.ind];
|
||||||
|
if (!bb.addedToLaunchList){
|
||||||
bb.addedToLaunchList=true;
|
bb.addedToLaunchList=true;
|
||||||
matchedBlockIDs.push_back(info);
|
matchedBlockIDs.push_back(info);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
Block&bb=gameBoard.getBlocks(info.col)[info.ind];
|
||||||
|
if (!bb.addedToLaunchList){
|
||||||
|
bb.addedToLaunchList=true;
|
||||||
|
matchedBlockIDs.push_back(info);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tempMatchIDsY.size()>2) {
|
if (tempMatchIDsY.size()>2) {
|
||||||
for (std::pair<int,int>&info:tempMatchIDsY) {
|
for (BlockMatchingInfo&info:tempMatchIDsY) {
|
||||||
Block&bb=gameBoard.getBlocks(info.first)[info.second];
|
if (info.c!=-1) {
|
||||||
if (!bb.addedToLaunchList) {
|
BlockClump&c=gameBoard.getBlockClumps()[info.c];
|
||||||
|
Block&bb=c.getBlocks()[info.ind];
|
||||||
|
if (!bb.addedToLaunchList){
|
||||||
bb.addedToLaunchList=true;
|
bb.addedToLaunchList=true;
|
||||||
matchedBlockIDs.push_back(info);
|
matchedBlockIDs.push_back(info);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
Block&bb=gameBoard.getBlocks(info.col)[info.ind];
|
||||||
|
if (!bb.addedToLaunchList){
|
||||||
|
bb.addedToLaunchList=true;
|
||||||
|
matchedBlockIDs.push_back(info);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -333,19 +417,38 @@ void Meteos::updateGame(float fElapsedTime){
|
|||||||
BlockClump c;
|
BlockClump c;
|
||||||
bool firstBlock=true;
|
bool firstBlock=true;
|
||||||
int baseBlockPos;
|
int baseBlockPos;
|
||||||
for (std::pair<int,int>&info:matchedBlockIDs) {
|
for (BlockMatchingInfo&info:matchedBlockIDs) {
|
||||||
Block&b=gameBoard.getBlocks(info.first)[info.second];
|
Block*b;
|
||||||
|
if (info.c!=-1){
|
||||||
|
b=&gameBoard.getBlockClumps()[info.c].getBlocks()[info.ind];
|
||||||
if (firstBlock) {
|
if (firstBlock) {
|
||||||
baseBlockPos=b.pos.y;
|
baseBlockPos=gameBoard.getBlockClumps()[info.c].getBlockPosition(*b).y;
|
||||||
c.y=baseBlockPos-1;
|
c.y=baseBlockPos-1;
|
||||||
firstBlock=false;
|
firstBlock=false;
|
||||||
}
|
}
|
||||||
b.col=BlockColor::LAUNCHED;
|
} else {
|
||||||
|
b=&gameBoard.getBlocks(info.col)[info.ind];
|
||||||
|
if (firstBlock) {
|
||||||
|
baseBlockPos=b->pos.y;
|
||||||
|
c.y=baseBlockPos-1;
|
||||||
|
firstBlock=false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
b->col=BlockColor::LAUNCHED;
|
||||||
c.vspeed=gameBoard.launchSpd;
|
c.vspeed=gameBoard.launchSpd;
|
||||||
c.launchTime=gameBoard.launchTime;
|
c.launchTime=gameBoard.launchTime;
|
||||||
}
|
}
|
||||||
for (std::pair<int,int>&info:matchedBlockIDs) {
|
for (BlockMatchingInfo&info:matchedBlockIDs) {
|
||||||
Block&b=gameBoard.getBlocks(info.first)[info.second];
|
if (info.c!=-1){
|
||||||
|
Block&b=gameBoard.getBlockClumps()[info.c].getBlocks()[info.ind];
|
||||||
|
for (Block&b2:gameBoard.getBlockClumps()[info.c].getBlocks()){
|
||||||
|
if (!b2.markedForRemoval&&gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y<=gameBoard.getBlockClumps()[info.c].getBlockPosition(b).y){
|
||||||
|
c.addBlock(b.pos.x/12,(gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y-baseBlockPos)/12,b2.col);
|
||||||
|
b2.markedForRemoval=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Block&b=gameBoard.getBlocks(info.col)[info.ind];
|
||||||
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.addBlock(b.pos.x/12,(b2.pos.y-baseBlockPos)/12,b2.col);
|
c.addBlock(b.pos.x/12,(b2.pos.y-baseBlockPos)/12,b2.col);
|
||||||
@ -353,20 +456,23 @@ void Meteos::updateGame(float fElapsedTime){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
gameBoard.addClump(c);
|
gameBoard.addClump(c);
|
||||||
}
|
}
|
||||||
for (int i=0;i<gameBoard.getBlockClumps().size();i++){ //Resolve BlockClump movements.
|
for (int i=0;i<gameBoard.getBlockClumps().size();i++){ //Resolve BlockClump movements.
|
||||||
BlockClump&c=gameBoard.getBlockClumps()[i];
|
BlockClump&c=gameBoard.getBlockClumps()[i];
|
||||||
if (c.vspeed<0) {
|
|
||||||
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 (c.getBlockPosition(b).y<0){
|
if (c.vspeed<0&&c.getBlockPosition(b).y<0||b.markedForRemoval){
|
||||||
c.removeBlock(j--);
|
c.removeBlock(j--);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
c.y+=c.vspeed;
|
c.y+=c.vspeed;
|
||||||
|
if (c.getBlocks().size()<=0) {
|
||||||
|
gameBoard.removeClump(i--);
|
||||||
|
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=0;y<gameBoard.getBlocks(i).size();y++){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user