Siudym pisałeś o animacji postaci, więc wnioskuję, że chodzi Ci o skok ludzika. Trochę sam kiedyś kombinowałem i nie do końca mi to wyszło. Skok postaci jak wiadomo składa się z kilku klatek i w każdej klatce zmieniają się współrzędne x i y postaci:
*x jest inkrementowane/dekrementowane (w zależności, w którą stronę skacze postać)
*y jest zmniejszane/zwiększane wykładniczo (odpowiednio jeżeli postać wznosi się/spada) wg. wzoru:
a--; // Zmniejszanie przyśpieszenia przy wznoszeniu postaci
V=V-a; // Zmniejszenie prędkości o wartość aktualnego przyśpieszenia
y=y-V; // Zmniejszenie y (wznoszenie się postaci) o wartość aktualnej prędkości
Przy zwiększaniu y oczywiście znaki we wzorach zamieniamy na +, zatem:
a++; // Zwiększanie przyśpieszenia przy wznoszeniu postaci
V=V+a; // Zwiększanie prędkości o wartość aktualnego przyśpieszenia
y=y+V; // Zmniejszenie y (spadanie postaci) o wartość aktualnej prędkości
Przy tym trzeba utrzymywać znacznik, który określa czy postać jeszcze się wznosi czy już spada.
*Przy wznoszeniu się w górę, w każdej "klatce" skoku zmniejszamy y (bo przesuwamy Sprite'a w górę) o wartość aktualnej prędkości. Prędkość ta jest zmniejszana o wartość aktualnego przyśpieszenia, które z każdą klatką zbliża się do zera. Postać wznosi się coraz wolniej zgodnie z intuicją
*Przy spadaniu, w każdej klatce zwiększamy y o wartość aktualnej prędkości, z kolei prędkość jest zwiększana o wartość aktualnego przyśpieszenia, które rośnie. Postać spada coraz szybciej. Po osiągnięciu pewnej stałej maksymalnej wartości przyśpieszenia, przyśpieszenie te jest zerowane.
Jest to wspomniana przez dr88 krzywa balistyczna.
Współrzędne (x,y) rosną podczas spadania i maleją podczas wznoszenia się co jest niezgodne z intuicją, poza tym początkowe położenie postaci to na pewno nie będzie (0,0), więc warto zatroszczyć się o jakąś warstwę, która najpierw wyliczy logiczne współrzędne (x,y), a następnie przetłumaczy je na fizyczne współrzędne ekranu (nic ponad prostą arytmetykę dodawanie/odejmowanie).
Pozostaje jeszcze problem, którego nie rozwiązałem w swoim programie, jednoczesna obsługa przycisku skoku i kursora co wyglądało, jak wyglądało (nie wiem czy widziałeś ten ROM, był kiedyś na forum, jeżeli nie to mogę go poszukać). Nie wiem czy będzie to jasne, ale mam nadzieję, że tak:
*W każdym NMI wywoływana jest warstwa obsługująca joystick, na podstawie, której przechowujesz dane o tym jakie wystąpiły zdarzenia przysków (tak, aby informacja o ruchu była przechowywana dopiero po sprawdzeniu wszystkich przycisków). Mam tu na mysli takie zdarzenia jak przycisk_wciśnięty, przycisk_puszczony itd.
*Po wykonaniu kodu warstwy joypada NMI przechodzi do procedury, tłumaczącej zdarzenia joypada na zdarzenia postaci (czyli np. skok w prawo), właśnie tu wyliczane są współrzędne logiczne postaci za pomocą powyższych wzorów. Jest to robione dla kolejnej klatki położenia postaci.
*Na koniec wykonywana jest warstwa kodu tłumacząca współrzędne logiczne postaci na fizyczne
Jeszcze 2 uwagi:
*Zastosowanie kodu U2 sprawi, że w przedstawionych na początku wzorach na x,y będziesz tylko dodawał (wartości ujemne lub dodatnie, ale jedynie dodawał)
*Cała ta metoda jest uniwersalna i wg. niej można zrobić właściwie cały kod obsługujący pad (i zdarzenia postaci).
_____________________________________________________________________________________
Co do kodu ładującego NameTable fajny jest "scrolling5.asm" z kursu NESASM (BunnyBoy'a). Jest nieco zawiły i przesiedziałem wiele wieczorów zanim go zrozumiałem, ale ma dużo sensu. Kod NMI wykonuje kilka rzeczy:
*Scrolluje ekran (w każdym NMI o 1 piksel, więc co 8 NMI o szerokość jednego Tilesa)
*Ładuje kolumnę NameTable (Jeżeli licznik "scroll" zawinie się do wartości 0 to NT jest przełączana za pomocą "eor")
*Ładuje następną kolumnę AttributeTable (Jeżeli załadowana została odpowiednia ilość kolumn NameTable odpowiadających szerokości półbajta AttributeTable, a więc szerokość 2 Square'ów, (4 Tilesów))
*Wykonuje Transfer DMA Sprite'ów
*Odpowiednio ustawia rejestry PPU_ADDR (starszą i młodszą część) i PPU_SCROLL (starszą i młodszą część)
*Odpowiednio ustawia rejestry konfiguracyjne
Kod ten znajduje się w zipie pod adresem:
http://www.nespowerpak.com/nesasm/nesasmsrc.zip_____________________________________________________________________________________
Może podane przeze mnie metody nie są proste, ale postanowiłem, że napiszę o tym czego sam uczyłem się metodą prób i błędów. Nie siedzę w żadnych ASM'ach z pół roku, więc przepraszam za wszelkie pomyłki.
_____________________________________________________________________________________
[Edit]: Źródło gry Zooming Secretary napisanej w C na NES:
http://www.tigsource.com/2012/04/22/zooming-secretary/ Pozdrawiam