Un menu en surbrillance dessine le menu et attend une pression sur une touche dans une boucle ou en utilisant SLEEP
. Une alternative courante consistait simplement à changer la couleur du texte de l'une des premières lettres, en informant l'utilisateur d'appuyer sur la touche correspondante pour sélectionner l'option de menu correspondante. Par exemple, les lettres Q dans "Quitter" et N dans "Nouveau jeu" seraient d'une couleur différente du reste du texte de la ligne. Cependant, vous demandez à utiliser les touches fléchées, donc clairement vous ne voulez pas le faire de cette façon. La mise en surbrillance de l'élément de menu actuel dépend du mode d'écran utilisé. Les modes d'écran 11, 12 et 13 ne vous permettent pas de spécifier une couleur d'arrière-plan, et je ne peux pas obtenir DOSBox pour rendre un arrière-plan avec les modes 7, 8 et 9. Pour contourner ce problème, vous pouvez simplement Dessinez une boîte à côté de la sélection actuelle et effacez la boîte (dessinez une noire ou quelle que soit la couleur de fond de votre écran). Ou vous pouvez simplement utiliser un astérisque pour éviter les problèmes de taille des graphiques et du texte et simplifier le code. Voici un exemple de style de boîte avec les touches fléchées, les touches WASD et les touches de style Vim (H = Gauche, J = Bas, K = Haut, L = Droite) toutes prises en charge, en supposant qu'un clavier US-QWERTY est utilisé. Si vous vouliez seulement les touches fléchées, alors vous auriez simplement besoin de changer le premier bloc (extérieur) SELECT CASE...END SELECT
en simplement IF LEFT$(k$, 1) = CHR$(0) THEN...END IF
tout en préservant le bloc interne SELECT CASE...END SELECT
qui fonctionne avec les touches étendues.
'size% is used in the selIncDec subroutine.
DIM text$(0 TO 3)
DIM SHARED size%
size% = UBOUND(text$) - LBOUND(text$) + 1
selected% = 0
text$(0) = "Example 1"
text$(1) = "Example 2"
text$(2) = "Example 3"
text$(3) = "Example 4"
SCREEN 12
' Width and height of a text cell in pixels.
' I use 8x8 text cells for max screen compatibility, despite 8x16 looking better.
xpxText% = 8
ypxText% = 8
' See the documentation for SCREEN to determine which screen sizes are
' available with the screen mode you want to use.
' 80x60 for mode 12 results in 8x8 text cells. 80x30 results in 8x16 text cells.
WIDTH 80, 60
DO
LOCATE 1, 1
FOR i% = LBOUND(text$) TO UBOUND(text$)
PRINT TAB(3); text$(i%)
' selected% = i%
' is an equality comparison, resulting in -1 for true and 0 for false.
' If false, -(0) * 2 = 0; if true, -(-1) * 2 = 2.
LINE (0, i% * ypxText%)-STEP(xpxText% - 1, xpxText% - 1), -(selected% = i%) * 2, BF
NEXT i%
SLEEP
k$ = INKEY$
SELECT CASE UCASE$(LEFT$(k$, 1))
' Left -- does nothing
CASE "H", "A"
' Right -- does nothing
CASE "L", "D"
' Up
CASE "K", "W"
CALL selIncDec(selected%, -1)
' Down
CASE "J", "S"
CALL selIncDec(selected%, 1)
' Enter key
CASE CHR$(13)
EXIT DO
' Extended key, such as arrows.
CASE CHR$(0)
SELECT CASE RIGHT$(k$, 1)
' Left
CASE "K"
' Right
CASE "M"
' Up
CASE "H"
CALL selIncDec(selected%, -1)
' Down
CASE "P"
CALL selIncDec(selected%, 1)
END SELECT
END SELECT
LOOP
PRINT USING "You selected option #"; selected% + 1
END
SUB selIncDec (selected%, amtInc%)
selected% = selected% + amtInc%
IF selected% >= size% THEN
selected% = selected% - size%
ELSEIF selected% < 0 THEN
selected% = selected% + size%
END IF
END SUB
Si vous utilisez un mode d'écran qui prend en charge les couleurs d'arrière-plan ou mettre en évidence sous une certaine forme, tel que l'écran 0, vous pourriez être en mesure de sortir avec simplement « en soulignant » l'arrière-plan de toute la ligne en mode texte. Vous n'avez pas besoin de spécifier la largeur de l'écran pour que l'effet "reverse video" agisse comme une mise en surbrillance, mais il est préférable de mettre en surbrillance une ligne entière plutôt que le texte. Après l'impression de cet élément de menu, rétablissez les couleurs par défaut et continuez l'impression comme d'habitude. Ci-dessous montre quelques modifications au code ci-dessus (mode écran, réglage de la largeur de l'écran, et le code d'affichage de menu), mais il reste le même autrement:
SCREEN 0
'8x8 text cells in SCREEN 0 for VGA adapters.
WIDTH 80, 43
...
FOR i% = LBOUND(text$) TO UBOUND(text$)
' "Reverse video" highlighting.
IF selected% = i% THEN COLOR 0, 7 ELSE COLOR 7, 0
PRINT TAB(3); text$(i%); SPACE$(78 - LEN(text$(i%)))
NEXT i%
' The screen will turn "white" when the last menu item is selected.
' This fixes the issue.
COLOR 7, 0
SLEEP
...
Notez que je supposais un adaptateur VGA avec un écran couleur pour tous du code ci-dessus, qui a depuis longtemps été remplacé par d'autres normes d'adaptateurs d'affichage qui sont utilisés même sur des appareils aussi petits que les montres intelligentes.
Vous devriez être en mesure d'adapter le code pour répondre à vos besoins. Je l'ai conçu de telle sorte que vous puissiez simplement ajouter des éléments de menu comme vous le souhaitiez. En outre, le code d'affichage lui-même est entièrement contenu dans la boucle FOR...NEXT
avec la fonctionnalité immédiatement après, tout ce que vous aurez besoin de changer est la substance dans la boucle FOR...NEXT
pour changer la façon dont les choses sont affichées.