Ich raffe was beim GETTIMER nicht.

Previous topic - Next topic

Hamburgo

Irgendwie raffe ich es nicht, wie man mit dem GETTIMER umgeht.

Kann mir irgendjemand anhand meines Beispieles erklären, wo ich
meinen Fehler mache ?

Code (glbasic) Select

GuthabenTaste     = 200 // Pfeil-Taste hoch
FortsetzenTaste   = 208 // Pfeil-Taste runter
ProgrammEndeTaste =  28 // Enter-Taste

PRINT "Start", 50, 200
SHOWSCREEN

Takt   = 500 // Alle ?/1000-Sekunde soll nach einem Tasten-Druck gefragt werden
Taste   = 999

WarteTaste   = FortsetzenTaste
WHILE Taste = 999

  Zeit = GETTIMER()

  DRAWRECT 50,   300, 300, 32, Weiss
      PRINT Zeit, 50,  300

      KeyHitUpdate()

  Weiter = KeyHit(GuthabenTaste)

  IF Zeit < Takt THEN Weiter = 0 // <<<<<<< Solange die Abfrage aktiv ist, ...

  IF Weiter <> 0 //  <<<<<<<<<<<<<<<<<<<<<< Will er hier einfach nicht rein ! Egal wie lange ich
                  die richtige Taste drücke.
DRAWRECT 50, 500, 300, 32, Weiss
PRINT "Guthaben-Taste", 50, 200
PRINT Weiter, 50,  500
SHOWSCREEN
KEYWAIT
  ENDIF

  IF KEY (WarteTaste) = 1 // funz
Taste = FortsetzenTaste
PRINT "Warte-Taste", 50, 200
SHOWSCREEN
  ENDIF

  IF KEY (ProgrammEndeTaste) = 1 // funz
PRINT "Warte-Taste", 50, 200
SHOWSCREEN
BREAK
  ENDIF

WEND // Taste = 999

KEYWAIT



[attachment deleted by admin]

D2O

Hier mal meine Interpretation von Deinem Code:

Achtung!! Es scheint sich ein Bug in KEYWAIT eigeschlichen zu haben, werds genauer testen und wenn Notwendig
ins Bug Forum posten.
Code (glbasic) Select
GuthabenTaste     = 200 // Pfeil-Taste hoch
FortsetzenTaste   = 208 // Pfeil-Taste runter
ProgrammEndeTaste =  28 // Enter-Taste
WarteTaste   = FortsetzenTaste


PRINT "Start", 50, 200
SHOWSCREEN

Takt   = 3000 // Alle ?/1000-Sekunde soll nach einem Tasten-Druck gefragt werden
Taste   = 999
Ende = 0

timertemp = GETTIMERALL() // Einmal initialisieren

WHILE Ende = 0// Taste = 999 ///???????????????????????????

 
    Zeit = GETTIMERALL() //GETTIMER()
  IF (Zeit-timetemp) > Takt
timetemp = Zeit
Weiter = 0
     ENDIF   
 

  DRAWRECT 50,   300, 300, 32, RGB(0xff, 0xff, 0xff)
      PRINT Zeit, 50,  300

      KeyHitUpdate()

//  Weiter = KeyHit(GuthabenTaste)
IF KeyHit(GuthabenTaste) = 1
    Weiter = 1
timertemp = GETTIMERALL()
ENDIF


// IF Zeit < Takt THEN Weiter = 0 // <<<<<<< Solange die Abfrage aktiv ist, ...

  IF Weiter <> 0 //  <<<<<<<<<<<<<<<<<<<<<< Will er hier einfach nicht rein ! Egal wie lange ich

   

   
                // die richtige Taste drücke.
DRAWRECT 50, 500, 300, 32, RGB(0xff, 0xff, 0xff) // Weiss <<<< ????????????????????????
PRINT "Guthaben-Taste", 50, 200
PRINT Weiter, 50,  500
// SHOWSCREEN
// KEYWAIT
  ENDIF

  IF KEY (WarteTaste) = 1 // funz
  BLACKSCREEN
Taste = FortsetzenTaste
PRINT "Warte-Taste", 50, 200
// SHOWSCREEN
  ENDIF
 
 
  SHOWSCREEN

  IF KEY (ProgrammEndeTaste) = 2 // funz
PRINT "Beenden, Bitte eine Taste Drueken", 50, 200
SHOWSCREEN
Ende = 1
  ENDIF



WEND // Taste = 999

KEYWAIT
END
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Schranz0r

wieso soll alle 1 Sec nach der Taste gefragt werden ?
Ich glaube ihr macht beide nen Fehler :D
Keyhit ist unabhängig von der Zeit her, zumindest bei D²0.
Wenn ich den Sinn verstehen würde, könnte ich helfen. Aber so versteh ich halt net um was es den genau geht?!

Meine Vermutung wo dein Problem ist :

Eine Taste abhängig mit Zeit machen (Taste nur alle 2 Sek verfügbar, oder schon länger als 2 Sek nicht mehr gedrückt, dann bei drück verfügbar)

Also ganz Simpel:

Code (glbasic) Select
LOCAL Verzoegerung = 2000 // 2 Sek verzögerung bis zur Anzeige von



WHILE TRUE

IF KEY(57) AND Timer < GETTIMERALL() // Key 57 = Spacebar
PRINT "WOHOO GEHT!",10,10
Timer = GETTIMERALL()+Verzoegerung
ENDIF


SHOWSCREEN
WEND
END




 
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Hamburgo

Bitte den Code nicht falsch verstehen. Das ist nur ein Test-Beispiel, indem ich bewußt Werte genommen, die das Problem möglichst klar machen.

Die realen Werte werden nachher anders sein und müssen noch ausgelotet werden.

Trotzdem meine ich, dass es eigentlich funktionieren müsste.

Der 1. SHOWSCREEN kommt gleich am Anfang, damit GETTIMER einen Referenz-Punkt hat.

Selbst wenn ich die Taste nach 5 oder 10 Min. einzeln oder dauerhaft halte, passiert nichts.
Müsste aber, nach meiner Einschätzung, weil der Wert von [Takt] dann schon mehrfach
überschritten ist, ergo dürfte die IF-Anweisung nicht ausgeführt werden.

Wird sie aber scheinbar doch oder was kann sonst der Grund sein?

Hamburgo

Obendrein kommt ja noch, dass die beiden IF KEY-Anweisungen funktionieren.

Hamburgo

Ich beschreibe mal kurz die Problemstellung. Vielleicht habt Ihr ja einen anderen Lösungsvorschlag?

Die Pfeil-Oben-Taste soll einen Counter immer um 1 hochzählen und
zwar unabhängig davon, ob die Taste mehrfach einzeln gedrückt oder
einfach nur 1 mal gedrückt und dann gehalten wird.

Der folgende SHOWSCREEN soll aber die Zeit bekommen jeden einzelnen Couter-Wert
für den User auch wahrnehmbar anzuzeigen.

Bei einzelnen Tasten-Anschlägen funktioniert das auch wunderbar.

Aber wenn die Taste gehalten wird, dann sind die Bild-Folgen so schnell, dass man nur
jeden 2. oder 3. Wert zu sehen bekommt.

Habt Ihr eine Idee, wie man das in beiden Fällen erreichen kann ?

Schranz0r

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard