Partie 38: Les portes cassables
Téléchargements
La porte 22
				
				
		<tile name="Porte">
			[...]
			<param type="bool">estCassee</param>
		</tile>
				
				Maintenant on va devoir convertir la map au nouveau format.
			
			
Convertir les maps
		//#define CONVERT_MAP 1
				
				Si vous le cherchez dans le code, vous verrez qu'il est utilisé dans 2 fonctions.
		void    CBridge::load(QString fileName)
		{
			// astuce pour convertir les anciens formats
		#ifdef CONVERT_MAP
			CMap::mTilesParams.clear();
			editor.readTilesDB("databases/tiles-old.xml");
		//    CMap::mWallsParams.clear();
		//    editor.readWallsDB("databases/walls-old.xml");
		//    CMap::mObjectsParams.clear();
		//    editor.readObjectsDB("databases/items-old.xml");
		#endif
			// [8] pour retirer "file:///"
			map.load(&fileName.toLocal8Bit().data()[8]);
			updateQMLImage();
		}
				
				et la fonction save():
				
		void    CBridge::save(QString fileName)
		{
			// astuce pour convertir les anciens formats
		#ifdef CONVERT_MAP
			CMap::mTilesParams.clear();
			editor.readTilesDB("databases/tiles.xml");
		//    CMap::mWallsParams.clear();
		//    editor.readWallsDB("databases/walls.xml");
		//    CMap::mObjectsParams.clear();
		//    editor.readObjectsDB("databases/items.xml");
		#endif
			// [8] pour retirer "file:///"
			map.save(&fileName.toLocal8Bit().data()[8]);
		}
				
				Comme vous pouvez le voir, la fonction load() ouvre un fichier avec un suffixe "-old". C'est le fichier qui était
Dessiner la porte cassée
				
		void    CGraphics2D::drawImageTransparent(QImage* destImage, const CVec2& pos, const QImage& srcImage)
		{
			QPainter painter(destImage);
			painter.setCompositionMode(QPainter::CompositionMode_DestinationOut);
			painter.drawImage(pos.x, pos.y, srcImage);
			painter.end();
		}
		void    CDoors::drawDoor(QImage* image, CVec2 tablePos, CTile* tile)
		{
			[...]
			// porte cassable
			if (tile->getBoolParam("estCassable") == true && tile->getBoolParam("estCassee") == true)
			{
				QImage  holeImage = fileCache.getImage(std::string("gfx/3DView/doors/Bashed_Door.png"));
				graph2D.drawImageTransparent(&doorImage, CVec2(), holeImage);
			}
				
				
		void CInterface::updateWeapons()
		{
			// surbrillance de l'attaque
			if (attackHighlightTime.update() == true)
			{
				[...]
				CVec2   frontPos = player.getPosFromLocal(CVec2(0, -1));
				CTile*  frontTile = map.getTile(frontPos);
				if (frontTile != NULL)
				{
					// porte cassable
					if (frontTile->getType() == eTileDoor &&
					    frontTile->getBoolParam("estCassable") == true &&
					    frontTile->getBoolParam("estCassee") == false &&
					    (attackType == ATTACK_CHOP ||
					     attackType == ATTACK_KICK ||
					     attackType == ATTACK_SWING ||
					     attackType == ATTACK_HACK ||
					     attackType == ATTACK_BERZERK ||
					     attackType == ATTACK_BASH)
					    )
					{
						frontTile->setBoolParam("estCassee", true);
						weaponCoolDown[currentWeapon].set(60, true);
						sound->play(frontPos, "sound/Wooden_Thud.wav");
					}
					else
					{
						// attaque normale
						[...]
					}
				}
				
				Dans le jeu d'origine les portes avaient une valeur de "défense" et pouvaient seulement être détruites avec une
		bool CDoors::isOpened(CTile* tile)
		{
			bool isOpened = tile->getBoolParam("estOuverte") || tile->getBoolParam("estCassee");
			bool isMoving = tile->getBoolParam("estEnMouvement");
			if (isOpened == true && isMoving == false)
				return true;
			else
				return false;
		}
				
				Finalement tous les mécanismes des portes sont codés pour le niveau 2.