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.

results matching ""

    No results matching ""