Popiol |
Poison Headcrab |
|
|
Dołączył: 02 Lis 2005 |
Posty: 16 |
Przeczytał: 0 tematów
Ostrzeżeń: 0/5
|
Skąd: Wygiełzów |
|
|
|
|
|
|
Czas najwyższy dokończyć omawianie pseudo arkanoida, bo czekają w kolejce ciekawsze zagadnienia. Opowiem jeszcze tylko jak jest robiona animacja i jak są pobierane dane z klawiatury.
Po etykiecie main następuje pętla główna programu. Odpowiada ona pojedynczej klatce animacji. Aby zapanować nad czasem trwania klatki wstawiamy sleepa. Nie jest on tutaj najlepiej zrealizowany, bo zajmuje niepotrzebnie czas procesora, ale raczej nie da się tego lepiej zrobić w programie typu com, bo nie możemy odnosić się do adresów spoza segmentu programu. Jest takie przerwanie, które wywoływane jest 18 razy na sekundę. Ma ono numer 1Ch i nazywa się System Timer Tick. Najlepiej byłoby podpiąć pod to przerwanie swoją funkcję odpowiadającą za animacje. Niestety do tego właśnie jest potrzebna możliwość używania adresów spoza segmentu. Zrobimy sobie to przy innej okazji, tymczasem użyłem prymitywnego sleepa, który wywołuje w pętli przerwanie 1Ch. Zrobiłem tak z nadzieją, że przerwanie to będzie trwało 1/18 sekundy, ale to był błąd rozumowania. To przerwanie standardowo nie robi nic. W każdym razie samo wywołanie przewania zabiera trochę czasu, a wykonane 20000 razy zabiera jeszcze więcej czasu. Dodatkowo piłka jest przesuwana w co drugiej klatce, dzięki czemu rakieta może poruszać się dwa razy szybciej od piłki.
Przy takim sytemie nie możemy wczytywać znaków z klawiatury funkcją, która czeka na naciśnięcie klawisza. Używamy funkcji, która sprawdza czy został naciśnięty klawisz, a jeśli tak to wczytuje. Jest to przerwanie z serii 16h o numerze 01h. Sprawdzenie czy przycisk został naciśnięty wykonujemy instrukcją je etykieta. Polecenie to wykona skok do etykiety jeśli nie można wczytać żadnego znaku. Jeśli znak został wczytany to jego kod jest w rejestrze ax, tzn w al jest kod ascii, ale dopiero razem z rejestrem ah tworzy pełny kod wczytanego znaku (przyciski typu Del, End nie mają kodu ascii). Oczywiście takie wczytywanie danych z klawiatury w przypadku gry jest ułomne. Przydałaby się tablica wciśniętych klawiszy, albo coś w tym stylu. Nie wiem jednak jak to zrealizować.
Tak przy okazji tego sleepa, to jest takie fajne przerwanie, które liczy ilość tyknięć zegara od północy. Tyknięcie jest co 1/18 sekundy. Jeśli dopiszemy po etykiecie main coś takiego:
Kod: | mov ah, 0
int 1Ah
mov ax, 0ffh
and dx, ax
mov punkty, dx
|
to zamiast punktów wyświetlać się będą 3 ostatnie cyfry licznika tykinięć. Przerwanie jest z serii 1Ah o numerze 0. Liczba tyknięć jest zwracana w rejestrach cx (bardziej znaczący bajt) i dx (mniej znaczący bajt). |
|