強調表示されたメニューがメニューを描画し、ループでキーを押すか、SLEEP
を使用するのを待ちます。一般的な選択肢は、対応するメニューオプションを選択するために対応するキーを押すようにユーザーに通知する最初の数文字のうちの1つのテキスト色を単に変更することでした。たとえば、「Quit」の文字Qと「New Game」のNは、行内のテキストの残りの部分とは異なる色になります。
しかし、矢印キーを使用するように求めているので、そのようにしたくないことは明らかです。現在のメニュー項目をどのように強調表示するかは、使用中の画面モードによって異なります。画面モード11,12、および13では、背景色を指定することができません。モード7,8、および9の背景を表示するためにDOSBoxを表示することはできません。この問題の回避策として、現在の選択肢の隣にボックスを描き、ボックスを消去します(黒い線を引いたり、画面の背景色が何であれ)。または、アスタリスクを使用してグラフィックス/テキストサイズの問題を回避し、コードを単純化することもできます。 US-QWERTYキーボードが使用されていると仮定して、矢印キー、WASDキー、およびVimスタイルのキー(H =左、J =下、K =上、L =右)を含むボックススタイルの例をすべてサポートしています。矢印キーのみを使用したい場合は、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として、背景色をサポートしている画面モードを使用するか、何らかの形でハイライト表示された場合は、単にテキストモードで行全体の背景を「ハイライト表示」と逃げることができるかもしれません。ハイライトとして機能する「リバースビデオ」エフェクトを使用するには、画面の幅を指定する必要はありませんが、テキストだけでなくハイライトされた行全体を表示する方が効果的です。そのメニュー項目が印刷された後、色をデフォルトに戻して通常通り印刷を続行するだけです。以下、上記のコードにいくつかの変更(画面モード、画面幅設定、及びメニュー表示コード)を示し、それはそうでなければ同一のままである:私はすべてのためのカラーディスプレイとVGAアダプタを想定
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
...
注これは長い間、スマートな時計ほど小さいデバイスでさえも使用されている他の様々なディスプレイアダプタ規格に取って代わられてきた。
お客様のニーズに合わせてコードを修正する必要があります。私はあなたが望むようにメニューアイテムを追加できるように設計しました。また、表示コード自体は完全にFOR...NEXT
ループに含まれており、直後に機能が追加されるため、変更する必要があるのは、FOR...NEXT
ループ内の内容を変更するだけです。