Hilfsfunktion
Closure für Pillar
Positionen
Autor: Andy Eckhardt
Ein Chunk
beinhaltet einen Vektor der gefüllt ist mit den HexPillars
. Da man an diesen oft etwas ausführen muss, haben wir eine Methode implementiert, die mit einer Closure aufgerufen wird.
Eine Closure umwickelt eine Funktion oder eine Variable. Wird beispielsweise einer Methode eine Closure übergeben, so greift die Methode auf den Inhalt der Closure zu. Es ist vergleichbar mit einem Objekt, welches mit Attributen und Methoden versehen ist, die einen eigenen Zustand und ein Verhalten in sich beinhalten.
for q in 0..world::CHUNK_SIZE {
for r in 0..world::CHUNK_SIZE {
let pos = AxialPoint::new(q.into(), r.into()).to_real();
pillars_pos.push(pos);
}
}
Die Methode for_pillars_positions<F>(…)
durchläuft mit q
und r
von 0 bis CHUNK_SIZE
und erstellt bei jedem Schritt ein AxailPoint
, welcher an die Closure übergeben wird. Die Funktion in der Closure würde beispielsweise einen Chunk
erstellen mit den dazugehörigen Pillar
Positionen.
Iterator für Chunk
Autor: Andy Eckhardt
Es musste eine Iterator erstellt werden, der durch das Feld pillars
des Chunk
iteriert und jedes Element ausgibt. Dadurch kann durch den Aufruf next()
ein Item
retuniert werden, welches zusammengesetzt ist aus einem AxialVektor
und einem HexPillar
.
pub struct ChunkPillars<'a> {
pillars: &'a [HexPillar],
i: u16,
}
Damit der Zustand des Index vom Iterator erhalten bleibt musste der Index als eine statische Variable gesichert werden. In Rust muss die Variable somit ein Feld der Struktur sein.
fn next(&mut self) -> Option<Self::Item> {
if self.i < CHUNK_SIZE * CHUNK_SIZE {
let axial = AxialVector::new((self.i / CHUNK_SIZE).into(),
(self.i % CHUNK_SIZE).into());
let item = (axial, &self.pillars[self.i as usize]);
self.i += 1;
Some(item)
} else {
None
}
}
Das Iterieren erfolgt durch eine einzige If – Schleife. Bei jedem Durchlauf wird der dazugehörige AxialVektor
errrechnet und mit dem dazugehörigen Pillar
an item
übergeben.