siredmar / mdcii-engine

Platform independent remake of the game Anno 1602/1602AD.
GNU General Public License v2.0
19 stars 3 forks source link

Fragen zur Insel.cpp #85

Open stwe opened 4 years ago

stwe commented 4 years ago

Ich habe mal drei Fragen zum Verständnis der Insel.cpp

https://github.com/siredmar/mdcii-engine/blob/master/source/mdcii/mdcii/src/insel.cpp

Dort gibt es zwei Member schicht1 und schicht2, welche jeweils mit der Breite und Höhe der Insel initialisiert werden. Warum zwei Schichten?

this->schicht1 = new inselfeld_t[this->width * this->height];
this->schicht2 = new inselfeld_t[this->width * this->height];

Später im Ctor wird die Funktion this->insel_rastern aufgerufen:

// void Insel::insel_rastern(inselfeld_t* a, uint32_t length, inselfeld_t* b, uint8_t width, uint8_t height)
this->insel_rastern((inselfeld_t*)inselhaus->data, inselhaus->length / 8, schicht2, this->width, this->height);

In dieser Methode sind mir zwei Sachen unklar. Der Zeiger a hat bereits die Inselhaus-Daten der Insel samt der jeweiligen x und y Position und der BebauungsId auf der Insel. Warum der Zeiger b?

Dann wird b in den Zeilen 61 - 69 mit den Daten aus a gefüllt. Die x und y Position werden jetzt aber in b so überschrieben, dass dort nicht mehr die Position auf der Insel steht, sondern die Werte den von buildingHeight und buildingWidth entsprechen. Warum wird das gemacht?

for (int y = 0; y < buildingHeight && feld.y_pos + y < height; y++)
{
    for (int x = 0; x < buildingWidth && feld.x_pos + x < width; x++)
    {
        b[(feld.y_pos + y) * width + feld.x_pos + x] = feld;
        b[(feld.y_pos + y) * width + feld.x_pos + x].x_pos = x;  // <---- warum 
        b[(feld.y_pos + y) * width + feld.x_pos + x].y_pos = y;  // <---- warum
    }
}

Danke.