logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Szybka klawiatura, opóźnienia pojawiania się znaków, gry.

leo1 10 Paź 2006 08:53 3633 7
REKLAMA
  • #1 3102547
    leo1
    Poziom 14  
    Posty: 158
    Pomógł: 1
    Ocena: 7
    witam

    Mam następujący problem: przy pisaniu różnego typu gier lub programów [pascal] w których ważna jest dlugość przycisniętego klawisza pojawia sie problem opuźnienia klawiatury. Nie dość, że znaki "powiedzmy" że sie pojawiają z opuźnieniem i ulegają buforowaniu to jeszcze miedzy pierwszym a kolejnymi znakami występuje przerwa czsowa.

    jak mozna usunać to zjawisko?? moze jakis modul do obsługi klawiatury?? tylko jaki??

    z góry dzieki za odpowiedź, pozdrawiam
  • REKLAMA
  • #2 3102979
    Svisstack
    Poziom 14  
    Posty: 60
    Pomógł: 8
    Musi byc, poniewaz od klawiatury ty dostajesz ciag bez takich przerw, sa one dopiero dodawane przez windows. Wiec odbieraj je przed windowsem. Pamietam ze pare lat temu tez mialem taki problem ale juz nie pamietam jak sobie z nim dalem rade; jak bede miec wieczorkiem chwilke czasu to edytuje ten post i dopisze do niego kod.
  • REKLAMA
  • #3 3106422
    Grzesiek1711
    Poziom 16  
    Posty: 169
    Pomógł: 10
    Ocena: 7
    najlepiej pobierać kody bezpośrednio z portu (klawiatura to 60h albo 64h, już niepaimętam). Masz wtedy kod naciśnięcia klawisza i puszczenia klawisza (osobne)

    w XP przydałby się jakiś sterownik portów, albo userport dobrze ustawiony
  • #4 3108466
    leo1
    Poziom 14  
    Posty: 158
    Pomógł: 1
    Ocena: 7
    witam

    a mógłbym prosić o jakiś prosty przykładzik?? nie znam raczej się na przerywaniach więc jest maly problem, ale myśle ze mały kod dużo by mi pomógł
    (a i piszepod dosem) ;P

    pozdrawiam
  • REKLAMA
  • #5 3109243
    Grzesiek1711
    Poziom 16  
    Posty: 169
    Pomógł: 10
    Ocena: 7
    jak pod dos i w pascalu to prościej się nieda - poszukaj info o komendzie port. Pascal ma to już wbudowane i nie trzeba bawić się w assmemblera...
  • REKLAMA
  • #6 3110020
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    Jeżeli to nie WIN NT/2000/XP to:
    1-W BIOSie komputera można ustawić opóźnienie po wciśnięciu (typematic delay) i częstotliwość repetycji (typematic rate). Choć windows chyba samo to reguluje.
    2-Pobawiłbym się czymś takim:
    repeat
        x:=port[$60]; 
        delay(50);
        if x<>y then begin
            write(x:4);
            y:=x;
        end
    until x=1; {teoretycznie „Esc” przerwie pętlę}
    Zwolnienie klawisza o ile dobrze pamiętam to Scancode+128. Jeżeli to zadziała (napisz jeżeli tak) łatwo zrobić funkcję mówiącą czy dany klawisz jest wciśnięty(wciśniętych jednocześnie może być wiele!).
    Przydatna tabelka:
     Top number    ... DEC
    Bottom number ... HEX
    
    +--+--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-------+-------+
    |F1|F2|ESC| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BkS|Num Lok|Scr Lok|
    |  |  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |       |       |
    |59|60| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |10 |11 |12 |13 |14 |  69   |  70   |
    |3B|3C|01 |02 |03 |04 |05 |06 |07 |08 |09 |0A |0B |0C |0D |0E |  45   |  46   |
    +--+--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-------+-------+
    |F3|F4|TAB| Q | W | E | R | T | Y | U | I | O | P | [ | ] |   | 7 | 8 | 9 | - |
    |  |  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
    |61|62|15 |16 |17 |18 |19 |20 |21 |22 |23 |24 |25 |26 |27 |   |71 |72 |73 |74 |
    |3D|3E|0F |10 |11 |12 |13 |14 |15 |16 |17 |18 |19 |1A |1B |   |47 |48 |49 |4A |
    +--+--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-------+-------+
    |F5|F6|CTR| A | S | D | F | G | H | J | K | L | ; | ' | ` |28 | 4 | 5 | 6 |   |
    |  |  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
    |63|64|29 |30 |31 |32 |33 |34 |35 |36 |37 |38 |39 |40 |41 |   |75 |76 |77 |   |
    |3F|40|1D |1E |1F |20 |21 |22 |23 |24 |25 |26 |27 |28 |29 |   |4B |4C |4D |   |
    +--+--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-------+-------+
    |F7|F8|Shf| \ | Z | X | C | V | B | N | M | , | . | / |Shf|Prt| 1 | 2 | 3 | + |
    |  |  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
    |65|66|42 |43 |44 |45 |46 |47 |48 |49 |50 |51 |52 |53 |54 |55 |78 |80 |81 |78 |
    |41|42|2A |2B |2C |2D |2E |2F |30 |31 |32 |33 |34 |35 |36 |37 |4F |50 |51 |4E |
    +--+--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-------+-------+
    |F9|F0|  A|t  |   |   |   |   |pac|   |   |   |   |Cap|Lok|  I|s  |  D|l  |   |
    |  |  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
    |67|68|  5|   |   |   |   |   |57 |   |   |   |   |  5|   |  8|   |  8|   |   |
    |43|44|  3|   |   |   |   |   |39 |   |   |   |   |  3|   |  5|   |  5|   |   |
    +--+--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-------+-------+
  • #7 3111851
    leo1
    Poziom 14  
    Posty: 158
    Pomógł: 1
    Ocena: 7
    witam

    Spróbowałem wykonać tą pętlę. Efekt jest taki, że żeczywiście są wyświetlane kody przycisków wg tej tabelki, ale pętli moge użyć maksymalnie 15(czy 16 ) razy, wtedy każde naciśniecie klawisza powoduje oprócz kodu, charakterystyczny dźwięk z komputerowego głośniczka, a kod nie zawsze jest pełen (tzn. nie ma kodu "wejściowego " klawisza, a jedynie jego "wyjściowy" np. dla Esc pojawia sie tylko 129 i petla nie zawsze chce sie zakonczyc).
    co może być jeszcze źle??

    pozdrawiam
  • #8 3113734
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    w "if x<>y then begin" doday redkey
    trzeba jakoś zjeść te wciskane guziki ;-)

Podsumowanie tematu

LABEL_AI_GENERATED
Problem opóźnień i buforowania znaków podczas pisania w programach lub grach w Pascalu, gdzie istotna jest długość przytrzymania klawisza, wynika z działania systemu Windows, który dodaje przerwy czasowe między pierwszym a kolejnymi znakami. Rozwiązaniem jest bezpośrednie odczytywanie kodów klawiszy z portu klawiatury (adresy portów 0x60 lub 0x64), co pozwala na uzyskanie osobnych kodów naciśnięcia i zwolnienia klawisza bez opóźnień systemowych. W DOS i Pascalu można użyć wbudowanej komendy port do bezpośredniego odczytu, unikając konieczności programowania w asemblerze. Dodatkowo, w BIOS-ie można regulować opóźnienie powtarzania klawiszy (typematic delay) i częstotliwość powtarzania (typematic rate), choć Windows zwykle zarządza tym samodzielnie. Przykładowy kod w Pascalu pokazuje odczyt skanów klawiszy z portu 0x60 i rozróżnianie naciśnięcia i zwolnienia klawisza (zwolnienie to skan + 128). Problemy z dźwiękami systemowymi i niepełnymi kodami mogą wynikać z braku obsługi bufora klawiszy lub konieczności "zjadania" nadmiarowych sygnałów. Konieczne jest odpowiednie zarządzanie odczytem i buforowaniem kodów, aby uniknąć efektów dźwiękowych i błędów w odczycie.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA