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.