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