Gå til innhold

Hvordan ordne et opphold i en funksjon i C? (timer?)


Anbefalte innlegg

Hei

 

Leter etter en måte for å få et lite "delay" på rundt 5 sekunder i C.

if (Sphere->speedx < 0.1  && Sphere->speedy < 0.1 && Sphere->speedx > -0.1 && Sphere->speedy > -0.1)
{ 		
       object_t *tmp = Sphere;
       Sphere = list_next(iter);
       list_remove(list, tmp);
       DestroyObject(tmp);
}

I koden over har jeg en "if" funksjon, med en del kriterier.

Tanken er at når disse kriteriene er tilfredsstilt, da skal det gå 5 sek før object_t *tmp = Sphere; osv skal gjennomføres.

 

Problemene så langt har vært:

Når jeg bruker Delay(5000), så stopper hele programmet, noe som ikke er hensiktsmessig.

 

Programmet er noen baller som spretter (SDL) og og når farten til en ball ca er 0, da skal det gå 5 sekunder før den blir slettet. Ettersom Delay() gjør slikt at de andre ballene som er i bevegelse også stopper for 5 sek, er ikke dette veien å gå.

 

Har prøvd diverse veier sleep, delay, og noen forsøk via time.h biblioteket.

 

Noen som sitter på noen gode ideer?

Lenke til kommentar
Videoannonse
Annonse

Tja, hva om objectet har en maate og holde styr paa tiden, slik at du bare

 

If (Sphere->CalcSpeed() < 0.1)

{

Sphere->StartSelfDestruct();

}

 

Eller kanskje ha en liste over Sphere som skal slettes, og regelmessig sjekke om det er noe I lista?

Endret av Mr Burns
Lenke til kommentar

Ettersom ballene får forskjellig fart, vil det gå forskjellig tidsintervaller før farten er lik 0.

 

Hvis jeg forstod deg rett så tenkte du å holde styr på tiden basert på, når skal if kjøre?

Litt usikker på hvordan jeg bør implementere dette, når farten er ulik og dermed tiden er ulik for hver ball.

Noen tanker?

 

jeg sitter nå å prøver forskjellige varianter av SDL_GetTicks. Men dette er ikke akurat lett:)

Lenke til kommentar

Du må holde ut med meg. Tre måneder med programmering er det jeg har bak meg.

Ballene er bygd opp av mange små trekanter og det blir regnet ut nye koordinater til disse ballene for hver oppdatering av skjermen.

Det er det eneste jeg kan se sålangt som har en referanse til tid, er FPS.

 

Så, ja, jeg oppdaterer til faste tidsintervaller (tror jeg).

Lenke til kommentar

Ok, da har du nok en while () som kjører oppdateringer til skjerm, men uten at det nødvendigvis er tidssynkronisert.

 

Og du har en liste over ballene som er på skjermen? Kan du legge til en variabel som heter sletteTid?

 

Hvis en ball skal slettes om fem sekunder, kan sletteTid settes til nåværende tick pluss fem sekunder.

if (Sphere->speedx < 0.1 && Sphere->speedy < 0.1 && Sphere->speedx > -0.1 && Sphere->speedy > -0.1)
{
	Sphere->sletteTid = SDL_GetTicks() + 5000;
}



Ved hver oppdatering sjekkes det om fem sekunder er gått siden sletteTid ble satt.

// Sjekke om ballen skal slettes
if (SDL_GetTicks() > Sphere->sletteTid)
{
	object_t *tmp = Sphere;
	Sphere = list_next(iter);
	list_remove(list, tmp);
	DestroyObject(tmp);
}

Dette er ikke den eneste måten å gjøre det på...

 

 



Endret av Mr Burns
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...