Бережи все кадри на одній картинки, а потім зчитує з зміщення. 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 - вправо. Ще раз дякую.