Image i prosta animacja

0

Witam
Potrzebuje stworzyć prostą animację do gry (coś w stylu pac-man),że np porusza ustami. I teraz pojawia się mój problem. Próbowałem to zrobić wczytując po jakimś danym czasie bmp.

            bmp->LoadFromFile("anim1.bmp");
           Image1->Canvas->Brush->Bitmap = bmp;
Image1->Canvas->Ellipse(0, 0, Shape1->Width, Shape1->Height); // kształt Image

Raz udaje mi się wczytać taki obrazek ale jak próbuje kolejny to dalej wyświetlany jest pierwszy.
Jeżeli ma ktoś jakiś pomysł to będę wdzięczny
Pozdrawiam

0

Lepiej chyba to byloby rozwiazac na zasadzie spritesheet'u. Ze kolejne klatki animacji znajduja sie w tym samym pliku bmp, a Ty co kolejna iteracje w grze, zwiekszasz nr klatki, kopiujac przy tym obrazek znajdujacy sie o "szerokosc" dalej. Lub tez jak wolisz, kolejne obrazki wczytac do tablicy i z kazda iteracja gry, zwiekszac indeks, a po przekroczeniu bariery, wrocic na 0. Bo takie wczytywanie bitmapy w trakcie rozgrywki to nienajlepszy pomysl ;)

0

A możesz w skrócie napisać jak to zrobić? Będę wdzięczny
Pozdro

0

Nie bardzo wiem, jak to uczynic korzystajac z konkretnych metod tego, z czego Ty korzystasz. Takze napisze Ci w DX, zebys zlapal zasade.

Chodzi o to, zeby wczytac obrazek posiadajacy kolejne klatki animacji kolo siebie [najlepiej w jednym rzedzie], o szerokosci, powiedzmy w i wysokosci h. Nastepnie z kazda klatka kopiujemy obrazek znajdujacy sie na nrKlatki*w. To cala filozofia. Mniej wiecej tak to wyglada:

//zakladam ze masz wczytane w DX wszystko co trzeba i kopiujesz do aktualnej powierchni, w glownej petli gry, a klatek jest 25

int nrKlatki = 0;
for(..) {
...
if(nrKlatki++ < 25)
{
Ekran->Blt(0, 0, PowierzchniaZObrazkiem, Rect, DDBLTFAST_WAIT) ;
}
else
nrKlatki = 0;
}

Powyzsza funkcja skopiuje z powierchni "PowierzchniaZObrazkiem" Prostokat o podanych parametrach "Rect" na "Ekran", czekajac na znak, kiedy urzadzenie bedize wolne ( o tym mowi flaga DDBLTFAST_WAIT)

  1. Drugi sposob jest taki aby wczytac kilka obrazkow, albo na poczatku gry podzielic obrazek wczesniejszy te sama metoda i wrzucic kolejene klatki do tablicy. Gyy zrobisz tak, otrzymasz tablice np frames[] o dlugosci 25;

i w glownej petli gry robisz to samo:

//nie nzam konkretnej impelmentacji, zakladam, ze istnieje funkcja Draw(ktora rysuje bitmape na wspolrzednych x, y

int nrKlatki = 0;
if(nrKlatki++ < 25)
Canvas->Draw(0, 0, frames[nrKlatki]);
else
nrKlatki = 0;

Ot i cala filozofia. Jakbys mial dalsze pytania to pisz.

0

Wolał bym po prostu ładować do canvas jakąś bit mape, ale niestety niepotrafie jej skopiować.
Jak ma ktoś jakiś pomysł to proszę pisać

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