[Pascal] wciśniętych kilka klawiszy na raz

0

Wiem, że temat poruszany już setki razy, przeglądałem inne tematy związane z tym zagadnieniem ale jakoś po prostu nie potrafiłem tego wykorzystać :-/

mianowicie chodzi o to aby program wiedział jakie są wciśnięte aktualnie klawisze. Z pojedynczym to nie problem, ale schody zaczynają się, gdy chcę aby program wiedział, iż użytkownik wcisnął 2 klawisze lub więcej, no i oczywiście jakie to są klawisze.
Najprościej by było, gdyby przy wciśnięciu klawisza program zapisywał kod klawisza w tablicy a po jego zwolnieniu usuwał wpis z tablicy, w międzyczasie istnieje możliwość umieszczenia kolejnych wciśniętych klawiszy w innych komórkach tejże tablicy.

Z tego co widziałem na forum zagadnienie podchodzi pod assemblera, którego w ogóle nie znam, więc prosiłbym o gotowy fragment kodu wykonujący powyższe czynności i najlepiej z wymienieniem potrzebnych bibliotek.

BTW to do czego udało mi się obecnie dojść to:

uses crt;

var key:byte;

begin
 clrscr;
 key:=0;
 repeat
  key:=port[$60];
  write(key:5);
 until key=1 {ESC}
end.

gdy uruchamiam program wyświetla mi się 157 teraz np. gdy przytrzymuję 'w' pojawia się 17, gdy go zwalniam mam 145, gdy przytrzymam 'w' i do tego 'e' mam 18, a gdy trzymając nadal 'w' zwolnię 'e' mam 146, po zwolnieniu 'w' znowu mam 145
jeśli nic z powyższego nie zrozumieliście to sami spróbujcie się pobawić w tym kodzie ;)
a więc jak teraz zrobić aby program zapisywał w tablicy wciśnięte klawisze i przetrzymywał je w niej tak długo jak długo są wciśnięte?

0
Gierwazy napisał(a)

gdy uruchamiam program wyświetla mi się 157 teraz np. gdy przytrzymuję 'w' pojawia się 17, gdy go zwalniam mam 145, gdy przytrzymam 'w' i do tego 'e' mam 18, a gdy trzymając nadal 'w' zwolnię 'e' mam 146, po zwolnieniu 'w' znowu mam 145
jeśli nic z powyższego nie zrozumieliście to sami spróbujcie się pobawić w tym kodzie ;)
a więc jak teraz zrobić aby program zapisywał w tablicy wciśnięte klawisze i przetrzymywał je w niej tak długo jak długo są wciśnięte?

Mogę jedynie wyjaśnić dlaczego otrzymujesz takie "dziwaczne" wartości. Jak chcesz odczytać z portu 60h numer wciśniętego klawisza, to musisz wiedzieć, że 7 - najważniejszy bit przechowuje wartość, czy dany klawisz jest wciśnięty (jest to tak jakby zaprzeczona wartość, czyli gdy =0 to jest wciśnięty, =1 to nie jest wciśnięty), a numer danego klawisza to bity 0-6 czyli Port [$60] and 127.

Aha: Co do obsługi kilku klawiszy, to potrzebujesz zmodyfikować przerwanie $9, ale po to by odczytywać czy jakieś klawisze są jednocześnie wciśnięte. Ale jak sprawdzić, ile jest wciśniętych i które to są (wykonując jedno sprawdzenie) to nie wiem.

Pozdrawiam.

0

kurde bo właśnie o to mi chodzi :-/

najprostszy przykład zastosowania - gry ;-) czyli np. gra dla 2 graczy, kiedy to każdy z nich wciska jakiś klawisz odpowiadający ruchowi swojej postaci w jakimś kierunku - w tym wypadku program musi wiedzieć, że są wciśnięte klawisze oraz rozpoznawać jakie to są

0

wielkie dzięki!
tak jak mówiłem, z assemblerem mam niewiele wspólnego więc muszę to dokładnie przeanalizować...

0

Pisałem to tak żeby w ogóle nie było kodu asm, więc nie powinieneś mieć problemów

0

wszystko działa, jeszcze raz dzięki

tylko mam takie małe zastrzeżenie - nie wiem czemu, ale gdy uruchomię aplikację korzystającą z tej biblioteki, z poziomu kompilatora to po powrocie do kompilatora klawisze przestają działać prawidłowo (niektóre nic nie robią, a inne robią rzeczy niezgodne z ich przeznaczeniem) jak coś to używam turbo pascala 7

0

Zapewne uruchamiasz za pomocą kombinacji klawiszy : ctrl+f9
Po prostu w momencie gdy włączasz aplikacje ona wyłącza oryginalną obsługę klawiszy ( przejmuje przerwanie 9h ), przez co informacja o zwolnieniu przycisków zostaje przejęta przez twój program!! a nie jak być powinno przez IDE pascala =] czyli po skończeniu programu pascal myśli że CTRL jest dalej wciśnięty :P stąd to dziwne działanie. Ja po wyjściu z programu po prostu wciskam ctrl i go zwalniam w ten sposób IDE dostaje info o puszczeniu ctrl :P

Ps.
Jeżeli czytałeś tego tutka to da się to jako tako zrozumieć? :P

0

hehe tak mniej więcej ;)

albo inaczej - wiem jak to wykorzystać ^^
kilka rzeczy było niezrozumiałych ale to bardziej z tego powodu, że dopiero zaczynam programować

1 użytkowników online, w tym zalogowanych: 0, gości: 1