Benutzer-Werkzeuge

Webseiten-Werkzeuge


Schleifen

Triggerschleife

Angeblich gibt es in Gothic keine Programmschleifen. Das ist aber nicht ganz richtig, jedoch muss man dazu zwei Sachen kombinieren:
Zuerst braucht man einen Scripttrigger in der Welt (hier heißt er SCHLEIFE), der nach x Sekunden (0 = keine Verzögerung) einen Script ausführt (hier jetzt TestSchleife). Der Trigger kann irgendwo an einer unerreichbaren Stelle sein, es ist nur wichtig, dass er existiert, ein Visual braucht er auch nicht. Der Trigger muss aber unendlich oft ausführbar sein und sollte mind. 1 Sekunde Verzögerung (delay) haben, damit Gothic etwas Luft zum reagieren hat.
Als zweites brauchen wir eine Funktion, die nach Ablauf den Trigger wieder feuert:

var string msg;
var int x;
func void TestSchleife ()
    {
    msg = IntToString (x);
    PrintScreen (msg, -1, x,"font_old_10_white.tga",_TIME_MESSAGE_XPGAINED);
    x++;
    if (x <= 10)         //Schleifenbedingung formulieren, kann nach Bedarf auch wo anders in der Funktion stehen
        {
        Wld_SendTrigger ("SCHLEIFE");   //Funktion erneut aufrufen lassen => Schleife entsteht
        };
    };

Rekursion

Eine andere Möglichkeit 'Schleifen' zu implementieren ist die Verwendung von Rekursion (eine Funktion ruft sich selbst auf bis eine Abbruchbedingung erfüllt ist).
Dies hat den Vorteil, dass keine Trigger benötigt werden und das Ergebnis sofort zurückgegeben wird - ohne das Risiko, dass sich während der Laufzeit der Schleife etwas in der Welt geändert haben könnte.

func int Npc_GetTalentSkillSum( var C_Npc npc )
{
    // Lokale Variablen behalten in Daedalus ihren Wert
    // ( vergleichbar mit 'static' Variablen in C/C++ )
    var int tal;
    var int sum;

    // Start - Summe initialisieren
    if ( 0 == tal )
    {
        sum = 0;
    };

    // Berechnung - Talentstufe addieren
    sum += Npc_GetTalentSkill( npc, tal );

    // Schrittweite - Index inkrementieren
    tal += 1;

    // Rekursion - Abbruchbedingung
    if ( tal < NPC_TALENT_MAX )
    {
        Npc_GetTalentSkillSum( npc );
    };

    // Ende - Index reinitialisieren
    tal = 0;

    return sum;
};

/** /
    // Beispielaufruf

    var int sum;
    sum = Npc_GetTalentSkillSum( hero );

    var string text;
    text = ConcatStrings( "Gelernte Talentstufen: ", IntToString( sum ) );

    PrintScreen ( text, -1, -1, FONT_Screen, 5 );	
/**/

Ikarus

Mit Ikarus sind Schleifen und Code-Sprünge nun auch möglich und ähneln anderen Programmiersprachen.

tipps_und_tricks/schleifen.txt · Zuletzt geändert: 2016/12/31 09:31 von milky-way