Permalänk
Medlem

Timer i Pygame

Då ett problem är avklarat uppenbaras genast ett annat...

Jag behöver sätta in en timer i programmet så att efter en viss tid minskar en variabel med ett visst värde.

Jag läste pygames dokumentation; http://www.pygame.org/docs/ref/time.html

Och där fann jag "pygame.time.set_timer(eventid, milliseconds)", men jag är osäker på hur jag ska använda den.

Vad ska jag sätta in för eventid, då jag bara vill minska en variabel och inte använda en funktion?

Visa signatur

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem

kan inte språket men kollar man i kommentaren stod detta

import pygame from pygame.locals import * def timerFunc(): print "Timer CallBack" pygame.init() pygame.time.set_timer(USEREVENT+1, 100) while 1: for event in pygame.event.get(): if event.type == USEREVENT+1: timerFunc() #calling the function wheever we get timer event. if event.type == QUIT: break

verkar som du säger vilket id och efter hurlänge eventet ska hända, och loopar igenom eventsen med den forloopen där.

Visa signatur

Laptop - MacBook 2.0GHz, 4GB ram, Intel GMA 950
Stationär - i5 3570k @ 4ghz, 8gb ram, 120gb ssd + 2tb hdd, Windows 8 64bit, fractal design arc
Citera så jag hittar tillbaka :)

Permalänk
Medlem

Jag använde mig utav det exemplet, men då kan inte timern ha startat när jag startade programmet, för det printades inte "Timer CallBack" förrens events började hända, som att jag rörde musen till exempel.

Hur kan man göra för att timern ska starta direkt och vara igång konstant, och var 10 sekund t.ex. få variabler att minska?

Visa signatur

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem

Ingen som vill anta denna utmaning?

Det är i princip det sista som återstår utav mitt lilla projekt, så hjälp hade verkligen uppskattats!

Visa signatur

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem

du har inget som väntar på input/event och därför det haltar tills du gör något? eller är det så pygame fungerar? att den uppdaterar inte förens det händer något??

Visa signatur

Laptop - MacBook 2.0GHz, 4GB ram, Intel GMA 950
Stationär - i5 3570k @ 4ghz, 8gb ram, 120gb ssd + 2tb hdd, Windows 8 64bit, fractal design arc
Citera så jag hittar tillbaka :)

Permalänk
Medlem

testa o skapa upp en Clock som du sen gör tick på sist i while-loopen:

clock = pygame.time.Clock() while 1: # din kod clock.tick()

Visa signatur

AK47s for everyone! - Angry mob
Since NaN /= NaN, I think, we should decipher 'NaN' as 'Not a NaN' - Miguel Mitrofanov
(Varför är människan så benägen att tro på Gud?) Antagligen har det lönat sig och evolutionen har drivit fram sådana hjärnor. - Anon

Permalänk
Medlem

hmm, nu har jag fått lite tid att pyssla med programmet...

Citat:

Ursprungligen inskrivet av vb
testa o skapa upp en Clock som du sen gör tick på sist i while-loopen:

clock = pygame.time.Clock() while 1: # din kod clock.tick()

Det enda man gör med clock.tick() är väl att låsa frame-raten till en viss siffra?

Det känns inte som om det här skulle vara något svårt, men jag verkar inte kunna hitta någon hjälp :S

Man kanske skulle kunna skapa en variabel i slutet av while-loopen som ökas med ett varje gång, och när den nått ett visst värde så med en simpel if-sats så minskar de andra variablerna. En fake-timer, men det kanske funkar lika bra?

Visa signatur

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem

Anledningen att jag föreslog att du tickade klockan i varje frame var att den skulle tvinga fram ett event hela tiden.. Men nu när jag testar så fungerar ju förslaget E_maN gav helt utan clock.tick(), så jag förstår inte problemet riktigt? Är du säker på att du gör samma sak i din kod, och har du testat koden rakt av?

Visa signatur

AK47s for everyone! - Angry mob
Since NaN /= NaN, I think, we should decipher 'NaN' as 'Not a NaN' - Miguel Mitrofanov
(Varför är människan så benägen att tro på Gud?) Antagligen har det lönat sig och evolutionen har drivit fram sådana hjärnor. - Anon

Permalänk
Medlem

hmm, jag prövade det exemplet igen, i sitt eget program och försökte inte bygga in det i mitt program där det ska användas, och då funkade det.

Eftersom jag har en massa variabler i mitt program som måste ändras så prövade jag att sätta in ett par variabler i exemplet, och det enda stället som det gick att definiera variablerna var i timerFunc() funktionen, annars började python gnälla på att dem refererades innan dem var definierade. (UnboundLocalError: local variable 'a' referenced before assignment)
Problemet då var att dem aldrig ändrades, utan att dem gick tillbaks till standardvärdet hela tiden.

import pygame from pygame.locals import * def timerFunc(): a = 50 b = 50 c = 50 print "Timer CallBack" a = a - 5 print a b = b - 5 print b c = c + 5 print c pygame.init() pygame.time.set_timer(USEREVENT+1, 1000) while 1: for event in pygame.event.get(): if event.type == USEREVENT+1: timerFunc() if event.type == QUIT: break

Ett annat problem med denna kod var som jag beskrev i mitt tidigare inlägg, efter att jag blivit tipsad om denna kod.

Och ha gärna lite tålamod med mig jag är relativt ny inom programmering

Visa signatur

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem

Ah, ja, när du använder en variabel inne i timerFunc så tror python att det är en ny variabel du vill använda. Vill du använda en som är deklarerad utanför funktionen måste du använda global. Eller så kan du skicka in variabel, eller så kan du göra allt direkt i while-loopen:

import pygame from pygame.locals import * a = 0 b = 0 c = 0 def timerFunc1(): global a a = a + 1 print a def timerFunc2(x): # Här kan du dock inte göra x = x + 1, då skriver du över den lokala kopian print x pygame.init() pygame.time.set_timer(USEREVENT+1, 1000) #exempel 1 pygame.time.set_timer(USEREVENT+2, 1000) #exempel 2 pygame.time.set_timer(USEREVENT+3, 1000) #ex 3 while 1: for event in pygame.event.get(): if event.type == USEREVENT+1: timerFunc1() if event.type == USEREVENT+2: b = b + 1 timerFunc2(b) if event.type == USEREVENT+3: c = c + 1 print c if event.type == QUIT: break

Visa signatur

AK47s for everyone! - Angry mob
Since NaN /= NaN, I think, we should decipher 'NaN' as 'Not a NaN' - Miguel Mitrofanov
(Varför är människan så benägen att tro på Gud?) Antagligen har det lönat sig och evolutionen har drivit fram sådana hjärnor. - Anon

Permalänk
Medlem

Hopp, nu funkar i alla fall timern, tack för hjälpen.

Dock funkar det inte helt, de 5 variablerna som ska minskas, dom minskas i kommadoprompten men i själva programfönstret så uppdateras dom inte, utan dem sitter fast i deras grundvärde tills jag ändrar variablerna manuellt genom att klicka på en "knapp" som jag lagt in i fönstret.

def timerFunc1(u): print u pygame.time.set_timer(TIMERID, 1000) for event in pygame.event.get(): if event.type == TIMERID: a = a + 1 timerFunc1(a) if a == 2: variabel1 = variabel1 - 5 pygame.draw.rect(background, (136,166,140), (220, 20, length, height)) if pygame.font: font = pygame.font.Font(None, 78) text = font.render(str(variabel1) + "%", 1, (10, 10, 10)) textpos = text.get_rect( centerx = 300, centery = 50) background.blit(text, textpos) print "variabel1 = " , variabel1

Så ser allt som har med timern att göra ut, dock har jag 4 till variabler som ska skrivas ut, men det ser likadant ut.
Så nu undrar jag varför den inte ritar ut siffrorna som jag säger åt den att göra, det har alltid funkat att göra sådär innan när jag ska rita ut text/siffror.

Hela programmet är på 800 rader, så jag kanske inte kan lägga in hela programmet, även om det då hade varit lättare att felsöka kanske.

Visa signatur

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem

http://pastebin.com/ där kan du skriva mycket kod.

antar att problemet är att variablarna i guit inte är referenser till de andra variablarna. Antingne får du ha dem som referenser eller uppdatera manuellt när det andra uppdateras.

Om de är referenser så kanskle det finns en funktion för att uppdatera guit som du kan köra när du ändrar variabler?

Visa signatur

Laptop - MacBook 2.0GHz, 4GB ram, Intel GMA 950
Stationär - i5 3570k @ 4ghz, 8gb ram, 120gb ssd + 2tb hdd, Windows 8 64bit, fractal design arc
Citera så jag hittar tillbaka :)

Permalänk
Medlem

Slängde upp koden där, http://pastebin.com/T6Rf7sw8 , inte den mest lyckade koden kanske, men det är ändå det första riktiga programmet jag skriver.

Problemen som finns är som sagt att siffrorna som ritas ut inte uppdateras automatiskt, det går inte heller att stänga ner fönstret (!).

Citat:

Ursprungligen inskrivet av E_maN
antar att problemet är att variablarna i guit inte är referenser till de andra variablarna. Antingne får du ha dem som referenser eller uppdatera manuellt när det andra uppdateras.

Om de är referenser så kanskle det finns en funktion för att uppdatera guit som du kan köra när du ändrar variabler?

Jag har faktiskt ingen aning om vad du menar =/ Det är ju samma variabler på alla ställen, så om det funkar att ändra på dem manuellt borde det väll också fungera automatiskt genom timern, eller?

Citat:

Ursprungligen inskrivet av E_maN
eller uppdatera manuellt när det andra uppdateras.

Någon aning om hur man gör detta?

Det är mer konkret hjälp jag behöver, då det är första python programmet jag gör, men tack för att du försöker i alla fall =/

Visa signatur

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.