Что ж, продолжаем! На этом уроке вы узнаете много нового - как анимировать
изображение, как пользоваться 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 вставляем такую строку:
Запускаем и видим то же, что и до 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;
|
Первые две строчки - меняются координаты спрайта.А дальше идет просто
управление. Урок закончен!
|