1

Chciałem wykorzystać jednego duszka  i wyświetlić na ekranie dwa niezależne od siebie obiekty. Jeden w górnej części ekranu, drugi w dolnej. Obiekty mają poruszać się tylko poziomo. Sprawa wyglądała na prostą, a przynajmniej tak mi się wydawało. Mniej więcej w połowie ekranu wrzuciłem przerwanie DL, które „tnie” duszka na pół i wpisuje nową pozycję poziomą dla obiektu dolnego... W przypadku zastosowania DLI dla kolorów ekranu nie ma problemu. Od linii, w której występuje przerwanie na ekranie jest nowy kolor. Z duszkami to nie działa! Zapisanie rejestru HPOSP0 (poziomo pozycja PLAYER0) w trakcie przerwania zmienia położenie całego duszka na ekranie, a nie tylko części, po której wystąpiło przerwanie. Pomyślałem sobie: no tak, przy kolorach mamy rejestry kolorów i ich cienie, a w PMG tego nie ma (jest?). Jak sobie radzicie w takich sytuacjach? Wymyśliłem, że wrzucę dwa przerwania DLI – jedno tuż przed miejscem, w którym ma się pojawić dolny obiekt, a zaraz po nim drugie DLI, które „przywróci” pozycję poziomą, aby górny obiekt wyświetlany był poprawnie. Kiepsko się to sprawdza, bo przez krótką chwilę widać na ekranie, że górny duszek pojawia się na pozycji poziomej odpowiadającej dolnemu i odwrotnie – dolny czasami pojawi się na pozycji górnego. Jest to tylko chwilka, ale jest i dyskwalifikuje takie rozwiązanie. Przecież w grach stosuje się taką technikę i jakoś nie zauważyłem w nich tego niekorzystnego efektu. Co robię źle?

2

Liczba procedur przerwań == liczba włączeń DLI w Display List? Czy każde odrysowanie ekraniu jest od początku ramki, tzn. czy synchronizujesz się z początkiem rysowania ekranu?

Czy możecie wyjaśnić, Stirlitz, dlaczego wasz służbowy adres stirlitz@rsha.gov.de ma aliasa justas@gru.su?
Nie czytam PM. Proszę używać e-mail.

3

larek napisał/a:

Pomyślałem sobie: no tak, przy kolorach mamy rejestry kolorów i ich cienie, a w PMG tego nie ma (jest?). Jak sobie radzicie w takich sytuacjach?

Domyślam się, że to jakaś gra lub demo. W takich programach radzę wyłączyć systemowe przerwania bo szkoda czasu CPU na obsługę rejestrów cieni.

Wymyśliłem, że wrzucę dwa przerwania DLI – jedno tuż przed miejscem, w którym ma się pojawić dolny obiekt, a zaraz po nim drugie DLI, które „przywróci” pozycję poziomą, aby górny obiekt wyświetlany był poprawnie.

I prawidłowo.

Kiepsko się to sprawdza, bo przez krótką chwilę widać na ekranie, że górny duszek pojawia się na pozycji poziomej odpowiadającej dolnemu i odwrotnie – dolny czasami pojawi się na pozycji górnego. Jest to tylko chwilka, ale jest i dyskwalifikuje takie rozwiązanie.

Zgaduję, że źle rozróżniasz w przerwaniu, dla której linii zostało ono uruchomione. Zmień sobie kolor ramki albo tła zamiast zmieniać pozycję duszka to zobaczysz w którym miejscu ekranu się uruchamia i co wstawia.

Przecież w grach stosuje się taką technikę i jakoś nie zauważyłem w nich tego niekorzystnego efektu. Co robię źle?

Na razie nie wiadomo bo teoretycznie powinno działać.

4

Dzięki za zainteresowanie sprawą. Z przerwaniami, ich liczbą i liniami, w których miały wystąpić - było wszystko ok. Problem rozwiązałem poprzez zmodyfikowanie procedury wyświetlającej pierwszy obiekt na górze ekranu. Oprócz zmiany pozycji x w komórce pamięci zapisuje jednocześnie rejestr HPOSP0 i migotanie zniknęło. Wcześniej procedura zapisywała tylko komórkę w pamięci, a dopiero później podczas przerwania przepisywane to było do rejestru duszka. Tworzyło się opóźnienie w czasie i stąd niepotrzebne mruganie.

Jeszcze raz dziękuję!