Як робити анімовані спрайт

Бережи все кадри на одній картинки, а потім зчитує з зміщення. mod div тобі допоможуть.

А ось цікаво, невже все розробники стратегічних ігор анімуйте ігровую- клечатую карту за допомогою таймера і перемальовування всієї карти через n-секунд?

У грі Кіркоп я наприклад на перерисовивал всю карту відразу, а тільки тайли, що потрапляють в область екрану (всю то навіщо).
А ще можна перемальовувати тільки ті частини екрану, на яких в даний момент є рухливі спрайт (це тільки якщо їх взагалі на карті не так багато).
А на рахунок застосування Тімер, так він для того і потрібен, щоб його юзати. Тим більше, що він має підтримку на апаратному рівні.

Таймер - ні, не думаю. Як мінімум, GetTickCount.


> VolanD # XA0; (27.07.04 9:58) [4]

А ти як думаєш. Перемальовується тільки видима частина. Фізика - повністю.
До речі в тривимірних іграх можелі теж анімуються подібним чином - за допомогою декількох заздалегідь завантажених в пам'ять сіток, а ніяк не прорахунком на скільки герой підняв руку або ногу!

Так значет Pattern це номер кадру на склеєних зображенні?

А як отрисовать картинку, скажімо, в другому ряду?

У тебе ж є кількість кадрів в рядку, висота і ширина кадру. Згадай, як розташовуються дані в пам'яті і отримаєш відповідь. Потрібна одна проти формула.
Хоча якщо кадри різної ширини тоді доведеться возитися.

[11] Я тільки почав працювати з DX (до цього тільки на Пасько примітив робив), так що якщо не складно поясни мені ламерку як це зробити.

PH, PW - висота і ширина кожного кадру.

Row - номер ряду по горизонталі (0 - самий верхній)
Col - номер кадру в ряду (0 - самий лівий)

Rect.Top: = PH * Row;
Rect.Left: = PW * Col;
Rect.Bottom: = Rect.Top + PH;
Rect.Right: = Rect.Left + PW;

// тепер Rect вказує на потрібний тобі спрайт

Однак іноді, для оптимізації сурфаси, можна зробити висоту кожного ряду унікальною, для цього створи масив, в якому буде зберігатися висота і початкова лінія кожного ряду, і ширина кадру в ряду. Масив розміром за кількістю рядів.
тоді

type tTable record
# XA0; # XA0; # XA0; # XA0; Start: integer;
# XA0; # XA0; # XA0; # XA0; Wight, Height. byte // Байт, якщо не плануєш спрайт більше ніж 255 * 255

var Table: array [0..n] of tTable # XA0; # XA0;

Rect.Top: = Table [Row] .Start;
Rect.Left: = Table [Row] .Wight * Col;
Rect.Bottom: = Rect.Top + Table [Row] .Height;
Rect.Right: = Rect.Left + Table [Row] .Wight;

Читай, як організовано зберігання бітмапами в пам'яті. Може вже і з'ясував це, але я скажу: лінійно. Тобто ряд за рядом. Тому якщо твій бітмапами в довжину має 100 пікселів, то звернувшись до 101 ти отримаєш 1 піксель в другому ряду. І т.д.

Стоп. Ти під DX, що маєток через DelphiX чи що? Тоді я трохи промахнувся, там на такі речі можна і не морочитися, хоча знати все одно треба. У DelphiX я не помічник.

У DelhiX Спрайт в бітмапи зберігаються взагалі тільки в одному ряду, тому нічого складного.

Усім дуже дякую. Уже організував.
Дійсно, нічого складного. Просто я зберігав анімацію свого персоонажей на одній картинці в 2 ряди:
в 1 герой йде вліво, у 2 - вправо. Ще раз дякую.

Схожі статті