Выделенное меню будет отображать меню и ждать нажатия клавиши в цикле или с использованием SLEEP
. Общей альтернативой было просто изменить цвет текста одной из первых нескольких букв, сообщив пользователю нажать соответствующую клавишу, чтобы выбрать соответствующую опцию меню. Например, буквы Q в «Quit» и N в «New Game» будут отличаться от остальной части текста в строке.
Однако вы просите использовать клавиши со стрелками, поэтому вы явно не хотите этого делать. Как вы выделяете текущий пункт меню, зависит от используемого режима экрана. Экранные режимы 11, 12 и 13 не позволяют указать цвет фона, и я не могу заставить DOSBox отображать фон с режимами 7, 8 и 9. В качестве обходного пути к этой проблеме вы могли бы просто просто нарисуйте поле рядом с текущим выбором и сотрите ящик (нарисуйте черный или любой цвет фона вашего экрана). Или вы можете просто использовать звездочку, чтобы избежать проблем с размером текста и текста и упростить код. Вот пример стиля коробки с клавишами со стрелками, клавишами WASD и клавишами Vim (H = Left, J = Down, K = Up, L = Right), все поддерживаемые, если используется клавиатура US-QWERTY. Если вам нужны только клавиши со стрелками, вам просто нужно изменить первый (внешний) SELECT CASE...END SELECT
блок на просто IF LEFT$(k$, 1) = CHR$(0) THEN...END IF
, сохраняя внутренний блок SELECT CASE...END SELECT
, который работает с расширенными ключами.
'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
Если вы используете режим экрана, который поддерживает цвета фона или выделение в той или иной форме, например, экран 0, вы можете быть в состоянии уйти с просто «выделение» фона всей линии в в текстовом режиме. Вам не нужно указывать ширину экрана, чтобы иметь эффект «обратного видео», действующий как подсветка, но он выглядит лучше, если у вас выделена целая линия, а не только текст. После того, как этот пункт меню будет напечатан, просто измените цвета на значение по умолчанию и продолжите печать, как обычно. Ниже показаны несколько изменений в коде выше (режим экрана, настройки ширины экрана, и меню кода дисплея), но он остается тем же иначе:
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
...
Обратите внимание, что я предположил, адаптер VGA с цветным дисплеем для всех вышеприведенного кода, который уже давно заменен различными другими стандартами адаптера дисплея, которые используются даже на устройствах, таких же, как смарт-часы.
Вы должны иметь возможность адаптировать код в соответствии с вашими потребностями. Я разработал его так, чтобы вы могли просто добавлять пункты меню по своему усмотрению. Кроме того, сам код отображения полностью содержится в цикле FOR...NEXT
с функциональностью, непосредственно следующей за ним, поэтому все, что вам нужно изменить, - это содержимое внутри цикла FOR...NEXT
, чтобы изменить способ отображения.