скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Как анимировать изображение, как пользоваться 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 градусов. Перейдем от слов к делу. Возьмите какой-нибудь спрайт космического корабля или ещё чего-либо, что можно повертеть :)

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

Потом меняем спрайт в классе 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;

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






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ


|  Детальная информация одеяла купить киев у нас на сайте.  |

Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook