Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как делать анимированные спрайты? [Delphi, Windows]


RyDmi ©   (2004-07-26 21:50:00) 

Я имею ввиду без всяких там TSpriteEngine и пр.?


RyDmi   (2004-07-29 17:46:00) [1]

Всем Большое спасибо. Уже организовал.
Действительно, ничего сложного. Просто я хранил анимацию своего персоонажа на одной картинке в 2 ряда:
в 1 герой идёт влево, во 2 - вправо. Ещё раз спасибо.


Megabyte-CeerCop   (2004-07-29 13:06:00) [2]

В DelhiX Спрайты в Битмапе хранятся вообще только в одном ряду, поэтому ничего сложного.


NikeOLD   (2004-07-29 10:17:00) [3]


> RyDmi ©   (29.07.04 00:54) [12]

Не успел :)

Читай, как организовано хранение битмапов в памяти. Может уже и выяснил это, но я скажу: линейно. Т.е. ряд за рядом. Поэтому если твой битмап в длину имеет 100 пикселей, то обратившись к 101 ты получишь 1 пиксель во втором ряду. И т.д.

Стоп.... Ты под DX,что имешь ввиду DelphiX что ли? Тогда я малость промахнулся, там на такие вещи можно и не заморачиваться, хотя знать все равно надо. В DelphiX я не помощник.


Megabyte-CeerCop   (2004-07-29 06:24:00) [4]

Смотри:

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
       Start :integer;
       Wight,Height : byte //Байт, если не планируеш спрайты больше чем 255*255

var Table :array [0..n] of tTable    

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;


Думаю разберешься


RyDmi   (2004-07-29 00:54:00) [5]

[11] Я только начал работать с DX (до этого только на паське примитив делал), так что если не сложно объясни мне ламерку как это сделать.


NikeOLD   (2004-07-28 19:59:00) [6]

У тебя же есть количество кадров в строке, высота и ширина кадра. Вспомни, как располагаются данные в памяти и получишь ответ. Нужна одна протейшая формула.
Хотя если кадры различной ширины тогда придется возиться.


RyDmi   (2004-07-28 19:40:00) [7]

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


lyeh   (2004-07-28 05:13:00) [8]

2 RyDmi ©

> Так значет Pattern это номер кадра на склееной картинке?

Да :)Его хватит, если тайлы на картинке расположены в один ряд


RyDmi   (2004-07-28 00:24:00) [9]

Так значет Pattern это номер кадра на склееной картинке?


NikeOLD   (2004-07-27 15:41:00) [10]


> VolanD   (27.07.04 09:58) [4]

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


Белый Крыс   (2004-07-27 12:59:00) [11]

Таймер - нет, не думаю. Как минимум, GetTickCount.


Megabyte-CeerCop   (2004-07-27 12:53:00) [12]

В игре Киркоп я например на перерысовывал всю карту сразу, а только тайлы, попадающие в область экрана (всю то зачем).
А ещё можно перерисовывать только те части экрана, на которых в данный момент есть подвижные спрайты (это только если их вообще на карте не так много).
А на счет применения Тимера, так он для того и нужен, чтобы его юзать. Тем более, что он имеет поддержку на аппаратном уровне.


VolanD   (2004-07-27 09:58:00) [13]

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


Evgeniy_K   (2004-07-27 05:43:00) [14]

Храни все кадры на одной картинки, а потом считывай со смещение. mod & div тебе помогут...


RyDmi   (2004-07-27 00:40:00) [15]

1 Не понял вас?!!


kiki   (2004-07-26 22:03:00) [16]

RTFM NOOBISH


Наверх

Титульная страница Поиск, карта сайта Написать письмо