Delphi World - Как анимировать изображение, как пользоваться DXInput
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Как анимировать изображение, как пользоваться DXInput

У компа есть две функции: в него можно играть, также в него можно не играть!

Что ж, продолжаем! На этом уроке вы узнаете много нового - как анимировать изображение, как пользоваться DXInput, сколько способов проверять столкновения и где какие лучше употреблять, как поворачивать картинки на разные углы... Перейдем от слов к делу. Первая тема - как анимировать изображения. Возьмем пример из 3-го урока и анимируем саму летающую тарелку. Раньше спрайт был такой -

Мы сделаем его таким:

Откройте Paint - все анимированные спрайты мы будем собирать именно в нем. Кроме этого, возьмем какой-нибудь редактор посерьезнее, умеющий работать с анимированными gif'ами. Я возьму уже известный вам с прошлых уроков Macromedia Fireworks. После чего делаем так - открываем первый кадр, копируем изображение в буфер, вставляем в новй рисунок в Painte'е. Кстати, размеры рисунка вычисляются так - высота не изменяется, а ширина - ширина анимрованного рисунка х количество кадров. В данном случае формат рисунка - 60х25, в файле 3 кадра. Размер рисунка в Paint'e будет 180х25. Как вы наверное догадались, мы будем создавать этакую киноленту. Спрайт анимированной тарелки в развертке для Delphi будет таким:

Теперь загружаем спрайт в ImageList, и устанавливаем такие свойства:

Раньше мы не трогали PattternWidth и PatternHeight, а теперь установили их в 60 и 25 соответственно. А ведь размеры рисунка 180х25! Дело в том, что эти свойства указывают, какую часть картинки выводить на экран. Будьте очень внимательны, дело в том, что если эти свойства не кратны полным размерам картинки, DelphiX вообще ничего не выведет. Если вы запустите игру теперь, ничего не изменится, анимации не появится, хотя свойства мы и указали. Должен появиться статичный спрайт первого кадра. Просто мы ещё не написали программную часть анимации. Открываем Ttarelka.Create , и дописываем в конец вот такой кусок кода:


AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 2 / 1000;

Разбираем: AnimLooped - переменная, отвечающая за повторение анимации. AnimCount - не знаю, просто надо выучить, без этого анимация не пойдет, AnimSpeed - скорость прокрутки кадров, чем больше первое число, тем быстрее. Запускаем и видим мигающую тарелку!

Что у нас было дальше - работа с DXInput. Работать с этим компонентом оказалось совсем несложно. Для начала стираем такие события, как Form1.OnKeyDown и Form1.OnKeyUp, ставим на форму DXInput, после двойного щелчка по нему выводится такое окно:

Выбираем раздел Keyboard и видим:

Все просто - в прокручивающемся списке - события, а справа - клавиши, при нажатии на которые эти самые событися происходят. Выбираем для Up, Down, Left и Right в Key 1 соответственно те же самые пункты. Теперь переходим в Ttarelka.DoMove и стираем там все, кроме первых 2-х строчек. Потом вставляем такой код:


if (isLeft in Form1.DXInput1.States) then
  x:=x-1;
if (isRight in Form1.DXInput1.States) then
  x:=x+1;
if (isUp in Form1.DXInput1.States) then
  y:=y-3;
if (isRight in Form1.DXInput1.States) then
  y:=y+2;
y:=y-2;

Потом в DXTimer.timer вставляем такую строку:


DXInput1.Update; 

Запускаем и видим то же, что и до DXInput, но насколько легче стало писать управление!

Теперь о проверке столкновений. Проверять столкновения можно двумя способами - по столкновению рамок(прямоугольников) и столкновению точек(пикселов). Помните такую строчку - PixelCheck:=True? Если True - проверка по столкновению точек, если False - по столкновению рамок. Надо сказать, что если сталкиваются два анимированных спрайта, по столкновению точек столкновения может просто не быть!

И напоследок, про разворот спрайтов. Для начала скачайте исходник DXSource.pas, модифицированный Владом Энельгартом - он здесь. Этот файл отличается от оригинального только одной процедурой - Angle. Разберемся же, что это такое и с чем его едят. Теперь у каждого спрайта есть свойство Angle - наклон спрайта в градусах, причем, учитывая двоичную систему счисления, в окружности ровно 256 градусов. Перейдем от слов к делу. Возьмите какой-нибудь спрайт космического корабля или ещё чего-либо, что можно повертеть, я возьму известную вам стрелку навигации по сайту http://instrumentari.narod.ru

Сначала подготовим киноленту:

Потом меняем спрайт в классе Ttarelka на эту самую киноленту и ставим размеры кадра 36х36. Затем убираем гравитацию и добавляем новую переменную speed - она у нас будет отвечать за скорость перемещения, теперь клавиши влево-вправо/вверх-вниз будут отвечать соответственно:

  • Вверх - ускорение
  • Вниз - тормоз
  • Влево - разворот влево
  • Вправо - разворот вправо

Далее снова лезем в Ttarelka.DoMove(думаю, незачем менять названия класса) и(который раз!) трем там все, кроме первых двух строчек. Потом пишем такое:


x:=x+cos256(Angle)*speed;
y:=y+sin256(Angle)*speed;
if (isLeft in Form1.DXInput1.States) then
  angle:=angle-2;
if (isRight in Form1.DXInput1.States) then
  angle:=angle+2;
if (isUp in Form1.DXInput1.States) then
  speed:=5;
if (isDown in Form1.DXInput1.States)and(speed>0) then
  speed:=speed-1;

Первые две строчки - меняются координаты спрайта.А дальше идет просто управление. Урок закончен!

P.S. Как обычно, здесь вы можете скачать готовую программу

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования