Kilometerzähler tut nicht das was er soll

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


    ich habe einen Kilometerzähler gebastelt. Leider macht er nicht das, was er soll.
    Sobald ich in das Fahrzeug einsteige zählt der Zähler hoch bis auf ca. 131 Millionen und bleibt dann stehen.
    Er zieht nichts mehr ab, bzw rechnet etwas drauf.


    Hier der Code:
    GetVehiclePos(veh,pNewKM[0][i],pNewKM[1][i],pNewKM[2][i]);
    new Distance=floatsqroot((pNewKM[0][i]-pOldKM[0][i])*(pNewKM[0][i]-pOldKM[0][i])+(pNewKM[1][i]-pOldKM[1][i])*(pNewKM[1][i]-pOldKM[1][i])+(pNewKM[2][i]-pOldKM[2][i])*(pNewKM[2][i]-pOldKM[2][i]));
    KM[veh] += Distance;
    GetVehiclePos(veh,pOldKM[0][i],pOldKM[1][i],pOldKM[2][i]);
    format(string,sizeof string,"%d KM",KM[veh]);
    TextDrawSetString(KManzeige[veh],string);
    Das floatsqroot habe ich aus dem allerseits bekannten GetDistanceFromPointToPoint genommen und umgeschrieben.
    Das erste OldKM wird hier gesetzt:
    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    if(newstate == PLAYER_STATE_DRIVER)
    {
    new str[512],veh;
    veh=GetPlayerVehicleID(playerid);
    GetVehiclePos(veh,pOldKM[0][playerid],pOldKM[1][playerid],pOldKM[2][playerid]);


    Warum zeigt er so eine immens hohe Zahl an?
    (Vielleicht Jeffry: ?)


    lg

  • GetVehiclePos(veh,pNewKM[0][i],pNewKM[1][i],pNewKM[2][i]);
    new Distance=floatround(floatsqroot( ((pNewKM[0][i]-pOldKM[0][i])*(pNewKM[0][i]-pOldKM[0][i])) +((pNewKM[1][i]-pOldKM[1][i])*(pNewKM[1][i]-pOldKM[1][i])) + ((pNewKM[2][i]-pOldKM[2][i])*(pNewKM[2][i]-pOldKM[2][i])) ));
    KM[veh] += Distance;
    pOldKM[0][i] = pNewKM[0][i];
    pOldKM[1][i] = pNewKM[1][i];
    pOldKM[2][i] = pNewKM[2][i];
    format(string,sizeof string,"%d KM",KM[veh]);
    TextDrawSetString(KManzeige[veh],string);


    Wie sieht es damit aus?

  • Debugge es mal, ich sehe da eigentlich nichts was falsch ist.
    GetVehiclePos(veh,pNewKM[0][i],pNewKM[1][i],pNewKM[2][i]);
    printf("%f | %f | %f | %f | %f | %f |",pNewKM[0][i],pNewKM[1][i],pNewKM[2][i],pOldKM[0][i],pOldKM[1][i],pOldKM[2][i]);
    new Distance=floatround(floatsqroot( ((pNewKM[0][i]-pOldKM[0][i])*(pNewKM[0][i]-pOldKM[0][i])) +((pNewKM[1][i]-pOldKM[1][i])*(pNewKM[1][i]-pOldKM[1][i])) + ((pNewKM[2][i]-pOldKM[2][i])*(pNewKM[2][i]-pOldKM[2][i])) ));
    printf("distance = %d", Distance);
    KM[veh] += Distance;
    printf("KM[veh] = %d", KM[veh]);
    pOldKM[0][i] = pNewKM[0][i];
    pOldKM[1][i] = pNewKM[1][i];
    pOldKM[2][i] = pNewKM[2][i];
    format(string,sizeof string,"%d KM",KM[veh]);
    TextDrawSetString(KManzeige[veh],string);
    Dann poste den Log.



    Alternativ: http://forum.sa-mp.com/showthread.php?t=404367

  • Dann poste den Log.


  • Also dort wo bei dir der erste große Wert raus kommt, kommt bei mir:
    [12/09/2014 21:11:46] -328.983337 | 833.730590 | 13.970005 | -328.748352 | 832.689819 | 13.986113 |
    [12/09/2014 21:11:46] distance = 1


    Ich habe die Werte einfach gesetzt, kommt ja aufs gleiche raus.


    Füge mal unter OnGameModeInit den Code ein, und poste was kommt wenn du den Server startest:
    new i;
    pNewKM[0][i] = -328.983337;
    pNewKM[1][i] = 833.730590;
    pNewKM[2][i] = 13.970006;
    pOldKM[0][i] = -328.748352;
    pOldKM[1][i] = 832.689819;
    pOldKM[2][i] = 13.986114;
    printf("%f | %f | %f | %f | %f | %f |",pNewKM[0][i],pNewKM[1][i],pNewKM[2][i],pOldKM[0][i],pOldKM[1][i],pOldKM[2][i]);
    new Distance=floatround(floatsqroot( ((pNewKM[0][i]-pOldKM[0][i])*(pNewKM[0][i]-pOldKM[0][i])) +((pNewKM[1][i]-pOldKM[1][i])*(pNewKM[1][i]-pOldKM[1][i])) + ((pNewKM[2][i]-pOldKM[2][i])*(pNewKM[2][i]-pOldKM[2][i])) ));
    printf("distance = %d", Distance);


  • Code
    [21:14:49] -328.983337 | 833.730590 | 13.970005 | -328.748352 | 832.689819 | 13.986113 |
    [21:14:49] distance = 1


    hm..

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • 8| Das macht gar keinen Sinn.


    Kannst du mal den gesamten Timer (auch wie du ihn startest (und wo)) posten, damit ich es selbst testen kann, ob bei mir das gleiche ausgegeben wird, wenn man ingame fährt? Irgendwo muss da ein Fehler sein, vielleicht aber gar nicht in dem Teil den du gepostet hast.

  • Timer wird unter OnGameModeInit gestartet:
    SetTimer("Speedometer",500,1);


    Hier mein Speedopublic:
    public Speedometer()
    {
    for(new i;i<MAX_PLAYERS;i++) {
    if(!IsPlayerNPC(i)) {
    if(IsPlayerConnected(i) && GetPVarInt(i,"Eingeloggt") == 1) {
    if(IsPlayerInAnyVehicle(i) && GetPlayerVehicleSeat(i) == 0) {
    new Float:CarHealth,chealth,string[512],string1[128],kmh,modelid,veh,Float:Distance;
    veh=GetPlayerVehicleID(i);
    modelid=GetVehicleModel(veh);
    GetVehicleHealth(veh,CarHealth);
    CarHealth = CarHealth - 250;
    CarHealth = CarHealth /10;
    CarHealth = CarHealth /75;
    CarHealth = CarHealth *100;
    chealth=floatround(CarHealth,floatround_floor);
    kmh=GetPlayerSpeed(i, true);
    if(Motor[veh] == false && Licht[veh] == false) {
    PlayerTextDrawSetString(i, Tacho1[i],"~r~Motor ~r~Licht");
    } else if(Motor[veh] == true && Licht[veh] == false) {
    PlayerTextDrawSetString(i, Tacho1[i],"~g~Motor ~r~Licht");
    } else if(Motor[veh] == true && Licht[veh] == true) {
    PlayerTextDrawSetString(i, Tacho1[i],"~g~Motor ~g~Licht");
    } else if(Motor[veh] == false && Licht[veh] == true) {
    PlayerTextDrawSetString(i, Tacho1[i],"~r~Motor ~g~Licht");
    }
    GetVehiclePos(veh,pNewKM[0][i],pNewKM[1][i],pNewKM[2][i]);
    printf("%f | %f | %f | %f | %f | %f |",pNewKM[0][i],pNewKM[1][i],pNewKM[2][i],pOldKM[0][i],pOldKM[1][i],pOldKM[2][i]);
    new Distance=floatround(floatsqroot( ((pNewKM[0][i]-pOldKM[0][i])*(pNewKM[0][i]-pOldKM[0][i])) +((pNewKM[1][i]-pOldKM[1][i])*(pNewKM[1][i]-pOldKM[1][i])) + ((pNewKM[2][i]-pOldKM[2][i])*(pNewKM[2][i]-pOldKM[2][i])) ));
    printf("distance = %d", Distance);
    KM[veh] += Distance;
    printf("KM[veh] = %d", KM[veh]);
    pOldKM[0][i] = pNewKM[0][i];
    pOldKM[1][i] = pNewKM[1][i];
    pOldKM[2][i] = pNewKM[2][i];
    format(string,sizeof string,"%d KM",KM[veh]);
    TextDrawSetString(KManzeige[veh],string);
    switch(Tank[veh]/(MaxTank[(modelid)-400]/10))
    {
    case 10: format(string,sizeof string,"Geschwingidkeit: %d km/h~n~Tankinhalt: ~g~I I I I I I I I I I ~w~(%d/%dL)~n~Zustand: %d%%~n~Fahrzeug: %s",kmh,Tank[veh],MaxTank[(modelid)-400],chealth,PlayerVehicle[modelid - 400]);
    case 9: format(string,sizeof string,"Geschwingidkeit: %d km/h~n~Tankinhalt: ~g~I I I I I I I I I ~r~I ~w~(%d/%dL)~n~Zustand: %d%%~n~Fahrzeug: %s",kmh,Tank[veh],MaxTank[(modelid)-400],chealth,PlayerVehicle[modelid - 400]);
    case 8: format(string,sizeof string,"Geschwingidkeit: %d km/h~n~Tankinhalt: ~g~I I I I I I I I ~r~I I ~w~(%d/%dL)~n~Zustand: %d%%~n~Fahrzeug: %s",kmh,Tank[veh],MaxTank[(modelid)-400],chealth,PlayerVehicle[modelid - 400]);
    case 7: format(string,sizeof string,"Geschwingidkeit: %d km/h~n~Tankinhalt: ~g~I I I I I I I ~r~I I I ~w~(%d/%dL)~n~Zustand: %d%%~n~Fahrzeug: %s",kmh,Tank[veh],MaxTank[(modelid)-400],chealth,PlayerVehicle[modelid - 400]);
    case 6: format(string,sizeof string,"Geschwingidkeit: %d km/h~n~Tankinhalt: ~g~I I I I I I ~r~I I I I ~w~(%d/%dL)~n~Zustand: %d%%~n~Fahrzeug: %s",kmh,Tank[veh],MaxTank[(modelid)-400],chealth,PlayerVehicle[modelid - 400]);
    case 5: format(string,sizeof string,"Geschwingidkeit: %d km/h~n~Tankinhalt: ~g~I I I I I ~r~I I I I I ~w~(%d/%dL)~n~Zustand: %d%%~n~Fahrzeug: %s",kmh,Tank[veh],MaxTank[(modelid)-400],chealth,PlayerVehicle[modelid - 400]);
    case 4: format(string,sizeof string,"Geschwingidkeit: %d km/h~n~Tankinhalt: ~g~I I I I ~r~I I I I I I ~w~(%d/%dL)~n~Zustand: %d%%~n~Fahrzeug: %s",kmh,Tank[veh],MaxTank[(modelid)-400],chealth,PlayerVehicle[modelid - 400]);
    case 3: format(string,sizeof string,"Geschwingidkeit: %d km/h~n~Tankinhalt: ~g~I I I ~r~I I I I I I I ~w~(%d/%dL)~n~Zustand: %d%%~n~Fahrzeug: %s",kmh,Tank[veh],MaxTank[(modelid)-400],chealth,PlayerVehicle[modelid - 400]);
    case 2: format(string,sizeof string,"Geschwingidkeit: %d km/h~n~Tankinhalt: ~g~I I ~r~I I I I I I I I ~w~(%d/%dL)~n~Zustand: %d%%~n~Fahrzeug: %s",kmh,Tank[veh],MaxTank[(modelid)-400],chealth,PlayerVehicle[modelid - 400]);
    case 1: format(string,sizeof string,"Geschwingidkeit: %d km/h~n~Tankinhalt: ~g~I ~r~I I I I I I I I I ~w~(%d/%dL)~n~Zustand: %d%%~n~Fahrzeug: %s",kmh,Tank[veh],MaxTank[(modelid)-400],chealth,PlayerVehicle[modelid - 400]);
    case 0: format(string,sizeof string,"Geschwingidkeit: %d km/h~n~Tankinhalt: ~r~I I I I I I I I I I ~w~(%d/%dL)~n~Zustand: %d%%~n~Fahrzeug: %s",kmh,Tank[veh],MaxTank[(modelid)-400],chealth,PlayerVehicle[modelid - 400]);
    }
    PlayerTextDrawSetString(i, Tacho0[i], string);
    } else {
    TextDrawHideForPlayer(i, TachoBox);
    PlayerTextDrawHide(i, Tacho0[i]);
    PlayerTextDrawHide(i, Tacho1[i]);
    TextDrawHideForPlayer(i, KManzeige[GetPVarInt(i,"LastVeh")]);
    }
    }
    }
    }
    return 1;
    }


    Und OnPlayerStateChange:
    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    if(newstate == PLAYER_STATE_DRIVER)
    {
    new str[512],veh;
    veh=GetPlayerVehicleID(playerid);
    GetVehiclePos(veh,pOldKM[0][playerid],pOldKM[1][playerid],pOldKM[2][playerid]);
    format(str,sizeof str,"Um den Motor des Fahrzeuges zu starten halte ~k~~VEHICLE_HANDBRAKE~ und ~k~~CONVERSATION_NO~ gedrückt!");
    SendClientMessage(playerid,COLOR_WHITE,str);
    TextDrawShowForPlayer(playerid, TachoBox);
    TextDrawShowForPlayer(playerid, KManzeige[veh]);
    PlayerTextDrawShow(playerid, Tacho0[playerid]);
    PlayerTextDrawShow(playerid, Tacho1[playerid]);
    SetPVarInt(playerid,"LastVeh",veh);
    }
    return 1;
    }


    Dann teste mal o.o

  • new Float:CarHealth,chealth,string[512],string1[128],kmh,modelid,veh,Float:Distance;


    zu:
    new Float:CarHealth,chealth,string[512],string1[128],kmh,modelid,veh;


    Warum auch immer der Compiler da keinen Fehler bringt.



    Dann sollte es klappen, da du es ja unten mit "new Distance..." deklarierst.





    [BE]Mika2828: Entweder du hilfst konstruktiv, oder du lässt es ganz. Den Schlaumeier zu spielen ohne zu helfen bringt rein gar nichts. :thumbdown:

  • forward Speedometer();
    public Speedometer()
    {
    for(new i;i<MAX_PLAYERS;i++) {
    if(!IsPlayerNPC(i)) {
    if(IsPlayerConnected(i)) {
    if(IsPlayerInAnyVehicle(i) && GetPlayerVehicleSeat(i) == 0) {
    new Float:CarHealth,chealth,string[512],string1[128],kmh,modelid,veh;
    veh=GetPlayerVehicleID(i);
    modelid=GetVehicleModel(veh);
    GetVehicleHealth(veh,CarHealth);
    CarHealth = CarHealth - 250;
    CarHealth = CarHealth /10;
    CarHealth = CarHealth /75;
    CarHealth = CarHealth *100;
    chealth=floatround(CarHealth,floatround_floor);

    GetVehiclePos(veh,pNewKM[0][i],pNewKM[1][i],pNewKM[2][i]);
    printf("%f | %f | %f | %f | %f | %f |",pNewKM[0][i],pNewKM[1][i],pNewKM[2][i],pOldKM[0][i],pOldKM[1][i],pOldKM[2][i]);
    new Distance=floatround(floatsqroot( ((pNewKM[0][i]-pOldKM[0][i])*(pNewKM[0][i]-pOldKM[0][i])) +((pNewKM[1][i]-pOldKM[1][i])*(pNewKM[1][i]-pOldKM[1][i])) + ((pNewKM[2][i]-pOldKM[2][i])*(pNewKM[2][i]-pOldKM[2][i])) ));
    printf("distance = %d", Distance);
    KM[veh] += Distance;
    printf("KM[veh] = %d", KM[veh]);
    pOldKM[0][i] = pNewKM[0][i];
    pOldKM[1][i] = pNewKM[1][i];
    pOldKM[2][i] = pNewKM[2][i];
    format(string,sizeof string,"%d KM",KM[veh]);


    } else {

    }
    }
    }
    }
    return 1;
    }

    Spoiler anzeigen

    Ich bin bei einem Gesamt von über 2000 weil ich das bei OnPlayerStateChange nicht benutzt habe, deshalb hat er den ersten am Anfang (nicht dabei im Log) von 0 gerechnet.



    So habe ich es laufen gelassen, funktioniert einwandfrei. Ich habe nur die Textdraws und so entfernt, weil ich die ja nicht habe.
    Füge das bei dir so ein, und prüfe dann die prints.
    Wenn es klappt, füge Schritt für Schritt die anderen Dinge wieder ein.

  • Ich hab es so hinbekommen, wie ich es wünsche. Ich habe mir gerade von Sunshine (von Sunshine Reallife) helfen lassen.
    Ich musste die Kilometer-Variable als Float definieren, da ich Es so ausgeben möchte: "3.6KM".
    Hier meine neue Rechnung:
    GetVehiclePos(veh,pNewKM[0][i],pNewKM[1][i],pNewKM[2][i]);
    Distance=GetVehicleDistanceFromPoint(veh,pOldKM[0][i],pOldKM[1][i],pOldKM[2][i]);
    if(Distance>150){Distance=0;}
    KM[veh] += Distance/1000;
    pOldKM[0][i] = pNewKM[0][i];
    pOldKM[1][i] = pNewKM[1][i];
    pOldKM[2][i] = pNewKM[2][i];
    format(string1,sizeof string1,"%0.1f KM",KM[veh]);
    TextDrawSetString(KManzeige[veh],string1);
    Ich bedanke mich trotzdem für Deine Hilfe Jeffry!! :)


  • Ich habe euch doch den Lösungsweg gegeben? nur weil ich euch keinen fertigen Copy & paste Code gebe bin ich fehl am platz?


    mfg Mika

  • Ich habe euch doch den Lösungsweg gegeben? nur weil ich euch keinen fertigen Copy & paste Code gebe bin ich fehl am platz?


    mfg Mika


    1. Dieses Thema ist erledigt.
    2. Du hast uns den "Lösungsweg" gegeben. Es gibt mehr als nur 2 Lösungswege, und ich habe mich für den entschieden, welchen ich jetzt benutze.
    3. Nein.


    Btw: Bei 50 km/h würde ich 13,8... Meter pro Sekunde zurücklegen. Ich will mal wissen, was du für ein Auto hast, dass du solche Werte erreichst :huh:


  • 1. Dieses Thema ist erledigt.
    2. Du hast uns den "Lösungsweg" gegeben. Es gibt mehr als nur 2 Lösungswege, und ich habe mich für den entschieden, welchen ich jetzt benutze.
    3. Nein.


    Btw: Bei 50 km/h würde ich 13,8... Meter pro Sekunde zurücklegen. Ich will mal wissen, was du für ein Auto hast, dass du solche Werte erreichst :huh:


    Ja natürlich. Ich habe euch aber ein deutlich besseren, effizienteren und schöneren Lösungsweg gegeben. Eure Lösung frisst ziemlich viel Ressourcen. Eine Mathematische Formel hingegen nur sehr wenig.


    Für alle die es doch Interessiert sollten sich mal diesen Link angucken.


    http://www.mathe-lexikon.at/gr…heit/geschwindigkeit.html


    Achja und ja du hast recht bei 50kmh fährt man 13,8 meter pro Sekunde. Das lernst du spätestens in der Fahrschule.


    mfg Mika

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen