Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 bool MapGenerator::didRoomsCollide(std::vector <std::vector <int> > existingRooms, std::vector<int> newRoom, int dif) { dif = (getRandom(dif, dif + 1)); if (existingRooms.size() <= 0) { // std::cout << "0 Räume" << std::endl; return false; } int newx1 = newRoom[0]; int newx2 = newRoom[1]; int newy1 = newRoom[2]; int newy2 = newRoom[3]; // std::cout << "newX1 " + std::to_string(newx1) + "; newX2 " + std::to_string(newx2) + "; newY1 " + std::to_string(newy1) + "; newY2 " + std::to_string(newy2) << std::endl; for (int i = 0; i < existingRooms.size(); i++) { int x1 = existingRooms[i][0]; int x2 = existingRooms[i][1]; int y1 = existingRooms[i][2]; int y2 = existingRooms[i][3]; if ((newx1 > (x1 - dif) && newx1 < (x2 + dif)) && (newy1 > (y1 - dif) && newy1 < (y2 + dif))) { return true; } else if ((newx2 > (x1 - dif) && newx1 < (x2 + dif)) && (newy2 > (y1 - dif) && newy1 < (y2 + dif))) { return true; } else if ((newx1 > (x1 - dif) && newx1 < (x2 + dif)) && (newy2 > (y1 - dif) && newy1 < (y2 + dif))) { return true; } else if ((newx2 > (x1 - dif) && newx1 < (x2 + dif)) && (newy1 > (y1 - dif) && newy1 < (y2 + dif))) { return true; } else { } } //std::cout << "------------------" << std::endl; return false; }
Beim Generieren der Map kommt das Programm irgendwann an den Punkt, die Räume zufällig auf der Karte zu verteilen. Hierzu lege ich vorab einen Größenbereich fest, welcher Abhängig von der Größe der Karte ist, sowie eine Anzahl an zu erstellenden Räumen. Diese Werte werden durch Zufallszahlen beeinflusst.
Die bereits "erstellen" Räume speichere ich in einem zweidimensionalen Array, jeweils mit den Daten X1 (links), X2 (rechts), Y1 (oben) und Y2 (unten).
Soll nun ein neuer Raum erstellt werden, so übergebe ich meiner Bool-Funtkion den zu erstellenden Raum, die aktuellen Räume und einen int-Wert an die oben stehende Funktion. Der Rückgabewert ist true für "Kollision vorhanden" und "false" für "keine Kollision". Hier wird nun geprüft, ob sich der neue Raum innerhalb des Radius des int-Wertes von einem der bestehenden Räume befinden würde.
Ist das der Fall, so wird der Raum verworfen und ein neuer Versuch gestartet.
Zuerst einmal wird festgelegt, ob der nötige Abstandswert um eins erhöht wird oder nicht, dies erfolgt zufällig und dient dazu, dass vereinzelt Räume vorkommen welche direkt aneinander grenzen. Sollte das Array mit den bestehenden Räumen leer sein, wird sofort false zurückgegeben, da das Durchlaufen der Funktion nicht nötig ist.
Nun speichere ich die Variablen aus den Arrays erst einmal in einzelne int's um, da ich somit übersichtlicher und verständlicher arbeiten kann.
Jetzt wird pro bereits vorgandendem Raum die Kontrollschleife durchlaufen und eine Kollision geprüft.
Dies geschieht wie folgt:
Er wird geprüft, ob einzelne Ecken des neuen Raumes in einem der anderen Räume liegen würden. Dies wiederum geschieht durch prüfen, ob zwei nebeneinander liegende Seiten des neuen Raumes zwischen den Seiten des bestehenden Raumes liegen. Ist dies der Fall, so gibt die Funktion true zurück. Dieses Prozedere wird vier mal, also für alle Seitenkombinationen, vollzogen.
Ist nach der letzten Überprüfung keine Kollision festgestellt wurden, so wird false zurückgegeben.
Administrator
Treue Seele
Werbeanzeige