diff --git a/Board.cpp b/Board.cpp index f1e3bea..870864a 100644 --- a/Board.cpp +++ b/Board.cpp @@ -12,11 +12,6 @@ Board::Board(vi2d boardSize,float gravity,float maxGravity,float launchSpd,float for (int i=0;i()); } - 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){ @@ -113,4 +108,12 @@ void Board::removeBlock(int col,int ind){ void Board::assignRandomColor(Block&b){ b.col=colorHandler.getRandomColor(); +} + +Block&Board::getBlock(SelectedBlockData&blockData){ + if (blockData.c!=-1){ + return clumps[blockData.c].getBlocks()[blockData.ind]; + } else { + return cols[blockData.col][blockData.ind]; + } } \ No newline at end of file diff --git a/Board.h b/Board.h index a2f9e26..1c13602 100644 --- a/Board.h +++ b/Board.h @@ -28,6 +28,12 @@ class ColorDistributor{ BlockColor getRandomColor(); }; +struct SelectedBlockData{ + int col=-1; + int ind=-1; + int c=-1; +}; + class Board{ std::vector> cols; std::vector clumps; @@ -43,6 +49,7 @@ class Board{ float launchSpd; float launchTime; //How much time a stack rises before beginning descent. float landTime; + SelectedBlockData selectedBlock; Board(); Board(vi2d boardSize,float gravity,float maxGravity,float launchSpd,float launchTime,float landTime,float spawnRate,std::array colorRates,Renderable&tileset); void spawnBlock(int col); @@ -53,5 +60,6 @@ class Board{ void removeClump(int ind); void removeBlock(int col,int ind); void assignRandomColor(Block&b); + Block&getBlock(SelectedBlockData&blockData); }; #endif \ No newline at end of file diff --git a/C++ProjectTemplate b/C++ProjectTemplate index b0d9755..d43b418 100755 Binary files a/C++ProjectTemplate and b/C++ProjectTemplate differ diff --git a/main.cpp b/main.cpp index b19aeee..a90d968 100644 --- a/main.cpp +++ b/main.cpp @@ -19,11 +19,11 @@ bool Meteos::OnUserCreate() 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 - gen=std::mt19937(0); //Standard mersenne_twister_engine seeded with rd() + gen=std::mt19937(rd()); //Standard mersenne_twister_engine seeded with rd() randBlockPos=std::uniform_int_distribution<>(0, 9); coinFlip=std::uniform_int_distribution<>(0, 1); - gameBoard=Board({10,14},0.04f,1.2f,-1.f,1.7f,2.0f,1.0f,{3,3,0,0,0,0,0,0,0,0},SPRITES["blocks_test.png"]); + gameBoard=Board({10,14},0.04f,1.2f,-1.f,1.7f,2.0f,1.0f,{3,3,1,2,3,0,0,0,0,0},SPRITES["blocks_test.png"]); return true; } @@ -418,25 +418,23 @@ void Meteos::updateGame(float fElapsedTime){ bool firstBlock=true; int baseBlockPos; for (BlockMatchingInfo&info:matchedBlockIDs) { - Block*b; if (info.c!=-1){ - b=&gameBoard.getBlockClumps()[info.c].getBlocks()[info.ind]; + Block&b=gameBoard.getBlockClumps()[info.c].getBlocks()[info.ind]; if (firstBlock) { - baseBlockPos=gameBoard.getBlockClumps()[info.c].getBlockPosition(*b).y; + baseBlockPos=gameBoard.getBlockClumps()[info.c].getBlockPosition(b).y; c.y=baseBlockPos-1; firstBlock=false; } + b.col=BlockColor::LAUNCHED; } else { - b=&gameBoard.getBlocks(info.col)[info.ind]; + Block&b=gameBoard.getBlocks(info.col)[info.ind]; if (firstBlock) { - baseBlockPos=b->pos.y; + baseBlockPos=b.pos.y; c.y=baseBlockPos-1; firstBlock=false; } + b.col=BlockColor::LAUNCHED; } - b->col=BlockColor::LAUNCHED; - c.vspeed=gameBoard.launchSpd; - c.launchTime=gameBoard.launchTime; } for (BlockMatchingInfo&info:matchedBlockIDs) { if (info.c!=-1){ @@ -458,11 +456,14 @@ void Meteos::updateGame(float fElapsedTime){ } } gameBoard.addClump(c); + gameBoard.getBlockClumps()[gameBoard.getBlockClumps().size()-1].vspeed=gameBoard.launchSpd; + gameBoard.getBlockClumps()[gameBoard.getBlockClumps().size()-1].launchTime=gameBoard.launchTime; } for (int i=0;i=0&&mouseCol=mouseY){ + SelectedBlockData newData={mouseCol,j,i}; + if (gameBoard.selectedBlock.col!=-1&&mouseCol==gameBoard.selectedBlock.col){ + //See if these two can be swapped. + Block&b1=gameBoard.getBlock(gameBoard.selectedBlock); + 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 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){ + //Swap the two! + BlockColor tempCol=b1.col; + b1.col=b2.col; + b2.col=tempCol; + } + } + gameBoard.selectedBlock=newData; + goto found; + } + } + } + found:; + } + } + if (GetMouse(0).bReleased){ + gameBoard.selectedBlock={-1}; + } } void Meteos::drawGame(float fElapsedTime){ @@ -501,13 +574,13 @@ void Meteos::drawGame(float fElapsedTime){ BlockClump&c=gameBoard.getBlockClumps()[i]; for (int j=0;j