Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Bug / Denkfehler bei Clusters in Verbindung mit mehrkachelHäusern
#1
simcity.cc
Funktion: renovate_city_building

Zitat:    uint32 neighbor_building_clusters = 0;
    sint8 zpos = gb->get_pos().z;
    koord minsize = gb->get_tile()->get_desc()->get_size(gb->get_tile()->get_layout());
    for(  int i = 0;  i < 4;  i++  ) {
        // since we handle buildings larger than (1x1) we add an offset
        grund_t* gr = welt->lookup_kartenboden(k + neighbors[i]+minsize-koord(1,1));
        if(  gr  &&  gr->get_typ() == grund_t::fundament  &&  gr->obj_bei(0)->get_typ() == obj_t::gebaeude  ) {
            // We have a building as a neighbor...
            if(  gebaeude_t const* const testgb = obj_cast<gebaeude_t>(gr->first_obj())  ) {
                // We really have a building as a neighbor...
                const building_desc_t* neighbor_building = testgb->get_tile()->get_desc();
                neighbor_building_clusters |= neighbor_building->get_clusters();
            }
        }
    }

Das (rote Markierung) sieht schick aus, eine richtig elegante Lösung, aber sie  funktioniert so nicht.

Wollen wir mal neighbors[i] dazu ansehen:
static koord const neighbors[] = {
    koord( 0,  1),
    koord( 1,  0),
    koord( 0, -1),
    koord(-1,  0),

das sind die Koordinaten von unten,rechts, links und oben.

Wenn wir zur x Koordinate 1 addieren so sind wir recht neben der Position.
Wenn das Gebäude mehrere Kacheln hat und wir addieren 1 + (Größe Kacheln -1) dann sind wir rechts neben dem Gebäude, auch dann wenn es mehrere x Kacheln breit ist.

So und jetzt links.
Wenn wir x mit -1 addieren sind wir links neben der Position.
Wenn wir x mit -1 addieren + (Größe Kacheln -1) stehen wir nicht links neben dem Gebäude sind irgendwo im Gebäude selbst. Es sei den das Gebäude ist nur eine Kachel breit, dann gilt + (1-1) also + 0;

also wenn in neighbors[] ein negativer Wert steht darf minsize-koord(1,1) nicht addiert werden.
Da in Koord x oder auch y negativ werden können, ist das nicht so einfach.

Ich kenn mich mit C++ und objektorientierter Programmierung nicht so aus, aber ich kenne keine Elegante Lösung des Problems.

Ich würde halt schreiben:
if (x>0) x += minsize.x - 1;
if (y>0) y += minsize.y - 1;
-------------------------------------------------
Noch am Rande:
Ich hätte das zu ersetzende Gebäude selbst, auch gerne in neighbor_building_clusters, also die Koordinate (0,0)

und als Sahnehäubchen:
Wenn das links rechts usw. auf eine Straße trifft, dann könnte man statt dessen einen Schritt in die gleiche Richtung weiter gehen.
Nur einen Schritt, das reicht um auf die andere Straßenseite zu schauen. Also keine Schleife, weil man sonst eine Straße entlang durch die ganze Stadt schaut.
Zitieren
#2
Sollte in 8842 besser funktionieren.
Zitieren
#3
(14-10-2019, Monday-02:50:41 )prissi schrieb: Sollte in 8842 besser funktionieren.

Danke für den schnellen Einbau.
Heart
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste