Problem mit Timer?

Previous topic - Next topic

mannybass

Hallo, ich hab grad etwas, das ich nicht verstehe.
Ich habe ein Menü von Mausbedienung auf Tastenbedienung umgebaut und es tut nicht das, was ich will.
Ich möchte mit einer Variablen einen Pfeil vor den Menüeinträgen steuern. Wenn ich jetzt aber Pfeil nach oben/unten drücke, geht der Cursor aber nicht einen Eintrag rauf oder runter, sondern mehrere. Zumindest sieht es so aus.
Läuft die Schleife hier so schnell durch, dass das Key-Event bei einem Druck mehrmals ausgelöst wird? Brauche ich hier einen Timer damit das so funktioniert? Ich steh etwas auf der Leitung.

Code (glbasic) Select
LOADBMP "bmphintergrund800600.bmp"
LOADFONT "handwriting18.bmp", 1
SETFONT 1

GLOBAL running = TRUE
GLOBAL menu_selected = 1

WHILE running = TRUE
ShowMenu()
//SHOWSCREEN
WEND
END



// ------------------------------------------------------------- //
// -=#  SHOWMENU  #=-
// ------------------------------------------------------------- //
FUNCTION ShowMenu:
// Diese Variablen sind als LOCAL definiert:
//

WHILE TRUE
PRINT "text 1", 300, 100
PRINT "text 2", 300, 200
PRINT "text 3", 300, 300
PRINT "ende", 300, 400

SELECT menu_selected
CASE 1
PRINT "->", 285, 100
CASE 2
PRINT "->", 285, 200
CASE 3
PRINT "->", 285, 300
CASE 4
PRINT "->", 285, 400
ENDSELECT
SHOWSCREEN

// Pfeil nach oben
IF KEY(200) = 1
DEC menu_selected, 1
IF menu_selected < 1 THEN menu_selected = 4
ENDIF
// Pfeil nach unten
IF KEY(208) = 1
INC menu_selected, 1
IF menu_selected > 4 THEN menu_selected = 1
ENDIF
// Enter
IF KEY(28) = 1
running = FALSE
RETURN
ENDIF
WEND

ENDFUNCTION // SHOWMENU

trucidare

also ich hab mein menu so gelöst:

Code (glbasic) Select
FUNCTION menu:
// Diese Variablen sind als LOCAL definiert:
//
IF menu_start = 1
IF KEY(208) = FALSE AND KEY(200) = FALSE AND KEY(28) = FALSE
item_press = 0
ENDIF
PRINT menu_item, 0,0

abstand = 0


DIM menu_items$[4]
menu_items$[0]="Neues Spiel"
menu_items$[1]="Spiel Laden"
menu_items$[2]="Optionen"
menu_items$[3]="Beenden"

FOR menu_count = 0 TO 3
PRINT menu_items$[menu_count], 50, 130+abstand
abstand = abstand+25
NEXT

SPRITE 1, 10, 135+menu_y

IF KEY(208) AND item_press = 0
menu_item = menu_item + 1
item_press = 1
IF menu_item < 5
menu_y = menu_y + 25
ELSE
menu_y = 0
menu_item = 1
ENDIF
ENDIF

IF KEY(200) AND item_press = 0
menu_item = menu_item - 1
item_press = 1
IF menu_item > 0
menu_y = menu_y - 25
ELSE
menu_y = 75
menu_item = 4
ENDIF
ENDIF

IF KEY(28) AND item_press = 0
menu_start = 0
ENDIF

ELSE
SELECT menu_item
CASE 1
BLACKSCREEN
STOPMUSIC
spiel("Hiro")
CASE 2
CASE 3
BLACKSCREEN
STOPMUSIC
optionen()
CASE 4
END
ENDSELECT

ENDIF

ENDFUNCTION // MENU
vielleicht konnt ich dir ja helfen
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

Kitty Hello

Richtig. KEY() gibt aus, ob die Taste gedrück ist (also auch gehalten). Es gibt einen Code hier, der ein Event gibt, wenn die Taste losgelassen wird
*such, such*
http://www.glbasic.com/forum/viewtopic.php?pid=2908#p2908

mannybass

Danke, Danke. Jetzt ist mir ein Licht aufgegangen.