![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как делать анимированные спрайты? [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