Genaueren Tacho?

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
  • Nabend,


    ich würde gerne einen sehr genaueren Tacho scripten.
    Ich habe einen der läuft über ein Timer.


    Wenn man dann fährt und auf einer geraden Strecke beschleunigt steht folgendes: 50, 55, 61, 64, 51, 70.


    Es ist halt sehr ungenau, also obwohl man beschleunigt zeigt er auf einmal weniger an. Und ich hätte gerne so ein genauen, das man eine Höchstgeschwindigkeit ablesen kann. Also bsp. 150 und nicht mehr.


    Ich hab mir überlegt es unter OnPlayerUpdate laufen zu lassen, doch es frisst ja sehr viele Resourcen.
    Gibt es noch andere Methoden, bzw. einen Weg über OnPlayerUpdate wo es nicht so viel frisst?


    Danke im Vorraus.



    Mit freundlichen Grüßen
    Litpa

  • Ja, ich verwende ja derzeit ein Timer, jedoch aktuallisiert es sich für mich zu langsam. So das die Tacho-Anzeige total unrealistisch erscheint.


    Auch wenn ich den Timer-Interval runtersetze ändert sich da nichts.

  • Berechnest du den speed über velocity?
    Wenn ja:
    velocity ist ressourcen sparend, hat aber das Problem, dass die ausgegebene Geschwindigkeit etwas spinnt.


  • #define TACHOTIMER 1000


    //OnGameModeInit
    SetTimer("UpdateTacho", TACHOTIMER, 1);


    new Float:Strecke,Float:Geschwindigkeit;
    new vehicleid = GetPlayerVehicleID(i);
    GetVehiclePos(GetPlayerVehicleID(i), X1[i], Y1[i], Z1[i]);
    Strecke = floatsqroot(floatpower(floatabs(floatsub(X1[i],X2[i])),2)+floatpower(floatabs(floatsub(Y1[i],Y2[i])),2)+floatpower(floatabs(floatsub(Z1[i],Z2[i])),2));
    Geschwindigkeit = (Strecke) * 3.6;
    new string[50];
    format(string, 50, "~p~%d", floatround(Geschwindigkeit));



    Und dann halt das das format in einem Textdraw angezeigt wird.
    Ist aber halt total ungenau.

  • Ja, so geht es dann schön schnell und fließend so wie ich es haben will.


    Nur es kommt irgendwie: 15, 16, 17, 24, 18, 26, 19..



    //edit: Mich würde es ja auch nicht wirklich stören wenn er sich so immer nach einer Sekunde aktuallisiert. Nur ich möchte es halt so, das wenn man auf der maximalen Geschwindigkeit eine Geschwindigkeit angezeigt wird, die auch standgehalten wird.
    Wenn ich jetzt zum Beispiel, nur geradeaus fahre und ganze Zeit das gleiche Tempo drauf hab, zeigt mein Tacho: 180, 175, 192, 165 usw..

    Einmal editiert, zuletzt von Litpa ()

  • Und den Timer den du Später Brauchst setzt du auf 150milisekunden,


    SetTimer("UpdateSpeedo",150,1);


    stock GetPlayerSpeed(playerid)
    {
    new Float:ST[4];
    if(IsPlayerInAnyVehicle(playerid))
    GetVehicleVelocity(GetPlayerVehicleID(playerid),ST[0],ST[1],ST[2]);
    else GetPlayerVelocity(playerid,ST[0],ST[1],ST[2]);
    ST[3] = floatsqroot(floatpower(floatabs(ST[0]), 2.0) + floatpower(floatabs(ST[1]), 2.0) + floatpower(floatabs(ST[2]), 2.0)) * 160.3;
    return floatround(ST[3]);
    }

  • nein wenn du jetzt sagen wir das mit einem Textdraw machen möchtest ja, dann must du es so machen:


    format(speed,sizeof(speed),"Km/H: %d",GetPlayerSpeed(i));
    TextDrawSetString(Text:KmH[i],speed);


    Du kannst damit auch abfragen machen wie z.B.

    if(GetPlayerSpeed(playerid) >= 80)
    {
    SetPlayerCheckpoint(playerid,FAHRSCHULCP2,4.0);
    FSCP[playerid] ++;
    }

  • Achso, ist ja sehr nützlich. Genau sowas hatte ich auch vor :)


    Nur ein Problem, kriege einen Error:

    stock GetPlayerSpeed(playerid)
    { //Errorzeile: 021: symbol already defined: "JBC_GetPlayerSpeed"
    new Float:ST[4];
    if(IsPlayerInAnyVehicle(playerid))
    GetVehicleVelocity(GetPlayerVehicleID(playerid),ST[0],ST[1],ST[2]);
    else GetPlayerVelocity(playerid,ST[0],ST[1],ST[2]);
    ST[3] = floatsqroot(floatpower(floatabs(ST[0]), 2.0) + floatpower(floatabs(ST[1]), 2.0) + floatpower(floatabs(ST[2]), 2.0)) * 160.3;
    return floatround(ST[3]);
    }


    //edit: Habs gefixt, hatte was in meinem Script mit dem gleichen Namen :)
    Klappt wunderbar, dankeschön! ^^

    Einmal editiert, zuletzt von Litpa ()