Automata (State machine)

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Eine schöne und nützliche Funktion, die ich gerne mal vorstellen wollte, weil ich extrem selten sehe, dass es Leute benutzen.


    Ein kurzes Beispiel, wie man es verwenden kann:
    Wie ihr es normal benutzt:
    #include <a_samp>
    forward change();
    new Type = 0;
    main()
    {
    SetTimer("change", 10000, 0);
    }
    public OnGameModeExit()
    {
    if(Type == 0)
    {
    printf("Mode ausgeschaltet");
    }
    if(Type == 1)
    {
    printf("Mode durch Timer ausgeschaltet");
    }
    return 1;
    }
    public change()
    {
    Type = 1;
    GameModeExit();
    }
    Und wie man es mit Automata macht:
    #include <a_samp>
    forward change();
    main()
    {
    state exitType:normal;
    SetTimer("change", 10000, 0);
    }
    public OnGameModeExit() <Type:normal>
    {
    printf("Mode hat normal geendet");
    }
    public OnGameModeExit() <Type:gmx>
    {
    printf("Mode durch Timer geendet");
    }
    public change()
    {
    state Type:gmx;
    GameModeExit();
    }
    Erklärung:
    public OnGameModeExit() <Type:normal>
    OnGameModeExit wird hier nur aufgerufen, wenn Type = normal ist.


    Die Vorteile:
    - Weniger Code
    - Weniger globale Variablen
    - Weniger Ressourcenverbrauch


    Mit if Abfragen arbeiten. Dies ist natürlich auch möglich. Hier ein kleines Beispiel:
    public OnPlayerCommandText(playerid, cmdtext[]) <Status:Eins>
    {
    state (!strcmp(cmdtext, "/status")) Status:Zwei;
    }


    public OnPlayerCommandText(playerid, cmdtext[]) <Status:Zwei>
    {
    state (!strcmp(cmdtext, "/status")) Status:Eins;
    }
    Erklärung:
    state (Bedingung) NeuerStatus
    In diesem Fall:
    Wenn die Bedingung erfüllt ist (Man hat /status eingegeben) wird der Status gesetzt. Ein weiteres Beispiel:
    state (x == 2) Status:Wahr;
    In der normalen Form wäre dies
    if (x == 2)
    {
    state Status:Wahr;
    }


    Verschiedene Staten:


    public OnPlayerDisconnect(playerid)
    {
    = Wird immer ausgeführt


    public OnPlayerDisconnect(playerid) <Status:Ein>
    {
    = Wird ausgeführt, wenn Status = EIn ist


    public OnPlayerDisconnect(playerid) <Status:Ein,Status:Aus>
    {
    = Wird ausgeführt, wenn Status = Ein oder Status = Aus ist


    entry()


    entry() wird immer ausgeführt, wenn ein Status verändert wird. Also wenn man
    stats x:An;
    verwendet wird entry() aufgerufen. Hier ein Beispiel


    main()
    {
    print("Das");
    state State:xD;
    print(" Breadfish");
    }
    entry() <State:xD>
    {
    print(" ist");
    }


    Es gibt folgendes aus: "Das ist Breadfish");


    Playerstatus


    Meines Wissens ist es nicht möglich einen Status für eine bestimmte playerid zu setzen. Außerdem darf der Status nicht mit einer Zahl beginnen.



    Original Post


    Edit: Rechtschreibfehler ausgebessert

    Einmal editiert, zuletzt von NeoPhoenix aka ArgonX5 ()

  • Siehe ersten Satz^^ Naja ich arbeite seit einiger Zeit damit und joa... Spart halt Zeit finde ich irgendwie

  • Ich komm damit iwie nicht klar^^
    Also mit dem Tutorial :S

    dcmd_greenpeace(playerid,params[]) {
    #pragma unused params
    SendClientMessage(playerid, Grün, "Rettet die Wale,esst mehr Bieber!");
    return 1;
    }


    Mapplanung:
    Etwas einzigartiges was noch kein anderer veröffentlicht hat.
    70% fertig.