BasicC/Zdarzenia

Z Wikibooks, biblioteki wolnych podręczników.

GetEvents[edytuj]

Komenda wywołuje GetSDLEvents(); powoduje odczyt zdarzeń systemowych:

  • W zmiennej WindowEvent ustawiane są bity odpowiadające numerom wykrytych zdarzeń okiennych
  • Zmienna Quit otrzymuje wartość 1 jeśli program ma być zakończony, np. zamknięto okno
  • W zmiennej InKey zapisany zostaje kod SDL_Keycode ostatnio wciśniętego klawisza
  • W zmiennej wskazywanej przez SDLTEXT$ zapisywane są wprowadzone znaki jeśli wywołano StartTextInput
  • Uaktualniana jest tablica SDLKeyboardState wciśniętych klawiszy
  • Uaktualniane są zmienne MouseK MouseX MouseY zawierające stan myszy

InKey(K)[edytuj]

Zwraca 1 jeśli wciśnięto klawisz o kodzie SDL_Scancode K, 0 jeśli nie.
Istnieje kilka różnic między funkcją InKey(K) a zmienną InKey. Funkcja działa w oparciu o SDL_Scancode, które są fizycznymi kodami klawiszy niezależnymi od systemu. Zmienna zawiera SDL_Keycode zależne od systemu, system zwykle też generuje okresowe powtórzenia zdarzenia wciśnięcia klawisza, jeśli jest on cały czas wciśnięty. Zdarzenie puszczenia klawisza generowane jest tylko raz, w momencie faktycznego jego puszczenia, jednak nie jest ono obsługiwane przez GetSDLEvents, jeśli jest taka potrzeba - należy samodzielnie dodać jego obsługę lub napisać własną procedurę obsługi zdarzeń. Zmienna zawiera kod tylko 1 klawisza, funkcja odczytuje stan tablicy SDLKeyboardState zawierającej informacje o wszystkich klawiszach, zamiast InKey(K) można użyć SDLKeyboardState[K]. Jednak zwykle ilość prawidłowych informacji o wciśniętych klawiszach jednocześnie jest ograniczona do kilku, prawdopodobnie z powodów sprzętowych.
Ogólnie zmienna InKey lepiej się nadaje do obsługi menu czy wprowadzania tekstu, a funkcja do sterowania ruchomymi obiektami, np. w grach.
Tabela kodów:
https://eduinf.waw.pl/inf/prg/011_sdl2/1128.php

WaitInKey[edytuj]

Wstrzymuje działanie programu (pozornie) do momentu wciśnięcia klawisza lub ustawienia zmiennej Quit na 1. Wykonuje do GetSDLEvents(); while(InKey==0 && Quit==0);

WaitMouseD[edytuj]

Czeka na wciśnięcie klawisza myszy lub ustawienie Quit. Wykonuje do GetSDLEvents(); while(MouseK==0 && Quit==0);

WaitMouseU[edytuj]

Czeka na puszczenie klawiszy myszy lub ustawienie Quit. Wykonuje do GetSDLEvents(); while(MouseK>0 && Quit==0);

StartTextInput(T)[edytuj]

Uruchamia tryb wprowadzania tekstu z klawiatury. Od tego momentu zmienna T (typu STRING, ew. inna tablica char*), na którą wskazuje SDLTEXT$, jest zapełniana wprowadzanymi znakami po wywołaniu GetEvents. Wywołuje {SDL_StartTextInput();SDLTEXT$=T;}

StopTextInput[edytuj]

Zatrzymuje tryb wprowadzania tekstu. Wywołuje SDL_StopTextInput();

GetFinger(F)[edytuj]

Zapisuje do zmiennej SDLFinger informacje o palcu o numerze F dotykającym ekranu 0. Wywołuje SDLFinger=SDL_GetTouchFinger(SDLTouchID,F);
Odczyt zmiennej:
SDLFinger->id identyfikator dotyku
SDLFinger->x położenie na osi x zdarzenia dotyku, znormalizowane (0...1)
SDLFinger->y położenie na osi y zdarzenia dotyku, znormalizowane (0...1)
SDLFinger->pressure zastosowany nacisk, znormalizowany (0...1)
Uwaga! Wywołanie tej komendy dla palca, który nie dotyka ekranu powoduje krytyczny błąd.

NumFingers[edytuj]

Podaje ilość palców dotykających ekranu dotykowego 0. Wywołuje SDL_GetNumTouchFingers(SDLTouchID)

Stick(J,S)[edytuj]

Podaje wychylenie osi o nr S joysticka o nr J. Numeracja jest od 0. Wynik z przedziału (-32768 do 32767). Wywołuje SDL_JoystickGetAxis(SDLJoystick[J], S)

Strig(J,S)[edytuj]

Podaje stan przycisku nr S joysticka J. 1 - wciśnięty, 0 - nie. Wywołuje SDL_JoystickGetButton(SDLJoystick[J],S)

NumJoys[edytuj]

Podaje ilość podłączonych joysticków. Wywołuje SDL_NumJoysticks()

SetMouse(x,y)[edytuj]

Ustawia wskaźnik myszy w pozycji x,y.

ShowM(s)[edytuj]

Ustawia widoczność kursora, dla s: SDL_ENABLE widoczny, SDL_DISABLE ukryty, SDL_QUERY aby sprawdzić bieżący stan widoczności kursora.

WindowEvent(E)[edytuj]

Sprawdza wystąpienie wydarzenia okiennego o numerze E. Wynikową wartością jest liczba typu Uint16 z ustawionym bitem o odpowiednim numerze lub 0, jeśli nie wykryto zdarzenia. Wywołuje: (WindowEvent&(1<<E))
W miejsce E najlepiej podać nazwę odpowiedniej stałej zdefiniowaną w SDL. Możliwe zdarzenia okienne: https://www.eduinf.waw.pl/inf/prg/011_sdl2/1133.php

Przykład:

#include "BasicSDL.h"
STRING znak=" ";
STRING napis;
MAIN
SDLOpen(0)
Repeat
  Cls
  GetEvents
  If (InKey>0 AND InKey<128)
    znak[0]=InKey;
    Add$(napis,znak)
  EndIf
  GPrintAt(0,0,napis)
  ShowPage
  Print MouseX _ MouseY _ MouseK NL
Until (Quit OR InKey(SDL_SCANCODE_ESCAPE))
if(WindowEvent(SDL_WINDOWEVENT_CLOSE)) {Print$ "ZAMKNIETO OKNO" NL}
SDLQuit
ENDMAIN