Partie 34: Portes réparées et boutons
Téléchargements
Réparer les portes
void CDoors::drawDoor(QImage* image, CVec2 tablePos, CTile* tile)
{
SDoorElem& cell = tabDoor[tablePos.y][tablePos.x];
int doorNum = cell.file[0] - '0';
if (doorNum >= 0)
{
//----------------------------------------------------------------------------
// récupère l'image de la porte
int doorType = tile->getDoorParam("Type");
std::string fileName = std::string("gfx/3DView/doors/") + doorsDatas[doorType].files[2].toUtf8().constData();
QImage doorImage = fileCache.getImage(fileName);
//----------------------------------------------------------------------------
// récupère l'image du décor
int ornateType = tile->getDoorOrnateParam("Decor");
std::string ornateName = doorOrnatesDatas[ornateType].file.toUtf8().constData();
QImage ornateImage;
CVec2 ornatePos;
if (ornateName.empty() == false)
{
ornateImage = fileCache.getImage(std::string("gfx/3DView/door_ornates/") + ornateName);
ornatePos = doorOrnatesDatas[ornateType].pos;
graph2D.drawImage(&doorImage, ornatePos, ornateImage);
// décors avec transparence
if (ornateType == DOOR_ORNATE_ARCHED || ornateType == DOOR_ORNATE_ARCHED + 1)
{
QSize qSize = ornateImage.size();
for (int y = 0; y < qSize.height(); ++y)
for (int x = 0; x < qSize.width(); ++x)
{
QRgb pixel = ornateImage.pixel(x, y);
if (qRed(pixel) == 204 &&
qGreen(pixel) == 136 &&
qBlue(pixel) == 102)
{
CVec2 destPos = ornatePos + CVec2(x, y);
doorImage.setPixel(destPos.x, destPos.y, 0);
}
}
}
}
//----------------------------------------------------------------------------
// assombrit
static const float shadowLevels[] = {0.0f, 0.2f, 0.4f};
float shadow = shadowLevels[WALL_TABLE_HEIGHT - 2 - tablePos.y];
graph2D.darken(&doorImage, shadow);
//----------------------------------------------------------------------------
// dessin
static const int doorScalesX[] = {96, 64, 44};
static const int doorScalesY[] = {88, 61, 38};
float scaleX = (float)doorScalesX[WALL_TABLE_HEIGHT - 2 - tablePos.y] / 96.0;
float scaleY = (float)doorScalesY[WALL_TABLE_HEIGHT - 2 - tablePos.y] / 88.0;
bool isHorizontal = tile->getBoolParam("estHorizontale");
int doorPos = tile->getIntParam("pos") / DOOR_POS_FACTOR;
if (isHorizontal == false)
{
//----------------------------------------------------------------------------
// porte verticale
doorPos *= scaleY;
CVec2 pos(cell.x, cell.y + doorPos);
QRect clip(cell.cx1, cell.cy1,
cell.cx2 - cell.cx1 + 1, cell.cy2 - cell.cy1 + 1);
clipToMainView(&clip);
if (clip.width() > 0 && clip.height() > 0)
graph2D.drawImageScaled(image, pos, doorImage, scaleX, false, scaleY, clip);
}
else
{
//----------------------------------------------------------------------------
// porte horizontale
doorPos *= scaleX;
CVec2 pos(cell.x + doorPos, cell.y);
int halfwidth = (cell.cx2 - cell.cx1 + 1) / 2;
QRect clip1(cell.cx1, cell.cy1,
halfwidth + doorPos, cell.cy2 - cell.cy1 + 1);
clipToMainView(&clip1);
if (clip1.width() > 0 && clip1.height() > 0)
graph2D.drawImageScaled(image, pos, doorImage, scaleX, false, scaleY, clip1);
pos.x = cell.x - doorPos;
QRect clip2(cell.cx1 + halfwidth - doorPos, cell.cy1,
halfwidth + doorPos, cell.cy2 - cell.cy1 + 1);
clipToMainView(&clip2);
if (clip2.width() > 0 && clip2.height() > 0)
graph2D.drawImageScaled(image, pos, doorImage, scaleX, false, scaleY, clip2);
}
}
}
L'ombre des objets
Les boutons
<ornate name="Levier Off">
<image_front>Lever_Off_front.png</image_front>
<image_side>Lever_Off_side.png</image_side>
<pos_front x="105" y="69"/>
<pos_side x="47" y="72"/>
</ornate>
<ornate name="Levier On">
<image_front>Lever_On_front.png</image_front>
<image_side>Lever_On_side.png</image_side>
<pos_front x="105" y="69"/>
<pos_side x="47" y="72"/>
</ornate>
Dans l'éditeur ils auront 2 paramètres de scripts et un booléen pour mémoriser leur état.
<wall name="Bouton">
<image>Switch.png</image>
<param type="enum" values="Levier;Bouton vert;Bouton blau;Gros bouton">Type</param>
<param type="script">siOn</param>
<param type="script">siOff</param>
<param type="bool">estOn</param>
</wall>
Dans cette partie, j'ai écrit les scripts pour la plupart des boutons et quelques plaques de pression.
L'alcôve cachée
Target Wall 6 3 down
SetType 5
SetEnum Type 1
AddObject 10
SetType change le type de la target d'un mur de bouton à un mur d'alcôve.
//--------------------------------------------------------------------------
void CScripts::executeSetType(std::vector<std::string>& words)
{
int type = stoi(words[1]);
if (mTargetType == eTargetType_Tile)
{
}
else
{
CWall* target = (CWall*)mTarget;
target->setType(type);
}
}
//--------------------------------------------------------------------------
void CScripts::executeSetEnum(std::vector<std::string>& words)
{
QString param = QString::fromStdString(words[1]);
int type = stoi(words[2]);
if (mTargetType == eTargetType_Tile)
{
}
else
{
CWall* target = (CWall*)mTarget;
target->setEnumParam(param, type);
}
}
//--------------------------------------------------------------------------
void CScripts::executeAddObject(std::vector<std::string>& words)
{
int type = stoi(words[1]);
CObjectStack* stack = map.addObjectsStack(mTargetPos, mTargetSide);
CObject newObj;
newObj.setType(type);
stack->addObject(newObj);
}
Les 2 boutons suivants
Target Tile 5 9
SetBool estOuverte true
et "L02_CloseDoor05.txt"
Target Tile 5 9
SetBool estOuverte false
Le bouton suivant fermera un trou dans le sol. Ca sera pour une prochaine partie.
Le puzzle de la porte 19
Le puzzle de la porte 20
Target Tile 18 20
If Wall 22 19 right isOn
SetBool estOuverte true
Si la condition n'est pas remplie, la ligne suivant le "If" est sautée.
void CScripts::executeLine(std::vector<std::string>& words)
{
if (lastIf == true)
{
if (words[0] == "Target")
executeTarget(words);
else if (words[0] == "SetBool")
executeSetBool(words);
else if (words[0] == "SwitchBool")
executeSwitchBool(words);
else if (words[0] == "SetType")
executeSetType(words);
else if (words[0] == "SetEnum")
executeSetEnum(words);
else if (words[0] == "AddObject")
executeAddObject(words);
else if (words[0] == "If")
executeIf(words);
else if (words[0] == "SetString")
executeSetString(words);
}
else
{
lastIf = true;
}
}
La porte 24 et la pièce cachée
Target Wall 14 28 down
SetType 0
Target Wall 13 29 right
SetType 0
Le texte que disparait
Target Wall 22 8 left
SetType 1
Mais pour le faire réapparaître, on doit à la fois rechanger le type en mur de texte, mais aussi remettre le
Target Wall 22 8 left
SetType 6
SetString Texte WALL_TEXT03
La commande SetString est aussi simple que celle de SetBool:
void CScripts::executeSetString(std::vector<std::string>& words)
{
QString param = QString::fromStdString(words[1]);
if (mTargetType == eTargetType_Tile)
{
}
else
{
((CWall*)mTarget)->setStringParam(param, words[2]);
}
}