generated from sigonasr2/CPlusPlusProjectTemplate
	Block clumping implementation
Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
		
							parent
							
								
									95a110808c
								
							
						
					
					
						commit
						268d071e9b
					
				| @ -8,6 +8,10 @@ void BlockClump::addBlock(int col){ | ||||
|     blocks.push_back(Block({(float)col*12,0})); | ||||
| } | ||||
| 
 | ||||
| void BlockClump::addBlock(vi2d offset){ | ||||
|     blocks.push_back(Block(offset)); | ||||
| } | ||||
| 
 | ||||
| vf2d BlockClump::getBlockPosition(Block&b){ | ||||
|     return {b.pos.x,b.pos.y+y}; | ||||
| } | ||||
| @ -13,6 +13,7 @@ class BlockClump{ | ||||
|     BlockClump(){} | ||||
|     std::vector<Block>&getBlocks(); | ||||
|     void addBlock(int col); | ||||
|     void addBlock(vi2d offset); | ||||
|     //Get a block's position relative to this block clump.
 | ||||
|     vf2d getBlockPosition(Block&b); | ||||
| }; | ||||
|  | ||||
							
								
								
									
										19
									
								
								Board.cpp
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								Board.cpp
									
									
									
									
									
								
							| @ -14,6 +14,16 @@ Board::Board(vi2d boardSize,float gravity,float spawnRate) | ||||
| void Board::spawnBlock(int col){ | ||||
|     BlockClump c=BlockClump(); | ||||
|     c.addBlock(col); | ||||
|     if (game->coinFlip(game->gen)==0) { | ||||
|         if (col>0) { | ||||
|             c.addBlock(col-1); | ||||
|         } | ||||
|     } | ||||
|     if (game->coinFlip(game->gen)==0) { | ||||
|         if (col<boardSize.x-1) { | ||||
|             c.addBlock(col+1); | ||||
|         } | ||||
|     } | ||||
|     clumps.push_back(c); | ||||
| } | ||||
| 
 | ||||
| @ -23,4 +33,13 @@ std::vector<Block>&Board::getBlocks(int col){ | ||||
| 
 | ||||
| std::vector<BlockClump>&Board::getBlockClumps(){ | ||||
|     return clumps; | ||||
| } | ||||
| 
 | ||||
| void Board::removeClump(int ind){ | ||||
|     BlockClump&c=clumps[ind]; | ||||
|     for (Block b:c.getBlocks()){ | ||||
|         cols[b.pos.x/12].push_back(b); | ||||
|         cols[b.pos.x/12][cols[b.pos.x/12].size()-1].pos=c.getBlockPosition(b); | ||||
|     } | ||||
|     clumps.erase(clumps.begin()+ind); | ||||
| } | ||||
							
								
								
									
										1
									
								
								Board.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								Board.h
									
									
									
									
									
								
							| @ -19,5 +19,6 @@ class Board{ | ||||
|     void spawnBlock(int col); | ||||
|     std::vector<Block>&getBlocks(int col); | ||||
|     std::vector<BlockClump>&getBlockClumps(); | ||||
|     void removeClump(int ind); | ||||
| }; | ||||
| #endif | ||||
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										2
									
								
								Meteos.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Meteos.h
									
									
									
									
									
								
							| @ -10,7 +10,7 @@ class Meteos : public olc::PixelGameEngine{ | ||||
|         sAppName="Meteos"; | ||||
|     } | ||||
|     float lastBlockSpawn=0.0f; | ||||
|     std::uniform_int_distribution<> randBlockPos; | ||||
|     std::uniform_int_distribution<> randBlockPos,coinFlip; | ||||
|     std::mt19937 gen; | ||||
|     Board gameBoard; | ||||
|     bool OnUserCreate()override; | ||||
|  | ||||
							
								
								
									
										15
									
								
								main.cpp
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								main.cpp
									
									
									
									
									
								
							| @ -12,6 +12,7 @@ bool Meteos::OnUserCreate() | ||||
| 	std::random_device rd;  //Will be used to obtain a seed for the random number engine
 | ||||
|     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},12.f,3.0f); | ||||
| 	return true; | ||||
| @ -40,28 +41,28 @@ bool Meteos::OnUserUpdate(float fElapsedTime) | ||||
| 		for (int j=0;j<c.getBlocks().size();j++){ | ||||
| 			Block&b=c.getBlocks()[j]; | ||||
| 			int col=b.pos.x/12; | ||||
| 			for (int k=0;k<gameBoard.getBlocks(j).size();k++){ | ||||
| 				Block&b2=gameBoard.getBlocks(j)[k]; | ||||
| 			for (int k=0;k<gameBoard.getBlocks(col).size();k++){ | ||||
| 				Block&b2=gameBoard.getBlocks(col)[k]; | ||||
| 				if (c.getBlockPosition(b).y+12>=b2.pos.y&&c.getBlockPosition(b).y<=b2.pos.y+12){ | ||||
| 					c.y=b2.pos.y-12; | ||||
| 					c.vspeed=0; | ||||
| 					gameBoard.removeClump(c); | ||||
| 					i--; | ||||
| 					gameBoard.removeClump(i--); | ||||
| 					goto nextClump; | ||||
| 				} | ||||
| 			} | ||||
| 			if (c.getBlockPosition(b).y>=gameBoard.yBottom) { | ||||
| 				c.y=gameBoard.yBottom; | ||||
| 				c.vspeed=0; | ||||
| 				gameBoard.removeClump(c); | ||||
| 				i--; | ||||
| 				gameBoard.removeClump(i--); | ||||
| 				goto nextClump; | ||||
| 			} | ||||
| 		} | ||||
| 		applyVelocity: | ||||
| 		for (int j=0;j<c.getBlocks().size();j++){ | ||||
| 			Block&b=c.getBlocks()[j]; | ||||
| 			c.y+=c.vspeed*fElapsedTime; | ||||
| 			FillRectDecal(c.getBlockPosition(b)+gameBoard.drawOffset,{12,12},DARK_GREEN); | ||||
| 		} | ||||
| 		nextClump:; | ||||
| 	} | ||||
| 	for (int i=0;i<gameBoard.boardSize.x;i++){ | ||||
| 		for (int y=0;y<gameBoard.getBlocks(i).size();y++){ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user