We can finally pew pew
This commit is contained in:
		
							parent
							
								
									a753e7a7b9
								
							
						
					
					
						commit
						b123c9a3f3
					
				| @ -21,16 +21,18 @@ players: | ||||
| invaders: | ||||
|  fireCooldown: 20 | ||||
|  size: 15 | ||||
|  speed: 2 | ||||
|  speed: 0 | ||||
|  distance: 10 # distance in pixels between invaders | ||||
| 
 | ||||
| # Projectiles config | ||||
| projectiles: | ||||
|  missiles: | ||||
|   color: yellow | ||||
|   speed: 2 | ||||
|   width: 10 | ||||
|  torpedos: | ||||
|   speed: 2 | ||||
|   color: green | ||||
|   speed: 10 | ||||
|   width: 10 | ||||
| 
 | ||||
| points: | ||||
|  | ||||
| @ -27,9 +27,12 @@ struct ConfigData { | ||||
| 	unsigned missilesWidth; | ||||
| 	unsigned missilesLength; // auto defined from width
 | ||||
| 	unsigned missilesSpeed; | ||||
| 	nsGraphics::RGBAcolor missilesColor; | ||||
| 
 | ||||
| 	unsigned torpedosWidth; | ||||
| 	unsigned torpedosLength; // auto defined from width
 | ||||
| 	unsigned torpedosSpeed; | ||||
| 	nsGraphics::RGBAcolor torpedosColor; | ||||
| }; | ||||
| 
 | ||||
| #endif | ||||
| @ -12,11 +12,13 @@ class PixelManager{ | ||||
| public: | ||||
| 	MinGL& window; | ||||
| 	explicit PixelManager(MinGL&); | ||||
| 	void dessinerInvader1(const nsGraphics::Vec2D& baseVector, unsigned size); | ||||
| 	void dessinerInvader2(const nsGraphics::Vec2D& baseVector, unsigned size); | ||||
| 	void dessinerInvader3(const nsGraphics::Vec2D& baseVector, unsigned size); | ||||
| 	void dessinerJoueur(const nsGraphics::Vec2D& baseVector, unsigned size, const nsGraphics::RGBAcolor&); | ||||
| 	void dessinerSprite(const nsGraphics::Vec2D& baseVector,const std::string& spritePath); | ||||
| 	void drawInvader1(const nsGraphics::Vec2D& baseVector, unsigned size); | ||||
| 	void drawInvader2(const nsGraphics::Vec2D& baseVector, unsigned size); | ||||
| 	void drawInvader3(const nsGraphics::Vec2D& baseVector, unsigned size); | ||||
| 	void drawPlayer(const nsGraphics::Vec2D& baseVector, unsigned width, const nsGraphics::RGBAcolor &color); | ||||
| 	void drawTorpedo(const nsGraphics::Vec2D& baseVector, unsigned width, const nsGraphics::RGBAcolor& color); | ||||
| 	void drawMissile(const nsGraphics::Vec2D& baseVector, unsigned width, const nsGraphics::RGBAcolor& color); | ||||
| 	void drawSprite(const nsGraphics::Vec2D& baseVector, const std::string& spritePath); | ||||
| 
 | ||||
| 	unsigned showInitialMenu(); | ||||
| 	unsigned showDeathMenu(); | ||||
| @ -24,6 +26,7 @@ public: | ||||
| 	unsigned getScreenWidth(); | ||||
| 	void startFrame(); | ||||
| 	void endFrame(); | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -23,6 +23,6 @@ typedef nsGraphics::Vec2D position; | ||||
| typedef unsigned playerID; | ||||
| 
 | ||||
| // didn't want to use position because of the semantic with x and y
 | ||||
| bool lineCollideCheck(unsigned start1, unsigned end1, unsigned start2, unsigned end2); | ||||
| bool areLinesColliding(unsigned start1, unsigned end1, unsigned start2, unsigned end2); | ||||
| 
 | ||||
| #endif | ||||
| @ -102,10 +102,12 @@ void ConfigBuilder::readConfig() { | ||||
| 	collectedData.missilesWidth = getInt("projectiles.missiles.width"); | ||||
| 	collectedData.missilesLength = collectedData.missilesWidth*PROJ_LENGTH_FACTOR; | ||||
| 	collectedData.missilesSpeed = getInt("projectiles.missiles.speed"); | ||||
| 	collectedData.missilesColor = getColor("projectiles.missiles.color"); | ||||
| 
 | ||||
| 	collectedData.torpedosWidth = getInt("projectiles.torpedos.width"); | ||||
| 	collectedData.torpedosLength = collectedData.torpedosWidth*PROJ_LENGTH_FACTOR; | ||||
| 	collectedData.torpedosSpeed = getInt("projectiles.missiles.speed"); | ||||
| 	collectedData.torpedosColor = getColor("projectiles.torpedos.color"); | ||||
| } | ||||
| 
 | ||||
| int ConfigBuilder::getInt(const configKey& key) { | ||||
|  | ||||
| @ -128,22 +128,29 @@ void Game::display() { | ||||
| 			); | ||||
| 			switch(grid[i][j]){ | ||||
| 				case 0:{ | ||||
| 					pm.dessinerInvader1(vec, confData.invadersSize); | ||||
| 					pm.drawInvader1(vec, confData.invadersSize); | ||||
| 					break; | ||||
| 				} | ||||
| 				case 1:{ | ||||
| 					pm.dessinerInvader2(vec, confData.invadersSize); | ||||
| 					pm.drawInvader2(vec, confData.invadersSize); | ||||
| 					break; | ||||
| 				} | ||||
| 				case 2:{ | ||||
| 					pm.dessinerInvader3(vec, confData.invadersSize); | ||||
| 					pm.drawInvader3(vec, confData.invadersSize); | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	for(missile& miss : missiles){ | ||||
| 		pm.drawTorpedo(miss, confData.missilesWidth, confData.missilesColor); | ||||
| 	} | ||||
| 	for(torpedo& tor : torpedos){ | ||||
| 		pm.drawTorpedo(tor, confData.torpedosWidth, confData.torpedosColor); | ||||
| 	} | ||||
| 
 | ||||
| 	for(size_t i=0;i<players.size();++i){ | ||||
| 		pm.dessinerJoueur(position(players[i].x, 0), confData.playersWidth, confData.playerDefs[i].color); | ||||
| 		pm.drawPlayer(position(players[i].x, 0), confData.playersWidth, confData.playerDefs[i].color); | ||||
| 	} | ||||
| } | ||||
| @ -77,7 +77,7 @@ void Game::remCollidingProjectiles(){ | ||||
| 			if(miss->getY() + confData.missilesLength < tor->getY()){ | ||||
| 
 | ||||
| 			} | ||||
| 			if(lineCollideCheck( // now check if they collide in X
 | ||||
| 			if(areLinesColliding( // now check if they collide in X
 | ||||
| 					miss->getX(), miss->getX() + confData.missilesWidth, | ||||
| 					tor->getX(), tor->getX() + confData.torpedosWidth)){ | ||||
| 				missiles.erase(miss); | ||||
| @ -123,7 +123,7 @@ bool Game::checkMissilesAndPlayers() { | ||||
| 			// now check collision on X (with both players)
 | ||||
| 			bool wasColliding = false; | ||||
| 			for(Player& p : players){ | ||||
| 				if(lineCollideCheck( | ||||
| 				if(areLinesColliding( | ||||
| 						miss_ite->getX(), miss_ite->getX() + confData.missilesWidth, | ||||
| 						p.x, p.x + confData.playersWidth)){ | ||||
| 					wasColliding = true; | ||||
| @ -145,13 +145,14 @@ bool Game::checkTorpedosAndInvaders() { | ||||
| 		for(;i<grid.size();++i){ | ||||
| 			// calculate top-left position of invader
 | ||||
| 			position pos = basePos+position( | ||||
| 					confData.invadersSize*(grid[i].size()-1)+confData.invadersDistance*(grid[i].size()-1), | ||||
| 					confData.invadersSize*(grid[i].size()-1)+confData.invadersDistance*(grid[i].size()-1)); | ||||
| 					confData.invadersSize*i+confData.invadersDistance*i, | ||||
| 					confData.invadersSize*(grid[i].size()-1)+confData.invadersDistance*(grid[i].size()-1) | ||||
| 			); | ||||
| 			// check collision on Y (invaders can actually be "under" torpedos, so we check both lower and upper bounds
 | ||||
| 			if(pos.getY()+confData.invadersSize>=tor_ite->getY() && | ||||
| 					pos.getY()<=tor_ite->getY()+confData.torpedosLength){ | ||||
| 				// now check collision on X
 | ||||
| 				if(lineCollideCheck( // now check collision on X
 | ||||
| 				if(areLinesColliding( // now check collision on X
 | ||||
| 						tor_ite->getX(), tor_ite->getX() + confData.torpedosWidth, | ||||
| 						pos.getX(), pos.getX() + confData.invadersSize)){ | ||||
| 					break; | ||||
|  | ||||
| @ -5,7 +5,7 @@ PixelManager::PixelManager(MinGL& a) : window(a) { | ||||
| 	window.initGlut(); | ||||
| 	window.initGraphic(); | ||||
| } | ||||
| void PixelManager::dessinerInvader1(const nsGraphics::Vec2D& baseVector, unsigned size){ | ||||
| void PixelManager::drawInvader1(const nsGraphics::Vec2D& baseVector, unsigned size){ | ||||
| 	float scale = size/(float)100; | ||||
| 	window << nsShape::Circle(nsGraphics::Vec2D(50*scale, 50*scale)+baseVector, 50*scale, nsGraphics::KGray); | ||||
| 	window << nsShape::Triangle(nsGraphics::Vec2D(35*scale, 50*scale)+baseVector, nsGraphics::Vec2D(15*scale, 25*scale)+baseVector, nsGraphics::Vec2D(15*scale, 75*scale)+baseVector, nsGraphics::KBlack); | ||||
| @ -16,7 +16,7 @@ void PixelManager::dessinerInvader1(const nsGraphics::Vec2D& baseVector, unsigne | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| void PixelManager::dessinerInvader2(const nsGraphics::Vec2D& baseVector, unsigned size){ | ||||
| void PixelManager::drawInvader2(const nsGraphics::Vec2D& baseVector, unsigned size){ | ||||
| 	float scale = size/(float)100; | ||||
| 	window << nsShape::Circle(nsGraphics::Vec2D(50*scale, 50*scale)+baseVector, 50*scale, nsGraphics::KRed); | ||||
| 	window << nsShape::Rectangle(nsGraphics::Vec2D(25*scale, 30*scale)+baseVector, nsGraphics::Vec2D(45*scale, 40*scale)+baseVector, nsGraphics::KBlack); | ||||
| @ -24,7 +24,7 @@ void PixelManager::dessinerInvader2(const nsGraphics::Vec2D& baseVector, unsigne | ||||
| 	window << nsShape::Rectangle(nsGraphics::Vec2D(35*scale, 65*scale)+baseVector, nsGraphics::Vec2D(65*scale, 72*scale)+baseVector, nsGraphics::KBlack); | ||||
| } | ||||
| 
 | ||||
| void PixelManager::dessinerInvader3(const nsGraphics::Vec2D& baseVector, unsigned size){ | ||||
| void PixelManager::drawInvader3(const nsGraphics::Vec2D& baseVector, unsigned size){ | ||||
| 	float scale = size/(float)100; | ||||
| 	window << nsShape::Circle(nsGraphics::Vec2D(50*scale, 50*scale)+baseVector, 50*scale, nsGraphics::KGreen); | ||||
| 	window << nsShape::Circle(nsGraphics::Vec2D(35*scale, 35*scale)+baseVector, 10*scale, nsGraphics::KBlack); | ||||
| @ -32,7 +32,7 @@ void PixelManager::dessinerInvader3(const nsGraphics::Vec2D& baseVector, unsigne | ||||
| 	window << nsShape::Rectangle(nsGraphics::Vec2D(35*scale, 65*scale)+baseVector, nsGraphics::Vec2D(65*scale, 72*scale)+baseVector, nsGraphics::KBlack); | ||||
| } | ||||
| 
 | ||||
| void PixelManager::dessinerJoueur(const nsGraphics::Vec2D& baseVector, unsigned width, const nsGraphics::RGBAcolor& color){ | ||||
| void PixelManager::drawPlayer(const nsGraphics::Vec2D& baseVector, unsigned width, const nsGraphics::RGBAcolor& color){ | ||||
| 	width = width-10-10; | ||||
| 	width = width/2; | ||||
| 	window << nsShape::Triangle(nsGraphics::Vec2D(0, 720)+baseVector, nsGraphics::Vec2D(5, 720)+baseVector, nsGraphics::Vec2D(5, 720-PLAYER_HEIGHT/2)+baseVector, color); | ||||
| @ -44,7 +44,15 @@ void PixelManager::dessinerJoueur(const nsGraphics::Vec2D& baseVector, unsigned | ||||
| 	window << nsShape::Triangle(nsGraphics::Vec2D(15+width,720-PLAYER_HEIGHT/2)+baseVector, nsGraphics::Vec2D(15+width*2,720-PLAYER_HEIGHT/2)+baseVector, nsGraphics::Vec2D(15+width,720-PLAYER_HEIGHT*0.9)+baseVector, color); | ||||
| } | ||||
| 
 | ||||
| void PixelManager::dessinerSprite(const nsGraphics::Vec2D& baseVector, const std::string& spritePath){ | ||||
| void PixelManager::drawMissile(const nsGraphics::Vec2D& baseVector, unsigned width, const nsGraphics::RGBAcolor& color){ | ||||
| 	window << nsShape::Rectangle(baseVector, baseVector+position(width, width*PROJ_LENGTH_FACTOR), color); | ||||
| } | ||||
| 
 | ||||
| void PixelManager::drawTorpedo(const nsGraphics::Vec2D& baseVector, unsigned width, const nsGraphics::RGBAcolor& color){ | ||||
| 	window << nsShape::Rectangle(baseVector, baseVector+position(width, width*PROJ_LENGTH_FACTOR), color); | ||||
| } | ||||
| 
 | ||||
| void PixelManager::drawSprite(const nsGraphics::Vec2D& baseVector, const std::string& spritePath){ | ||||
| 	nsGui::Sprite sprite(spritePath,baseVector); | ||||
| 	sprite.draw(window); | ||||
| } | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| #include "utils.h" | ||||
| 
 | ||||
| bool lineCollideCheck(unsigned start1, unsigned end1, unsigned start2, unsigned end2){ | ||||
| 	return start1 < end2 != start2 < end1; | ||||
| 	// if true, are colliding. I like truth tables
 | ||||
| bool areLinesColliding(unsigned start1, unsigned end1, unsigned start2, unsigned end2){ | ||||
| 	return start1 < end2 == start2 < end1; | ||||
| 	// if it returns true, lines are colliding. I like truth tables
 | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user