Ракетка GUI-событие: игнорировать регистр - PullRequest
0 голосов
/ 28 апреля 2018

Я довольно новичок в ракетке, и я пытаюсь написать игру, и сейчас я пишу свой контроллер ввода. Я использую события клавиш gui / canvas (https://docs.racket -lang.org / gui / key-event_.html ), например,

(define game-canvas%
  (class canvas%

...

    ;TODO: ignore case
    (define/override (on-char ke)
      (case (send ke get-key-code)
        ['release
           (send controller key-up (send ke get-key-release-code)))
         ]
        [else
           (send controller key-down (send ke get-key-code)))
         ]
        ))

...

    ))

(define dinosaur-controller%
  (class controller%

    ...


    (define/override (key-down key-code)
      (case key-code
        [(#\a)
         (DO STUFF)]))
))

Однако одна проблема, с которой я столкнулся, заключается в том, что коды клавиш чувствительны к регистру, например «a» отличается от «A», поэтому, если включен caps-lock, мой контроллер не работает. Есть ли что-нибудь, что могло бы избежать написания (case key-code [(#\a #\A)]) для каждого ключа?

1 Ответ

0 голосов
/ 28 апреля 2018

Сначала определите вспомогательную функцию

(define (key-downcase-key k)
  (cond
     [(char? k) (char-downcase k)]
     [else      k]))

Тогда используйте

(case (key-downcase k)
  [(#\a) ... as before ...])
...