Partie 36: Les trous
Téléchargements
Paramètres
<tile name="Trou">
<image>Pit.png</image>
<param type="int">Niveau</param>
<param type="int">X</param>
<param type="int">Y</param>
<param type="bool">estFerme</param>
</tile>
Niveau, X and Y définissent la position où on atterrit après être tombé dans le trou.
Graphismes
struct SPitData
{
char file[32];
int16_t x, y;
};
static const SPitData gPits[WALL_TABLE_HEIGHT][(WALL_TABLE_WIDTH + 1) / 2] =
{
{{"Pit03.png", 0, 96}, {"Pit13.png", 6, 98}, {"Pit23.png", 80, 98}}, // Row 3
{{"", 0, 0}, {"Pit12.png", -1, 109}, {"Pit22.png", 66, 110}}, // Row 2
{{"", 0, 0}, {"Pit11.png", -3, 127}, {"Pit21.png", 43, 127}}, // Row 1
{{"", 0, 0}, {"Pit10.png", 0, 159}, {"Pit20.png", 27, 160}} // Row 0
};
void CTiles::drawPit(QImage* image, CVec2 tablePos)
{
const SPitData* data;
// récupère les données de la table
bool flip = (tablePos.x >= (WALL_TABLE_WIDTH + 1) / 2);
if (flip == false)
data = &gPits[tablePos.y][tablePos.x];
else
data = &gPits[tablePos.y][WALL_TABLE_WIDTH - tablePos.x - 1];
// affichage
if (data->file[0] != 0)
{
std::string fileName = std::string("gfx/3DView/pits/") + std::string(data->file);
QImage pitImage = fileCache.getImage(fileName);
CVec2 pos = CVec2(data->x, data->y);
if (flip == true)
pos.x = MAINVIEW_WIDTH - pos.x - pitImage.width();
QRect clip(0, 33, MAINVIEW_WIDTH, MAINVIEW_WIDTH);
graph2D.drawImage(image, pos, pitImage, 0, flip, clip);
}
}
Il n'y a pas de graphisme pour les trous fermés, même si dans les graphismes d'origine, il y avait des images de
Tomber
if (destTile->getType() == eTilePit && destTile->getBoolParam("estFerme") == false)
{
sound->play(pos, "sound/Scream.wav");
shouldFall = true;
interface.setMainState(CInterface::eMainFall);
}
La seule chose spéciale c'est que dans mainLoop() on attend que le son soit fini avant d'appeler la fonction pour
if (player.shouldFall && sound->isFinished(player.pos, "sound/Scream.wav") == true)
player.fall();
Cette fonction fall() est une version simplifiée de la fonction teleport().
void CPlayer::fall()
{
CTile* tile = map.getTile(pos);
int level = tile->getIntParam("Niveau");
CVec2 newPos = CVec2(tile->getIntParam("X"), tile->getIntParam("Y"));
game.loadLevel(level, newPos, dir);
shouldFall = false;
interface.setMainState(CInterface::eMainGame);
}
Poser des objets dans les trous
void CGame::fallStacks(CVec2 mapPos)
{
CTile* tile = map.getTile(mapPos);
std::vector<CObjectStack> copyStacks;
// copie les tas
for (int y = 0; y < 2; ++y)
for (int x = 0; x < 2; ++x)
{
CVec2 objPos = mapPos * 2 + CVec2(x, y);
CObjectStack* stack = map.findObjectsStack(objPos, eWallSideMax);
if (stack != NULL)
{
CObjectStack copy = *stack;
copy.mPos = CVec2(x, y);
copyStacks.push_back(copy);
map.removeObjectsStack(objPos, eWallSideMax);
}
}
int lastLevel = currentLevel;
CVec2 lastPos = player.pos;
uint8_t lastDir = player.dir;
int level = tile->getIntParam("Niveau");
CVec2 newPos = CVec2(tile->getIntParam("X"), tile->getIntParam("Y"));
// charge le niveau de destination
loadLevel(level, CVec2(), 0);
// mets les tas à la nouvelle position
for (size_t i = 0; i < copyStacks.size(); ++i)
{
CVec2 objPos = newPos * 2 + copyStacks[i].mPos;
CObjectStack* stack = map.addObjectsStack(objPos, eWallSideMax);
for (size_t j = 0; j < copyStacks[i].getSize(); ++j)
stack->addObject(copyStacks[i].getObject(j));
}
// recharge le dernier niveau
loadLevel(lastLevel, lastPos, lastDir);
}
Le niveau 3 et les scripts