Escutando o jogador: joystick, teclado e INPUT
Um jogo sem entrada é um filme. Vamos aprender a ler joystick, teclas nomeadas e respostas digitadas — com o mesmo cuidado com que o BASIC original tratava o teclado.
1. As três formas de escutar
O CrossScript oferece três canais de entrada, e cada um serve a uma situação:
- STICK / STRIG — o joystick, para o gameplay.
- KEY(tecla) — uma tecla específica, para atalhos e menus.
- INPUT — uma linha de texto, para nome de jogador, senha, respostas.
2. STICK e STRIG — o joystick
O comando STICK(porta) devolve um número de 0 a 8 indicando para onde a alavanca está apontada; STRIG(porta) devolve TRUE (1) enquanto o botão de tiro estiver pressionado. Porta 0 é o teclado emulando joystick; portas 1 e 2 são os joysticks físicos.
8 1 2
7 0 3
6 5 4
DIGITE E VEJA
Programa 11.1 — Bússola do joystick
USES SCREEN 1, KEYBOARD
SCREEN 1 : CLS
WHILE STRIG(0) = 0
LOCATE 0, 0
PRINT "DIRECAO = "; STICK(0); " "
WEND
PRINT "TIRO!"
TELA ESPERADA
O número muda em tempo real
Enquanto você mexe as setas, o valor de STICK(0) alterna entre 0 (parado) e 1..8 (direções). O PRINT sobrescreve a mesma linha porque usamos LOCATE 0,0.
3. KEY(n) — teclas nomeadas
KEY(código) retorna TRUE enquanto a tecla estiver pressionada. Os códigos mais úteis já vêm com nome no CrossScript: KEY(SPACE), KEY(ESC), KEY(RETURN), KEY(F1)..KEY(F5), KEY(SHIFT), KEY(CTRL), e letras KEY(A)..KEY(Z).
DIGITE E VEJA
Programa 11.2 — Pausa com ESC
USES SCREEN 1, KEYBOARD
SCREEN 1 : CLS
PRINT "APERTE ESC PARA SAIR"
WHILE KEY(ESC) = 0
IF KEY(SPACE) THEN PRINT "*";
WEND
DICA
KEY não espera — WHILE espera
KEY(X) só olha o teclado naquele instante e volta na hora. Para "esperar apertar", coloque dentro de um WHILE KEY(X) = 0 : WEND.
4. INPUT — lendo texto digitado
INPUT é o velho conhecido do BASIC: mostra um cursor, espera o usuário digitar e teclar RETURN, e joga o resultado na variável.
DIM nome AS STRING
DIM idade AS BYTE
PRINT "SEU NOME? ";
INPUT nome
PRINT "SUA IDADE? ";
INPUT idade
PRINT "OLA, "; nome; "! VOCE TEM "; idade; " ANOS."
O ponto-e-vírgula no PRINT mantém o cursor na mesma linha (como no MSX BASIC), e o INPUT continua ali mesmo. Tipos numéricos são convertidos automaticamente; se o usuário digitar letras num campo BYTE, o INPUT recusa e pede de novo.
ATENÇÃO
INPUT bloqueia o jogo
Enquanto o INPUT espera, o loop principal para. Use-o em telas de configuração, high-score, "digite seu nome" — nunca no meio da ação.
5. O padrão "Press START" que resolve o RND
Combine STRIG com RANDOMIZE para a receita idiomática de todo jogo MSX:
USES SCREEN 1, RANDOM, KEYBOARD
CLS
PRINT "APERTE ESPACO PARA COMECAR"
WHILE STRIG(0) = 0
WEND
RANDOMIZE ' JIFFY variou conforme o tempo do jogador
CLS
' ... gameplay ...
O tempo até o jogador reagir é a fonte de entropia — resolve o problema de o emulador começar sempre com a mesma semente. Isso é aprofundado no capítulo 12.
6. Resumo do capítulo
| Situação | Use |
|---|---|
| Gameplay (direção) | STICK(0) |
| Gameplay (tiro/pulo) | STRIG(0) |
| Atalho / menu | KEY(código) |
| Digitar texto | INPUT variavel |
STICK/STRIG/KEYnão bloqueiam o loop.INPUTbloqueia.- Sempre coloque
USES KEYBOARDno topo dos programas que leem input.
Nomes das teclas
Em vez de decorar números, você pode passar o nome da tecla entre aspas para KEY, ou usar as constantes prontas que começam com K_:
IF KEY("SPACE") THEN PRINT "PULO"
IF KEY(K_ESC) THEN PRINT "SAIR"
IF KEY("A") THEN PRINT "TECLA A"
| Grupo | Nomes aceitos em KEY("...") | Constantes |
|---|---|---|
| Letras e números | "A"…"Z", "0"…"9" | K_0…K_9 |
| Setas | "LEFT" "UP" "DOWN" "RIGHT" | K_LEFT K_UP K_DOWN K_RIGHT |
| Edição | "SPACE" "HOME" "INS" "DEL" "BS" "ENTER" (ou "RETURN") "TAB" | K_SPACE K_HOME K_INS K_DEL K_BS K_ENTER K_TAB |
| Controle | "ESC" "STOP" "SELECT" "SHIFT" "CTRL" "GRAPH" "CAPS" "CODE" | K_ESC K_STOP K_SEL K_SHIFT K_CTRL K_GRAPH K_CAPS K_CODE |
| Função | "F1"…"F5" | K_F1…K_F5 |