Частина 13 - Стан клавіатури та стани клавіш

У наступному розділі ми побачимо, як обробляються так звані події для обробки будь-якого введення (клавіатура, миша, джойстик ...). Перед цим я хотів би представити простий, але потужний спосіб обробки введення з клавіатури.

Стан клавіатури представляє стан (натиснуто = 1 або не натиснуто = 0) усіх клавіш клавіатури, отже, і стану клавіш. Функцєю

function SDL_GetKeyboardState(numkeys: PInt): PUInt8

ми маємо легкий доступ до цього масиву.

Keyboard state demo.
Червоний прямокутник можна переміщати клавішами WASD, зчитуючи їхні стани клавіш.

Наступний приклад коду намалює червоний прямокутник, який можна переміщати клавішами WASD. Тому ми читаємо стани цих клавіш на кожному етапі програмного циклу.

program SDL_KeyboardState;

uses SDL2;

var
  sdlWindow1: PSDL_Window;
  sdlRenderer: PSDL_Renderer;
  sdlRectangle: TSDL_Rect;
  sdlKeyboardState: PUInt8;
  Running: Boolean = True;

begin

  //ініціалізація підсистеми відео
  if SDL_Init(SDL_INIT_VIDEO) < 0 then Halt;

  if SDL_CreateWindowAndRenderer(500, 500, SDL_WINDOW_SHOWN, @sdlWindow1, @sdlRenderer) <> 0
    then Halt;

  // підготувати прямокутник
  sdlRectangle.x := 250;
  sdlRectangle.y := 250;
  sdlRectangle.w := 10;
  sdlRectangle.h := 10;

  // програмний цикл
  while Running = True do
  begin

    SDL_PumpEvents;
    sdlKeyboardState := SDL_GetKeyboardState(nil);

    // натиснуто ESC
    if sdlKeyboardState[SDL_SCANCODE_ESCAPE] = 1 then
      Running := False;

    // натиснуто клавіші WASD
    if sdlKeyboardState[SDL_SCANCODE_W] = 1 then
      sdlRectangle.y := sdlRectangle.y-1;
    if sdlKeyboardState[SDL_SCANCODE_A] = 1 then
      sdlRectangle.x := sdlRectangle.x-1;
    if sdlKeyboardState[SDL_SCANCODE_S] = 1 then
      sdlRectangle.y := sdlRectangle.y+1;
    if sdlKeyboardState[SDL_SCANCODE_D] = 1 then
      sdlRectangle.x := sdlRectangle.x+1;

    // чорний фон
    SDL_SetRenderDrawColor(sdlRenderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
    SDL_RenderClear(sdlRenderer);
    // намалювати червоний прямокутник
    SDL_SetRenderDrawColor(sdlRenderer, 255, 0, 0, SDL_ALPHA_OPAQUE);
    SDL_RenderDrawRect(sdlRenderer, @sdlRectangle);

    SDL_RenderPresent(sdlRenderer);
    SDL_Delay(20);
  end;

  // очистка пам'яті
  SDL_DestroyRenderer(sdlRenderer);
  SDL_DestroyWindow (sdlWindow1);

  //закрити SDL2
  SDL_Quit;

end.

Щоб отримати стан клавіатури, ми визначаємо змінну типу беззнаковий 8-бітний вказівник sdlKeyboardState в розділі var. Вона вказує на масив стану клавіш.

  //програмний цикл
  while Running = True do
  begin

    SDL_PumpEvents;
    sdlKeyboardState := SDL_GetKeyboardState(nil);   

Після налаштування вікна SDL2 та підготовки прямокутника SDL2 відбувається вхід в цикл програми. Тут нам потрібно оновити чергу подій за допомогою процедури SDL_PumpEvents. Після цього ми можемо захопити стан клавіатури попередньою згаданою функцією SDL_GetKeyboardState. Аргумент функції повинен бути nil. Ці дії доводиться виконувати на кожному циклі.

    //натиснуто ESC
    if sdlKeyboardState[SDL_SCANCODE_ESCAPE] = 1 then
      Running := False;

    //натиснуто клавіші WASD
    if sdlKeyboardState[SDL_SCANCODE_W] = 1 then
      sdlRectangle.y := sdlRectangle.y-1;
    if sdlKeyboardState[SDL_SCANCODE_A] = 1 then
      sdlRectangle.x := sdlRectangle.x-1;
    if sdlKeyboardState[SDL_SCANCODE_S] = 1 then
      sdlRectangle.y := sdlRectangle.y+1;
    if sdlKeyboardState[SDL_SCANCODE_D] = 1 then
      sdlRectangle.x := sdlRectangle.x+1;  

Тепер ми можемо перевірити будь-яку клавішу в масиві функцією sdlKeyboardState[SDL_SCANCODE_…] використовуючи
сканкоди як дескриптор (напр. SDL_SCANCODE_ESCAPE для клавіші escape) і реагувати за бажанням, напр. вийти з програмного циклу або змінити кординати x/y прямокутника. Сканкод представляє позицію відповідного стану клавіші в масиві. Детальний опис сканкодів у наступній частині. Список усіх сканкодів показує всі можливі сканкоди клавіш.

← попередня частина | наступна частина →

Немає коментарів:

Дописати коментар