Zeit messen

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


    ich möchte die Zeit messen die ein Spieler von dem Start-Checkpoint bis zum Ziel-Checkpoint braucht.
    Also der Spieler fährt durch den Start-Checkpoint -> die Zeitmessung startet
    Dann kommt er durch den Ziel-Checkpoint -> Zeit wird gestoppt und in einer SendClientMessage ausgegeben (evt. noch gespeichert)


    Wie stelle ich das am besten an? :)

  • Mit Timern? ;) und einer Variable, die du dann nach beendigung des Timers Hochlaufen lässt.


    Dann, wenn er den CP erreicht tust du den Timer killen und sendest die Variable als Message ;)


    Lg RedAge

  • Einfach:
    Erst CP erstellen:
    Dies dürfte nich schwer sein, dazu bitte eine Variable erstellen, sprich:

    new Test;
    Test = CreateCP //oder soetwas

    Dann muss ein Spieler das erste CP erreichen und das 2.
    Wenn der Spieler das 2. erreicht hat:

    new Zeit = GetTickCount();
    str[128];


    format(str, sizeof(str), "Strecke in %d vollendet!", GetTickCount() - Zeit);
    SendClientMessage(playerid, 0xffffff, str);

    Dazu musst du aber ein Timer erstellen , der abzählt dass der Spieler in das CP gelangt , man kann das auch mit GetTickCount machen...

  • Wird soweit ich weis aber bei Servern, die länger als 24 Tage am Stück Online sind (Und es sind nich die SA-MP Server gemeint, sondern die Root/VServer), schwierig, weil die Integer Größenbeschränkung überschreiten wird.


    Nimm lieber nen Timer:
    SetTimerEx(..);
    public timer(playerid)
    {
    if(InMission...)
    {
    time++;
    }
    }


    Oder du machst es wie ich und hast generell für sowas nen Timer laufen :D

  • Ich würde nicht GetTickCount() sondern GetTime() nehmen, da ist die Integergrößenbeschränkung nämlich noch nicht in Gefahr. :)



    StartZeit (getTime) bei Beginn des Rennens in einer PVar abspeichern und im letzten Checkpoint (OnPlayerEnterCP) den von Forbidden genannten zweiten Schnipsel nehmen - fertig.

  • Also ich blicke da nicht so ganz durch ^^


    Ich habe hier mal den Code:


    public OnPlayerEnterDynamicRaceCP(playerid, checkpointid)
    {
    if(checkpointid == funcheckp1)
    {
    //Hier soll die Zeitmessung beginnen
    return 1;


    }
    if(checkpointid == funcheckp2)
    {
    //Hier enden und in einer SendClientMessage ausgegeben werden
    return 1;
    }
    return 1;
    }


    Evt könnte das da ja mal jemand eintragen und mir erklären wie das mit den Variablen geht
    BloodyEric So hatte ich mir das auch zuerst gedacht aber dann wieder verworfen :)

  • GetTime() ist nur eine Funktion , die die Globalen Zeit sagt.
    Das wäre nicht so passend wenn man ein Timer hat der über Stunden und Minuten geht :)


    Nach dem Wiki von GetTime()

    Zitat von Wiki

    Returns The function itself returns a Unix Timestamp, however if arguments are specified then the hours, minutes and seconds for the current time are returned.


    gibt die Funktion den UnixTimestamp aus. GGf kann man hier noch einen stock nutzen, welcher die drei Variablen in einen Interger umwandelt. Dieser ist wie von BloodyEric noch nicht in Gefahr über die 32bit Grenze zu laufen. Mit diesem in Sekunden laufendem Timestamp kann man ganz einfach mit einer Subtraktion die verstrichene Zeit in Sekunden rausfinden.


    Also:


    public OnPlayerEnterDynamicRaceCP(playerid, checkpointid)
    {
    if(checkpointid == funcheckp1)
    {
    new year,month,day,hour,minute,second;
    getdate(year,month,day);
    gettime(hour,minute,second);
    SetpVarInt(playerid,"timestamp",mktime(hour,minute,second,day,month,year));
    return 1;


    }
    if(checkpointid == funcheckp2)
    {
    new year,month,day,hour,minute,second;
    getdate(year,month,day);
    gettime(hour,minute,second);
    newtimestamp = mktime(hour,minute,second,day,month,year);
    dif = newtimestamp - GetpVarInt(playerid,"timestamp");
    SendClientMessage(.....
    return 1;
    }
    return 1;
    }
    stock mktime(hour,minute,second,day,month,year)
    {
    new timestamp2, days_of_month[12];


    timestamp2 = second + (minute * 60) + (hour * 3600);
    if(((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
    days_of_month = {31,29,31,30,31,30,31,31,30,31,30,31};
    } else {
    days_of_month = {31,28,31,30,31,30,31,31,30,31,30,31};
    }
    new days_this_year = 0;
    days_this_year = day;
    if(month > 1) {
    for(new i=0; i<month-1;i++) {
    days_this_year += days_of_month[i];
    }
    }
    timestamp2 += days_this_year * 86400;
    for(new j=1970;j<year;j++) {
    timestamp2 += 31536000;
    if(((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) timestamp2 += 86400;
    }
    return timestamp2;
    }

  • Danke Hagi. Hab's glaube ich verstanden.


    Jetzt noch eine Frage:


    Wie wird denn "dif" ausgegeben? In Sekunden?