Algorithms

Aus hyperdramatik
Zur Navigation springen Zur Suche springen

Alle Snippets sind zunächst Pseudocode und je nach verwendeter Programmiersprache anzupassen.

Generell

Finde die Stelle mit der höchsten Zahl in einem Array von Zahlen

int höchsteZahl = -1000000;
int stelle = -1;

for (int i=0;i<arrayName.länge;i++){

 if (arrayName[i]>höchsteZahl){
   stelle=i;
   höchsteZahl=arrayName[i];
 }

}

Arduino

Führe eine Funktion einmalig aus, wenn ein Button gedrückt ist, und einmalig etwas anderes, wenn er losgelassen wird

int buttonDown =0;
int inputPin = 5; //hier muss der Pin eingetragen sein, an dem der Button hängt

[...]

void loop(){
  
  if (digitalRead(inputPin)==LOW){
    buttonDown++;
  }
  
  if (buttonDown==1){
     DoSomethingOnceWhenPressed();
  }

  if (digitalRead(inputPin)==HIGH && buttonDown>0){
    DoSomethingOnceWhenReleased();
    buttonDown=0;
  }
  
}

Mache etwas alle x-Durchläufe

int loopCounter=0;
int alleXLoops = 15; //Führt eine Funktion alle 15 loops aus
[...]

void loop(){
  
  loopCounter++;
  
  if (loopCounter%alleXLoops==0){
    DoSomethingEveryXLoops(); 
  }

}

Unity

Führe eine Funktion einmalig aus, wenn ein bestimmter Zustand erreicht ist

  • die ganz einfache Methode (sehr fehlerbehaftet, wenn zustand sich zwischen Frames nicht ändert):
public bool bZustand=false;

void Update(){

  if (/*ZustandsAbfrage*/){
    bZustand=true;
  }  

  if (bZustand){
    DoSomethingOnce();
    bZustand=false;
  }

}
  • bessere Variante ist, den Zustand als ganze Zahl, (noch besser als struct zu speichern), und die Funktion beim Zustandswechsel aufzurufen. Hier beispielweise, führen wir eine Funktion aus, wenn wir von Zustand 0 auf Zustand 1 übergehen:
public int zustand=0;

void Update(){

  if (/*Zustandsabfrage*/ && zustand != 1){
    DoSomethingOnce();
    zustand=1;
  }

}

Verändere die Position eines Objektes kontinuierlich entlang einer Achse

public GameObject meinObjekt //hier muss im Editor das Objekt das bewegt werden soll abgelegt werden

void Update(){
  meinObjekt.transform.position += new Vector3(xWert,yWert,zWert); 
}

Was ist ein IEnumerator und wann benutze ich ihn

Ein IEnumerator ist eine bestimmte Art von Funktion, die es erlaubt, Dinge über Zeit auszuführen. Ich benutze IEnumerator wenn ich:

  • eine längere Sequenz von Aktionen hintereinander ausführen will, die 'nicht' alle im selben Bild stattfinden sollen
  • eine bestimmte Zeit lang etwas ausführen möchte, z.b. ein Objekt 3 Sekunden lang nach oben bewegen
  • etwas nach einer bestimmten Zeit ausführen möchte, z.B. nach 15 Sekunden einen Ton abspielen will

IEnumerator werden oft ausgeführt, wenn ein bestimmter Zustand erreicht ist (z.B. ein Button geklickt, ein Trigger ausgelöst, eine Position erreicht, etc.)

Wie rufe ich eine IEnumerator Funktion auf

Für gewöhnlich werden Funktionen über ihren Funktionsnamen und die dazugehörigen Parameter aufgerufen: MeineFunktion(int ganzeZahl); Bei IEnumerator wird die Funktion über den Befehl "StartCoroutine" aufgerufen: StartCoroutine(MeineIEnumeratorFunktion(int ganzeZahl));

Was ist bei IEnumerator zu beachten

Auch IEnumerator können mehrfach ausgeführt werden und laufen dann Parallel.


Von einer Farbe über Zeit zu einer anderen wechseln, per IEnumerator

IEnumerator ChangeColor(){

  Color colornew = new Color();
  float t = 0;
  float amountOfSeconds = 4.0f;
  while (t < 1.0f)
  {
     colornew = Color.Lerp(colorBegin, Color.magenta, t);
     GetComponent<Renderer>().material.color = colornew;
     
     t += Time.deltaTime/amountOfSeconds;
     yield return new WaitForEndOfFrame();
  }

}