Переклад виконано з дозволу автора оригінального матеріалу. Усі пропозиції та зауваження щодо перекладу прохання залишати в коментарях на сторінці матеріалу.
У наступному розділі ми побачимо, як обробляються так звані події для обробки будь-якого введення (клавіатура, миша, джойстик ...). Перед цим я хотів би представити простий, але потужний спосіб обробки введення з клавіатури.
Стан клавіатури представляє стан (натиснуто = 1 або не натиснуто = 0) усіх клавіш клавіатури, отже, і стану клавіш. Функцєю
function SDL_GetKeyboardState(numkeys: PInt): PUInt8
ми маємо легкий доступ до цього масиву.
Наступний приклад коду намалює червоний прямокутник, який можна переміщати клавішами 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 прямокутника. Сканкод представляє позицію відповідного стану клавіші в масиві. Детальний опис сканкодів у наступній частині. Список усіх сканкодів показує всі можливі сканкоди клавіш.
Немає коментарів:
Дописати коментар